matplotlib
データフレーム経由
dfから頻度・割合の取得をしてplt.pieに食わせる
頻度・割合の取得
# object型の頻度の取得
print(df["category2"].value_counts(ascending=False, normalize=False))
# ascending ascending True:昇順 / False:降順
# normalize True:割合 / False:頻度
# object型の割合
print(df["category2"].value_counts(ascending=False, normalize=True))
ラベル・値貼り付け→円グラフ
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# ラベル取得
label = df["category2"].value_counts(ascending=False, normalize=False).index
# 値取得(ascendingしたものを渡しておく)
# 頻度で渡しても割合で渡しても、割合表示になる
vals = df["category2"].value_counts(ascending=False, normalize=False).values
# 円グラフ
plt.pie(vals, labels=label,
autopct="%1.1f%%",startangle=90 ,counterclock=False)
# 引数は(値群,labels=ラベル)が基本
# autopctでデータの割合を小数点以下1桁までの表示にする。
# startangle スタート位置
# counterclock=False 時計回り
plt.axis('equal')
plt.show()
1エリアの強調
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# ラベル取得
label = df["category2"].value_counts(ascending=False, normalize=False).index
# 値取得(ascendingしたものを渡しておく)
vals = df["category2"].value_counts(ascending=False, normalize=False).values
# 変更したい扇形のラベル指定
pick_label = "single"
# 塗りたい色
pick_color = "red"
# color_paletteのbinaryは複数の無彩色で構成
# paletteに無彩色をラベルの数だけ用意
palette = sns.color_palette("binary", len(label))
# labelを順々に参照して、pick_labelと同じ時だけ、pick_colorで更新する
for i in range(len(label)):
if label[i] == pick_label:
palette[i] = pick_color
# 円グラフ
plt.pie(vals, labels=label,
autopct="%1.1f%%",startangle=90 ,counterclock=False,
colors=palette)
plt.show()
データフレーム経由せず
dfにlabelとvalueを格納→円グラフ
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# df格納
df = pd.DataFrame({
"label": ["married", "divorced", "single"],
"value": [4343, 831, 2060]})
# dfに入力したvalueが大きい順に並べ直す必要がある場合はsort_valueでascendingしてdfを更新
df = df.sort_values("value", ascending=False)
plt.pie(df["value"], labels=df["label"],
autopct="%1.1f%%",startangle=90, counterclock=False)
plt.show()
# データフレームで頻度を渡しても割合になる仕様であることが分かる
1エリアの強調
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# df格納
df = pd.DataFrame({
"label": ["married", "divorced", "single"],
"value": [4343, 831, 2060]})
# 変更したい扇形のラベル指定
pick_label = "single"
# 塗りたい色
pick_color = "red"
# 特定のラベルに対する色指定を変更する
palette = sns.color_palette("binary", len(df))
for i in df[df.label == pick_label].index.values:
palette[i] = pick_color
plt.pie(df["value"], labels=df["label"],
autopct="%1.1f%%", startangle=90, counterclock=False,
colors=palette)
plt.show()
困りごと
1エリア強調の際に
sort_valuesを組み込むと、塗り分け先がおかしくなる。
divorced を pick_label に指定しているのに、singleがpick
single を pick_label に指定すると、divorcedがpick
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
# データ定義
df = pd.DataFrame({
"label": ["married", "divorced", "single"],
"value": [4343, 831, 2060]})
print("sort前のdf")
print(df)
# dfに入力したものが大きい順に並べ直す必要がある場合はsort_valueでascendingしてdfを更新
df = df.sort_values("value", ascending=False)
print("=====================")
print("sort後のdf")
print(df)
# 変更したい扇形のラベル指定
pick_label = "single"
print("pick_label={}".format(pick_label))
# 塗りたい色
pick_color = "red"
# color_paletteのbinaryは複数の無彩色で構成
# paletteに無彩色をラベルの数だけ用意
palette = sns.color_palette("binary", len(df))
# sortによる通し番号の変更がここでうまく結びついていない模様?
for i in df[df.label == pick_label].index.values:
palette[i] = pick_color
plt.pie(df["value"], labels=df["label"],
autopct="%1.1f%%", startangle=90, counterclock=False,
colors=palette)
plt.show()
sortした後のfor文内でsort後の通し番号に対応できていない可能性...。
plotly
# df経由
import pandas as pd
import plotly.graph_objects as go
# ラベル取得
# 値取得
label = df["category2"].value_counts(ascending=False, normalize=False).index
vals = df["category2"].value_counts(ascending=False, normalize=False).values
fig = go.Figure(data=[go.Pie(labels=label,
values=vals)])
fig.show()
# df経由せず
import pandas as pd
import plotly.graph_objects as go
# df格納
df = pd.DataFrame({
"label": ["married", "single", "divorced"],
"value": [4343, 2060, 831]})
fig = go.Figure(data=[go.Pie(labels=df["label"],
values=df["value"])])
fig.show()
※seabornでは単独で円グラフを作成する機能はない模様