【그래프 그리기】 복수 계열의 막대 그래프를 matplotlib와 seaborn으로 써 보았다

소개



여러 계열의 막대 그래프 그리기를 matplotlib과 seaborn으로 비교해 보았습니다.

결론부터 말하자면 seaborn은 유용하다는 기사입니다.
  • 환경
  • Windows-10-10.0.18362-SP0
  • Python 3.7.6
  • pip 19.3.1
  • pandas 1.0.3
  • matplotlib 3.1.2
  • seaborn 0.10.0
  • numpy 1.18.1


  • 그릴 그래프



    왼쪽은 matplotlib이고 오른쪽은 seaborn입니다. 그래프만 보는 것과 같습니다만, 이것들을 묘화할 때까지는 seaborn는 편합니다.
    막대의 색은 같은 색을 지정하고 있습니다만, seaborn 쪽이 조금 창백하네요. 이런 것도 어쩌면 설정이 어딘가에 있습니까?


    그리기 흐름



    위의 막대 그래프를 그릴 때까지의 흐름입니다.

    라이브러리 설치


    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    from io import StringIO
    import numpy as np
    
    %matplotlib inline
    

    DataFrame 만들기


    data = ('人数,性別,年齢\n'
           '58,男性,18歳\n'
           '25,男性,19歳\n'
           '42,男性,20歳\n'
           '60,女性,18歳\n'
           '42,女性,19歳\n'
           '70,女性,20歳\n' 
           )
    df = pd.read_csv(StringIO(data), dtype={'人数':'int32'})
    
    print(df)
    




    인원수
    성별
    나이


    58
    남성
    18세

    25
    남성
    19세

    42
    남성
    20세

    60
    여성
    18세

    42
    여성
    19세

    70
    여성
    20세


    그래프 그리기


    plt.rcParams['font.family'] = 'Yu Gothic' #Yu Gothicをデフォルト設定で日本語文字化けを回避
    plt.rcParams['font.size'] = 20 #デフォルトのフォントサイズを設定
    
    fig,ax = plt.subplots(1, 2, figsize=(24,10)) #1行、2列で横24インチ、縦10インチの描画スペースを作成
    
    
    #matplotlibでの棒グラフ描画はdfのデータをちょっと分けます
    labels = list(df['年齢'].unique()) #X軸のラベルに相当する場所をdfからリスト化
    number_male = list(df['人数'].loc[0:2]) #dfの上から3行の人数の数値(男性の数値)をリスト化
    number_female = list(df['人数'].loc[3:5]) #dfの下から3行の人数の数値(女性の数値)をリスト化
    left = np.arange(len(number_male)) #X軸のラベルを貼り付ける座標を指定する用
    print(left) #leftの中身は [0 1 2]
    width = 0.4 #複数系列のグラフの場合はX軸ラベルの座標がleftのみだとずれるので、補正分
    
    
    #matplotlibで棒グラフ
    ax[0].bar(x=left, height=number_male, width=width, align='center', color='royalblue') #男性部分の棒グラフを追加
    ax[0].bar(x=left+width, height=number_female, width=width, align='center', color='tomato') #女性部分の棒グラフを追加
    ax[0].set_xticks(left + width / 2) #18歳、19歳、20歳部分の軸の位置を指定
    ax[0].set_xticklabels(labels=labels) #"18歳、19歳、20歳"を描画するように指定
    ax[0].set_xlabel('年齢') #X軸のラベル
    ax[0].set_ylabel('人数') #Y軸のラベル
    ax[0].legend(list(df['性別'].unique()), title='性別', loc='upper right') #凡例の男性、女性、タイトルを性別、位置を右上へ設定
    ax[0].set_title('matplotlibで棒グラフ', size=30) #タイトルを設定
    
    
    #seabornで棒グラフ
    sns.barplot(data=df, x='年齢', y='人数', hue='性別', ax=ax[1], palette={'男性':'royalblue','女性':'tomato'}) #data=dfと指定して、XとYを設定、hue='性別'とすることで性別別で分けてくれる
    ax[1].legend(loc='upper right', title='性別') #凡例のタイトル、位置を右上へ設定
    ax[1].set_title('seabornで棒グラフ', size=30) #タイトルを設定
    
    
    plt.savefig('グラフを描画してみた.png', bbox_inches='tight', pad_inches=0.3) #描画した画像を保存
    plt.show() #描画
    

    이제 여기 막대 그래프이 그려집니다.



    행 수


    matplotlib
    8

    seaborn
    3


    seaborn 쪽이 보기 때문에 편하게 그릴 수 있습니다! 코드는 범례와 타이틀로 2행이므로, 1행만으로 복수 계열의 막대 그래프를 쓸 수 있군요.

    좋은 웹페이지 즐겨찾기