0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

円グラフ

Last updated at Posted at 2021-01-05

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()

download.png

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()

download-1.png

データフレーム経由せず

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()

# データフレームで頻度を渡しても割合になる仕様であることが分かる

download-3.png

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()

スクリーンショット 2021-01-06 1.12.38.png

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()

Unknown.png

# 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()

Unknown.png

※seabornでは単独で円グラフを作成する機能はない模様

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?