円グラフ

# matplotlib

# データフレーム経由
dfから頻度・割合の取得をしてplt.pieに食わせる  

## 頻度・割合の取得

```python
# 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))
```

## ラベル・値貼り付け→円グラフ
```python
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でデータの割合を小数点以下１桁までの表示にする。
# startangle スタート位置
# counterclock=False 時計回り

plt.axis('equal')
plt.show()
```

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/35e31891-ae4c-51cd-a4a6-f0f87c18ebd3.png)

## １エリアの強調
```python

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/04c5460f-7669-bf0b-b902-62b44064bed1.png)

# データフレーム経由せず

## dfにlabelとvalueを格納→円グラフ

```python

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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/01b504af-ea90-db9c-8931-fa5dcfca890d.png)


## １エリアの強調
```python
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

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/f78341e2-c42f-ddea-98d2-edec22ffaa06.png)


sortした後のfor文内でsort後の通し番号に対応できていない可能性...。

# plotly
```python
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/14e45ad8-e488-573f-9b61-030c2103acea.png)

```python
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/02d4ed85-dcc3-fcf7-d291-69f771ba294a.png)


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