Pythonを扱っている際に、matplotlibを使って目的にあった円グラフをわかりやすく作りたいので、
2つの円グラフを縦に並べて任意の色で表示するためのテンプレートを作成してみたました。
2つのDataFrame(df1とdf2)のデータを基に、2つの円グラフを縦に出力する内容です。
▲こちらが今回の記事で紹介するコードによって生成される円グラフです。
▲df1の中身です。
▲df2の中身です。
Pythonコードはこちらです。
import pandas as pd import matplotlib.pyplot as plt data1 = [['storeA', 1500], ['storeB', 1000], ['storeC', 800], ['storeD', 500], ['storeE', 300]] df1 = pd.DataFrame(data1, columns = ['store', 'value']) df1 = df1.sort_values('value', ascending=False) data2 = [['storeA', 50], ['storeB', 40], ['storeC', 10], ['storeD', 5], ['storeE', 15]] df2 = pd.DataFrame(data2, columns = ['store', 'quantity']) df2 = df2.sort_values('quantity', ascending=False) plt.rcParams['font.family'] = "Arial Unicode MS" plt.style.use('ggplot') plt.rcParams.update({'font.size':15}) color_dic = {'storeA':'orangered', 'storeB':'yellowgreen', 'storeC':'pink', 'storeD':'lightskyblue', 'storeE':'lightcyan'} fig = plt.figure(figsize=(9, 6),dpi=100) plt.rcParams['font.family'] = "Arial Unicode MS" ax1 = fig.add_subplot(211) label1=df1.iloc[0:len(df1), 0] y1 = df1.iloc[0:len(df1), 1] col1 = [color_dic[shop_column] for shop_column in df1.iloc[0:len(df1), 0]] ax1.pie(y1, colors=col1, counterclock=False, startangle=90, autopct=lambda p:'{:.1f}%'.format(p) if p>=5 else '', pctdistance=0.7) ax1.legend(label1,fancybox=True,loc='center left',bbox_to_anchor=(0.9,0.5)) ax1.set_title("df1 ratio(value)") ax2 = fig.add_subplot(212) label2=df2.iloc[0:len(df2), 0] y2 = df2.iloc[0:len(df2), 1] col2 = [color_dic[shop_column] for shop_column in df2.iloc[0:len(df2), 0]] ax2.pie(y2, colors=col2, counterclock=False, startangle=90, autopct=lambda p:'{:.1f}%'.format(p) if p>=5 else '', pctdistance=0.7) ax2.legend(label2,fancybox=True,loc='center left',bbox_to_anchor=(0.9,0.5)) ax2.set_title("df2 ratio(quantity)") fig.tight_layout() fig.align_labels([ax1, ax2]) plt.show() fig.savefig('two_pie_charts.png',bbox_inches='tight',pad_inches=0.05)
・data1とdata2を書き換えれば、お好みのグラフを作れるかと思います。
df1 = df1.sort_values('value', ascending=False)
df2 = df2.sort_values('quantity', ascending=False)
▲円グラフは、割合が多い順に表示されるように、並べ替えをしています。
color_dic = {'storeA':'orangered', 'storeB':'yellowgreen', 'storeC':'pink', 'storeD':'lightskyblue', 'storeE':'lightcyan'}
▲df1とdf2の並べ替えたとしても、storeA~storeEが特定の色になるように、storeとcolorの対応関係を辞書型として color_dic
に入れています。
指定する色の参考は、こちらのページから確認できます。
参考 List of named colors — Matplotlib 3.5.1 documentation
col1 = [color_dic[shop_column] for shop_column in df1.iloc[0:len(df1), 0]]
▲ col1
には、並び替えた後のdf1のshop列に対応する色が順番にリストとして入ります。
color_dic['storeA'] >>> 'orangered'
▲(参考) color_dic['storeA']
には、 'orangered'
が入っています。
autopct=lambda p:'{:.1f}%'.format(p) if p>=5 else ''
▲5パーセント未満の項目については円グラフ内にパーセントを表示しないようにしています。
コメント