Создать пирог с помощью matplotlib - PullRequest
0 голосов
/ 12 мая 2018

Здравствуйте, у меня есть этот код с Python:

import matplotlib.pyplot as plt

total_a = 0.004095232
total_b = 0.05075945
total_c = 0.005425
total_d = 0.022948572
total_e = 0.015012

slices = [total_a,total_b,total_c,total_d,total_e]
activities = ['a', 'b', 'c', 'd','e']
cols = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue', 'orangered']
plt.pie(slices,labels=activities,autopct='%1.1f%%',colors=cols,startangle=140,shadow=True)
plt.show()

Но я получаю это, когда выполняю этот код:

Pie

Я не понимаю, почему я не получаю полный пирог? Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Аргумент x для pie(x, ...) расстраивает два случая. Как документация гласит :

Создайте круговую диаграмму из массива x. Дробная площадь каждого клина определяется как x / sum (x). Если сумма (х) <1, то значения х напрямую задают дробную площадь, и массив не будет нормализован. Полученный пирог будет иметь пустой клин размером 1 - сумма (х). </p>

В случае с вопросом, сумма действительно меньше sum(x) < 1. Простой обходной путь может заключаться в умножении входного массива на некоторое большое число или делении его на его сумму.

slices = np.array([total_a,total_b,total_c,total_d,total_e])*100

или

slices = np.array([total_a,total_b,total_c,total_d,total_e])
slices /= slices.sum() 
0 голосов
/ 12 мая 2018

Согласно ответу ImportanceOfBeingErnest, приведенному ниже, с объяснением документации , plt.py принимает входные данные массива и нормализует значения для вас, если сумма элементов больше 1. * 1003. *

Поскольку ваши значения составляют менее 1, массив не нормализуется. Чтобы нормализовать себя, вы должны разделить каждый элемент на наибольшее значение в списке со следующей строкой:

slices = [aSlice/max(slices) for aSlice in slices]

И я бы добавил это в вашу программу здесь:

import matplotlib.pyplot as plt

total_a = 0.004095232
total_b = 0.05075945
total_c = 0.005425
total_d = 0.022948572
total_e = 0.015012


slices = [total_a,total_b,total_c,total_d,total_e]
slices = [aSlice/max(slices) for aSlice in slices]

activities = ['a', 'b', 'c', 'd','e']
cols = ['gold', 'yellowgreen', 'lightcoral', 'lightskyblue', 'orangered']
plt.pie(slices,labels=activities,autopct='%1.1f%%',colors=cols,startangle=140,shadow=True)
plt.show()

Для меня тогда получается такой график:

The properly rendered pie chart

...