Pythonを使った円グラフの作成 実践編その2 入門講座 07_02

Python
この記事は約8分で読めます。

【実践】Pythonを使った円グラフの作成方法

前回作成した円グラフを少し変更します。

前回の記事はこちら

各項目名をlegendで表記しなおします。

value = df_sum['売上金額']
label = df_sum.index

plt.pie(x=value)
plt.legend(label)
plt.show()


凡例をまとめて表記できましたが、
グラフとすこし重なっているので、すこし位置をずらします。

bbox to anchorで凡例の位置を指定することができます。
凡例を円グラフの左上に表示させたい場合は、(0,1)、右上に表示させたい場合は(1,1)のようにx,yの順に座標軸で指定することができます。
今回は右上を指す(1,1)とします。
凡例のどの位置をこの座標に合わせるかを指定します。
例えば、centerとすれば凡例の中心位置を座標に合わせたり、lower rightとすれば凡例の右下を合わせることができます。
では、upper leftとして、凡例の左上を座標(1,1)に合わせる指定をしてみます。

plt.pie(x=value, autopct='%1.1f%%')
plt.legend(label, bbox_to_anchor=(1,1), loc='upper left')
plt.show()

matplotlibで円グラフを作成すると、
デフォルトでは時計の3時の位置から反時計回りで表示されます。
これを、12時の位置から時計回りで表示させてみます。

開始位置を調整するにはstartangleに値を代入します。
pie()の中に、startangle=90と記述することで、スタートが12時の位置になります。
また、counterclock=Falseとすることで、時計回りでグラフを表示させることができます。

グラフにタイトルも記述します。

plt.pie(x=value, autopct='%1.1f%%', startangle=90, counterclock=False)
plt.legend(label, bbox_to_anchor=(1,1), loc='upper left')
plt.title('商品分類別売上シェア', fontsize=15)
plt.show()

グラフの色を変更します
データ分の色を配列で設定するのではなく、
matplotlibに用意されているカラーマップを使って色を変更します。

まず、numpyをインポートします。
つぎに、cmapという変数に指定したいカラーマップを代入します。
円グラフでは、これら(colormaps_reference.png)のカラーマップを指定できるので、お好きな色を試してみてください。
今回は、pairedを指定してみます。
続いて、グラフの要素は3つあるので、
numpyのarange関数を使って5つ分の色を生成し、colorという変数に代入しておきます。

pie()の中に、引数colorsを記述しイコール、先ほど設定したcolorを渡します。
実行します。

import numpy as np

cmap = plt.get_cmap("Paired")
color = cmap(np.arange(3))

plt.pie(x=value, autopct='%1.1f%%', startangle=90, counterclock=False,
        colors=color)
plt.legend(label, bbox_to_anchor=(1,1), loc='upper left')
plt.title('商品分類別売上シェア', fontsize=15)
plt.show()

ドーナツ型円グラフ

ドーナツ形のグラフを作成します。
matplotlibでは、後から描いた記述が上書きされます。
なので、先ほど作成した円グラフに背景と同じ色の円を重ねることで、
ドーナツ型の円グラフを作成できます。

まず、引数pctdistanceでパーセンテージの表示位置を調整しておきます。
円の中心が0、円周が1です。
従って0.75の位置に指定してみます。
plot.pie()の中に100%の白い円を作成する記述をします。
100%の円を描くために、角括弧の中に100と指定をします。
円を背景と同じ白塗りにするために、colorsにはwhiteを指定します。
radiusで円の大きさを指定できます。
今回は0.5とします。

cmap = plt.get_cmap("Paired")
color = cmap(np.arange(3))

plt.pie(x=value, autopct='%1.1f%%', startangle=90, counterclock=False, colors=color, pctdistance=0.75)
plt.pie([100], colors='white', radius=0.5)
plt.legend(label, bbox_to_anchor=(1,1), loc='upper left')
plt.title('商品分類別売上シェア', fontsize=15)
plt.show()

二重ドーナツ

ドーナツグラフを2つ重ねて、合計と内訳を表示するグラフを作成してみましょう。
商品分類別の売上の内訳として、商品名を追加してみましょう。
商品分類と商品名で集計したデータを、df_sum2という変数に代入します。

df_sum2 = df[['商品分類', '商品名', '売上金額']].groupby(['商品分類', '商品名']).sum()
df_sum2


グラフの色の指定をします。
カラーサンプルから2つ選択し、それぞれ変数に代入します。
商品名別の集計したデータを変数value2、label2に代入します。
先ほど集計したdf_sum2はインデックスが2列の
マルチインデックスのデータフレームでした。
インデックス名として商品名を取得したいので、このように記述します。

1つ目のグラフを描きます。
ここはこれまでと同様に、商品分類別の売上金額のグラフを作成する記述です。
グラフの色は、今設定したcolor1を指定しましょう。
次に、2つ目のグラフとして、商品別の売上金額のグラフを作成します。
要素の値にはvalue2を指定し、ラベルにはlabel2を指定します。
スタートの位置とデータを時計回りにする記述は同じです。
グラフの色にはcolor2を指定します。
そして、引数レィディアスで、1つ目のグラフより半径を小さく指定します。
ここでは0.8としましょう。
ラベルの位置を引数labeldistanceで0.6と指定します。
この数値は、円の中心が0、円周が1です。
最後に、ドーナツの真ん中の白い円を記述します。
半径は先ほどと同様に0.5としましょう。

cmap1 = plt.get_cmap("tab10")
cmap2 = plt.get_cmap("tab20c")
color1 = cmap1(np.arange(3))
color2 = cmap2([0,1,4,5,8,9,10])
# 商品名別
value2 = df_sum2['売上金額']
label2 = labels=df_sum2.index.get_level_values('商品名')

# 1つ目のグラフ
plt.pie(x=value, labels=label, startangle=90, counterclock=False, colors=color1)
# 2つ目のグラフ
plt.pie(x=value2, labels=label2, startangle=90, counterclock=False, colors=color2,
        radius=0.8, labeldistance=0.6)
# 中心の白い円のグラフ
plt.pie([100], colors='white', radius=0.5)

plt.show()

今回もkinocodeさんの動画で勉強させていただきました。
ありがとうございました!

コメント

タイトルとURLをコピーしました