web-dev-qa-db-ja.com

matplotlib円グラフの実際の値を表示する方法(Python)?

CSVファイルから抽出された値を描画する円グラフがあります。現在、値の比率は、「autopct = '%1.1f %%'」と表示されているパーセンテージで表示されています。各スライスのデータセットで表される実際の値を表示する方法はありますか?.

#Pie for Life Expectancy in Boroughs
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt

# show plots inline
%matplotlib inline

# use ggplot style
matplotlib.style.use('ggplot')

#read data
lifeEx = pd.read_csv('LEpie.csv')

#Select columns
df = pd.DataFrame()
df['LB'] = lifeEx[['Regions']]
df['LifeEx'] = lifeEx[['MinLF']]
colorz = ['#B5DF00','#AD1FFF', '#BF1B00','#5FB1FF','#FFC93F']
exploda = (0, 0, 0, 0.1, 0)


#plotting
plt.pie(df['LifeEx'], labels=df['LB'], colors=colorz, autopct='%1.1f%%', explode = exploda, shadow = True,startangle=90)

#labeling
plt.title('Min Life expectancy across London Regions', fontsize=12)
6
AnthonyJ

autopctキーワードの使用

表示されているパーセンテージとすべての実際の値の合計を掛けた値が実際の値でなければならないことがわかっているので、これを関数として定義し、autopctキーワードを使用してこの関数を_plt.pie_に提供できます。

_import matplotlib.pyplot as plt
import numpy

labels = 'Frogs', 'Hogs', 'Dogs'
sizes = numpy.array([5860, 677, 3200])
colors = ['yellowgreen', 'gold', 'lightskyblue']

def absolute_value(val):
    a  = numpy.round(val/100.*sizes.sum(), 0)
    return a

plt.pie(sizes, labels=labels, colors=colors,
        autopct=absolute_value, shadow=True)

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

計算には多少の誤差が含まれるため、注意が必要です。したがって、指定された値は、小数点以下の数桁までしか正確ではありません。

計算された値と入力配列の差を比較することにより、入力配列から元の値を取得しようとする次の関数がもう少し高度な場合があります。この方法には不正確さの問題はありませんが、互いに十分に異なる入力値に依存しています。

_def absolute_value2(val):
    a  = sizes[ numpy.abs(sizes - val/100.*sizes.sum()).argmin() ]
    return a
_

パイ作成後のテキストの変更

もう1つのオプションは、最初に円をパーセント値で描画し、後でそれらを置き換えることです。このため、plt.pie()から返されたautopctラベルを保存し、それらをループして、テキストを元の配列の値で置き換えます。 autopctキーワードが指定されている場合、plt.pie()は3つの引数のみを返し、最後の引数は対象のラベルです。ここで空の文字列に設定します。

_labels = 'Frogs', 'Hogs', 'Dogs'
sizes = numpy.array([5860, 677, 3200])
colors = ['yellowgreen', 'gold', 'lightskyblue']

p, tx, autotexts = plt.pie(sizes, labels=labels, colors=colors,
        autopct="", shadow=True)

for i, a in enumerate(autotexts):
    a.set_text("{}".format(sizes[i]))

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