#python #python-3.x #pandas #matplotlib
Вопрос:
Я пытаюсь составить круговые диаграммы, где у некоторых клиньев есть штриховка, а у некоторых ее нет, основываясь на их содержании. Данные состоят из вопросов и ответов «да/нет/в процессе», как показано ниже в MWE.
import pandas as pd
import matplotlib.pyplot as plt
raw_data = {'Q1': ['IP', 'IP', 'Y/IP', 'Y', 'IP'],
'Q2': ['Y', 'Y', 'Y', 'Y', 'N/IP'],
'Q3': ['N/A', 'IP', 'Y/IP', 'N', 'N']}
df = pd.DataFrame(raw_data, columns = ['Q1', 'Q2', 'Q3'])
df= df.astype('string')
colors={'Y':'green',
'Y/IP':'greenyellow',
'IP':'orange',
'N/IP':'gold',
'N':'red',
'N/A':'grey'
}
for i in df.columns:
pie = df[i].value_counts().plot.pie(colors=[colors[v] for v in df[i].value_counts().keys()])
fig = pie.get_figure()
fig.savefig("D:/windows/" i "test.png")
fig.clf()
Однако вместо greenyellow
и gold
я пытаюсь сделать клинья зелеными с желтой штриховкой и желтыми с красной штриховкой, вот так (обратите внимание, что изображение ниже не соответствует данным MWE):
Я заглянул в Интернет и знаю, что мне, скорее всего, придется разделить пирог(ы) на отдельные кусочки, но, похоже, это не сработает вместе с подсчетами стоимости панд. Любая помощь будет очень признательна. Спасибо!
Комментарии:
1. Вам абсолютно необходимо использовать piechart pandas? Можете ли вы использовать piechart из модуля matplotlib?
2. @YuliaV Это не обязательно должен быть рисунок панд, это просто казалось самым простым способом создать такой график, который можно было бы масштабировать до наборов данных, значительно превышающих заданный (как в столбцах, так и в строках). Если есть лучший способ сделать это, я буду рад узнать.
Ответ №1:
Этот фрагмент показывает, как добавить штриховку в пользовательских цветах на круговую диаграмму. Вы можете извлечь счет значений Pandas — это будет серия, — а затем использовать его с предоставленным мной фрагментом кода.
Я добавил параметр цвета штриховки в качестве второго параметра в словарь цветов:
import matplotlib.pyplot as plt
colors={'Y' :['green', 'lime'],
'IP': ['orange', 'red'],
'N' : ['red', 'cyan']}
labels=['Y', 'N', 'IP']
wedges, _ = plt.pie(x=[1, 2, 3], labels=labels)
for pie_wedge in wedges:
pie_wedge.set_edgecolor(colors[pie_wedge.get_label()][1])
pie_wedge.set_facecolor(colors[pie_wedge.get_label()][0])
pie_wedge.set_hatch('/')
plt.legend(wedges, labels, loc="best")
plt.show()