6.グラフ

9142 ワード

Matplotlib基本グラフィックツール

  • データ分析に関わるデータの種類は多い.
    グラフを使用すると、データの構造とパターンがわかりやすくなります.
  • MatplotlibはPython可視化ツールと呼ばれ、2 D平面図形に関する様々なフォーマットと機能を提供しています.
  • 基本用法
    - matplotlib.「as plt」などのpyplotをインポートし、pltと略称します.

    import matplotlib.pyplot as plt

  • ハングルフォントエラー解決
    -matplotlibでハングルフォントがサポートされていないという問題があります.次のコードを使用して、ハングルフォントのクラックを解決します.
    from matplotlib import font_manager,rc
    font_path = "" 폰트파일 위치
    font_name = font_manager.FontProperties(fname=font_path).get_name()
    rc('font',family=font_name)
  • 1.線図

  • は、連続値の変化およびパターン
  • を決定するのに適している.
    ex)
    import pandas as pd
    import matplotlib.pyplot as plt
    
    
    # 한글 폰트문제 해결 
    from matplotlib import font_manager,rc
    font_path = "" 폰트파일 위치
    font_name = font_manager.FontProperties(fname=font_path).get_name()
    rc('font',family=font_name)
    df = pd.read_excel(path,engine='openpyxl',header=0)
    
    # 누락값(NaN)을 앞데이터로 채움
    df = df.fillna(method='ffill')
    
    # 서울에서 다른 지역으로 이동한 데이터만 추출하여 정리 
    mask = (df['전출지별'] == '서울특별시' ) & (df['전입지별'] != '서울특별시')
    df_seoul = df[mask]
    
    # 전출지별 열 삭제
    df_seoul = df_seoul.drop(['전출지별'],axis=1)
    
    # 전입지별-> 전입지 이름변경
    df.seoul.rename({'전입지별':'전입지'},axis=1,inplace=True)
    
    # 전입지 열을 행인덱스로 변경
    df_seoul.set_index('전입지',inplace=True)
    
    # df_seoul에서 '전입지'가 '경기도'인 행 데이터를 선택하여 sr_one에 저장한다.
    sr_one = df_seoul.loc['경기도']
    
    # x축 = sr_one.index, y축 = sr_one.value 으로 한 그래프를 그린다. 
    plt.plot(sr_one)으로 입력해도 가능.
    
    plt.plot(sr_one.index,sr_one.values)
    
    # 차트 제목 설정
    plt.title('서울->경기 인구이동')
    
    # 축이름추가
    
    plt.xlabel('기간')
    plt.ylabe('이동 인구수')
    
    plt.show()
    実行結果

    2.装飾図形


    0.フレームサイズの設定

  • plt.义齿
  • 1.タイトルの設定

  • plt.title(“title”)
  • 2.軸名の設定

  • plt.xlabel(「x軸名」)
  • plt.ylabel(「y軸名」)
  • 3.凡例設定

  • plt.凡例(ラベル=[「凡例名」]、loc=「best」、font size=凡例サイズ)
    locオプションは、凡例の位置で、デフォルト値は「best」で、「上右」、「下左」などのオプションがあります.
  • 4.ルーラーラベルの設定


  • x軸ルーラーラベル寸法の設定と回転:
    plt.xtics(ルーラーラベルサイズ、回転=垂直)
    回転オプションに数値を入力すると、対応する数値の角度で反時計回りに回転します.

  • y軸ルーラーラベル寸法の設定と回転:
    plt.ytics(ルーラーラベルサイズ、回転=垂直)
    回転オプションに数値を入力すると、対応する数値の角度で反時計回りに回転します.
  • 5.スタイルの書式設定

  • plt.style.use(「フォーマットタイプ」)
    matplotlibスタイルフォーマットのタイプは、次のとおりです.
    「ggplot」、「classic」、「bmh」、「dark background」、「fast」、「grayscale」、「seaborn」など様々なタイプが存在する.
  • 次のコードを使用して、スタイル・フォーマットのオプション・タイプを決定します.
    import matplotlib.pyplot as plt
    
    print(plt.style.available)

    6.x軸、y軸範囲の調整

  • plt.ylim(最高価格、最低価格)
  • plt.xlim(最高価格、最低価格)
  • 7.コメントの設定


    注釈は、
  • 注釈コンテンツ、注釈コンテンツの配置位置、並べ替え方法などを注釈()関数に渡すことができる.
  • さらにarrowpropsオプションを使用すると、テキストではなく矢印が表示されます.
    ex)
    import pandas as pd
    import matplotlib.pyplot as plt
    
    from matplotlib import font_manager, rc
    font_path = r'C:\Users\kjt63\OneDrive\바탕 화면\python\data_analysis\sample\part4\malgun.ttf'
    font_name = font_manager.FontProperties(fname=font_path).get_name()
    rc('font',family=font_name)
    
    df = pd.read_excel(r'C:\Users\kjt63\OneDrive\바탕 화면\python\data_analysis\sample\part4\시도별 전출입 인구수.xlsx',header=0)
    df = df.fillna(method='ffill')
    
    mask = (df.전출지별 == '서울특별시') & (df.전입지별 != '서울특별시')
    
    df_seoul = df[mask]
    df_seoul = df_seoul.drop('전출지별',axis=1)
    df_seoul.rename({'전입지별':'전입지'},axis=1,inplace = True)
    df_seoul.set_index('전입지',inplace=True)
    
    sr_one = df_seoul.loc['경기도']
    
    plt.style.use('ggplot')
    plt.figure(figsize=(14,5))
    plt.xticks(size=10,rotation=90)
    plt.plot(sr_one.index,sr_one.values,marker='o',markersize=10)
    plt.title('서울 to 경기',size=20)
    plt.xlabel('연도')
    plt.ylabel('이동인구수')
    plt.legend(labels=['서울->경기'],loc='best',fontsize=15)
    
    
    # y축 범위 지정 plot.ylim(최소값,최대값)
    plt.ylim(50000,800000)
    
    # 화살표1 주석
    plt.annotate('', # 주석이름
    	    xy=(20,620000), # 화살표의 머리부분(끝점)
    	    xytext=(2,290000), # 화살표의 꼬리부분(시작점)
        	    xycoords='data', # 좌표체계
                arrowprops=dict(arrowstyle='->', color='skyblue', linewidth=5) # 화살표 서식
                )
                
    # 화살표1 주석위에 붙힐 주석
    
    plt.annotate('인구 이동 증가(1970-1995)',
    	xy=(10,550000), # 텍스트 위치 기준점
        	rotation = 25, # 텍스트 회전 각도
            va='baseline', # 텍스트 상하정렬
            ha='center', # 텍스트 좌우정렬
            fontsize=15 # 텍스트 크기설정 
            )
            
            
    
    # 화살표2
    plt.annotate('', # 주석이름
    	    xy=(47,450000), # 화살표의 머리부분(끝점)
    	    xytext=(30,580000), # 화살표의 꼬리부분(시작점)
        	    xycoords='data', # 좌표체계
                arrowprops=dict(arrowstyle='->', color='olive', linewidth=5) # 화살표 서식
                )
                
    # 화살표2 주석위에 붙힐 주석
    
    plt.annotate('인구 이동 감소(1995-2017)',
    	xy=(40,560000), # 텍스트 위치 기준점
        	rotation = -11, # 텍스트 회전 각도
            va='baseline', # 텍스트 상하정렬
            ha='center', # 텍스트 좌우정렬
            fontsize=15, # 텍스트 크기설정 
            )
    
    plt.show()

    実行結果



    3.画面を分割して複数の図形を描画する-axeオブジェクトを利用する

  • 画面を複数の画面に分割し、分割した各画面に異なる図形を描画する方法である.
  • Step 1. figure()関数を使用してグラフィックを描画するフレームを作成するには
    Step 2. figsizeオプションを使用してフレームサイズを設定する
  • fig = plt.図(figsize=(横サイズ、縦サイズ)
  • Step 3. add subflot()メソッドを使用して、図オブジェクトを分割します.
  • ax 1=fig.addサブチャート(行番号、列サイズ、サブ印刷順序)
    ax 2=fig.add subplot(行番号、列サイズ、サブ印刷順序)
    ax 1,ax 2はfigというフレーム内の各グラフィックオブジェクトとなる.
  • Step 4. axeオブジェクトにplot()メソッドを適用してグラフィックを出力します.
    
    # marker옵션으로 'o'를 사용하지않고 그냥 'o'로 적용하면 점그래프가된다.
    ax1.plot(sr_one,'o',markersize=10)
    
    ax2.plot(sr_one,marker='o',markerfacecolor='green',markersize=10, color='olive',linewidth=2,label='서울->경기')
    ax2.legend(loc='best')
    
    + 하나의 그림틀 내부에 존재하는 그래프객체를 꾸밀때에는
    
    set_title,
    set_xlabel,set_ylabel
    set_ylim, set_xlim,
    set_xticklabels(눈금라벨설정),tick_params(눈금라벨크기),
    legend(범례) 메소드를 사용한다.
    
  • 線グラフィック装飾オプション

  • 「o」:点グラフ

  • marker=「o」:タグ形状(ex:「+」、「*」、「.」、「o」)

  • markerfacecolor="green":背景色をマーク

  • color="olive":線の色

  • linewidth=2:線幅

  • Label:凡例設定
    legentメソッドを使用して設定することもできます.
  • 4.分割画面の例

  • ソウル->忠南、慶尚北道、江原道、全南の人口移転図
  • import pandas as pd
    import matplotlib.pyplot as plt
    
    from matplotlib import font_manager, rc
    font_path = r'C:\Users\kjt63\OneDrive\바탕 화면\python\data_analysis\sample\part4\malgun.ttf'   #폰트파일의 위치
    font_name = font_manager.FontProperties(fname=font_path).get_name()
    rc('font', family=font_name)
    
    df = pd.read_excel(r'C:\Users\kjt63\OneDrive\바탕 화면\python\data_analysis\sample\part4\시도별 전출입 인구수.xlsx',engine='openpyxl',header=0)
    df = df.fillna(method='ffill')
    
    mask = (df.전출지별 =='서울특별시') & (df.전입지별 != '서울특별시')
    
    df_seoul = df[mask]
    
    df_seoul = df_seoul.drop('전출지별',axis=1)
    
    df_seoul.rename({'전입지별':'전입지'},axis=1,inplace=True)
    
    df_seoul.set_index('전입지',inplace=True)
    
    col_years = list(map(str,range(1970,2018)))
    
    df_4 = df_seoul.loc[['충청남도','경상북도','강원도','전라남도'], col_years]
    
    plt.style.use('ggplot')
    
    fig = plt.figure(figsize=(20,10))
    
    ax1 = fig.add_subplot(2,2,1)
    ax2 = fig.add_subplot(2,2,2)
    ax3 = fig.add_subplot(2,2,3)
    ax4 = fig.add_subplot(2,2,4)
    
    ax1.plot(col_years, df_4.loc['충청남도',:],marker='o',markerfacecolor='green',
            markersize=10,color='olive',lw=2,label='서울->충남')
    ax2.plot(col_years, df_4.loc['경상북도',:],marker='o',markerfacecolor='blue',
            markersize=10,color='skyblue',lw=2,label='서울->충남')
    ax3.plot(col_years, df_4.loc['강원도',:],marker='o',markerfacecolor='red',
            markersize=10,color='magenta',lw=2,label='서울->강원')
    ax4.plot(col_years, df_4.loc['전라남도',:],marker='o',markerfacecolor='orange',
            markersize=10,color='yellow',lw=2,label='서울->전남')
    
    
    ax1.legend(loc='best')
    ax2.legend(loc='best')
    ax3.legend(loc='best')
    ax4.legend(loc='best')
    
    
    ax1.set_title('서울->충남 인구이동')
    ax2.set_title('서울->경북 인구이동')
    ax3.set_title('서울->강원 인구이동')
    ax4.set_title('서울->전남 인구이동')
    
    ax1.set_xticklabels(col_years,rotation=90,size=5)
    ax2.set_xticklabels(col_years,rotation=90,size=5)
    ax3.set_xticklabels(col_years,rotation=90,size=5)
    ax4.set_xticklabels(col_years,rotation=90,size=5)
    
    plt.show()
    
    実行結果