Установите индивидуальную клиновую штриховку для круговой диаграммы панд

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

Результат выглядит так:
введите описание изображения здесь