Производить субплоты круговой диаграммы для уникальных результатов в групповом режиме? - PullRequest
0 голосов
/ 12 декабря 2018

Каков наилучший способ создания круговых диаграмм для уникальных значений в Dataframe?

У меня есть DataFrame, который показывает количество услуг по округам.Я хотел бы подготовить группу круговых диаграмм для каждого округа, которая показывает количество услуг в этом округе.Я пробовал множество разных подходов без особого успеха.

Вот мои данные

print (mdfgroup)

    County     Service    ServiceCt
0   Alamance    Literacy          1
1   Alamance   Technical          1
2   Alamance  Vocational          4
3    Chatham    Literacy          3
4    Chatham   Technical          2
5    Chatham  Vocational          1
6     Durham    Literacy          1
7     Durham   Technical          1
8     Durham  Vocational          1
9     Orange    Literacy          1
10      Wake    Literacy          2
11      Wake   Technical          2

Так что для Alamance был бы один график сломтики для грамотности, технические, профессиональные;диаграмма для Chatham, Durham и т. д. Размер среза будет основан на ServiceCt.

Я экспериментировал со многими различными подходами, но я не уверен, что будет наиболее эффективным.Я пытался, но ниже он не разбивает его по округам, и это не приводит к каким-либо графикам.

for i, row in enumerate(mdfgroup.itertuples(),1):
       plt.figure()
       plt.pie(row.ServiceCt,labels=row.Service,
       startangle=90,frame=True, explode=0.2,radius=3)
plt.show()

Это выдает ошибку:

TypeError: len() of unsized object

, а затем выдает пустоеграфическое поле

(я пока не могу встроить изображение, вот ссылка) пустое графическое поле

В идеале я бы хотел, чтобы все они были субплотами, но вна этом этапе я бы взял серию отдельных сюжетов.Другие примеры, которые я нашел, не имеют дело с уникальными значениями для ключа (округ).

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Это то, что вы имели в виду?

Ncounties = len(mdfgroup.County.unique())
fig, axs = plt.subplots(1, Ncounties, figsize=(3*Ncounties,3), subplot_kw={'aspect':'equal'})
for ax,(groupname,subdf) in zip(axs,mdfgroup.groupby('County')):
    ax.pie(subdf.ServiceCt, labels=subdf.Service)
    ax.set_title(groupname)

enter image description here

0 голосов
/ 13 декабря 2018

Использование matplotlib

Обычный подход заключается в итерации по groupby столбца.Здесь столбец для перебора это "Country".Сначала вы можете создать сетку подзаговоров, в которой будет как минимум столько же участков, сколько у вас есть уникальных стран.Затем вы можете выполнять итерации по участкам и группам одновременно.
В конце может быть несколько пустых участков;их можно установить невидимыми.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"Country" : list("AAACCCDDDOWW"),
                   "Service" : list("LTV")*4,
                   "ServiceCt" : list(map(int, "114321111122"))})

cols = 3
g = df.groupby("Country")
rows = int(np.ceil(len(g)/cols))

fig, axes = plt.subplots(ncols=cols, nrows=rows)

for (c, grp), ax in zip(g, axes.flat):
    ax.pie(grp.ServiceCt, labels=grp.Service)
    ax.set_title(c)

if len(g) < cols*rows:    
    for ax in axes.flatten()[len(g):]:
        ax.axis("off")

plt.show()

enter image description here

Использование seaborn

Этот случай на самом деле хорошо подходит для использования с seaborn FacetGrid.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame({"Country" : list("AAACCCDDDOWW"),
                   "Service" : list("LTV")*4,
                   "ServiceCt" : list(map(int, "114321111122"))})

def pie(v, l, color=None):
    plt.pie(v, labels=l.values)
g = sns.FacetGrid(df, col="Country")
g.map(pie, "ServiceCt", "Service" )

plt.show()

enter image description here

Использование панд

Наконец, можно сделать все в одной строке, используя панд.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"Country" : list("AAACCCDDDOWW"),
                   "Service" : list("LTV")*4,
                   "ServiceCt" : list(map(int, "114321111122"))})


df.pivot("Service", "Country", "ServiceCt").plot.pie(subplots=True, legend=False)

plt.show()

enter image description here

...