为 groupby 中的独特结果生成饼图子图?
Produce pie chart subplots for unique results in groupby?
为 Dataframe 中的唯一值生成饼图的最佳方法是什么?
我有一个按县显示服务数量的 DataFrame。我想为每个县制作一组饼图,显示该县的服务数量。我尝试了多种不同的方法,但都没有成功。
这是我的数据
打印(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
然后生成一个空白绘图框
(我还不能嵌入图片所以这里是 link)
Blank Plot Box
理想情况下,我希望它们都是次要情节,但在这个阶段我会采用一系列单独的情节。我发现的其他示例不处理键(县)的唯一值。
使用 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()
使用 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()
使用pandas
最后,可以使用 pandas 在一行中完成所有操作。
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()
这是你想要的吗?
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)
为 Dataframe 中的唯一值生成饼图的最佳方法是什么?
我有一个按县显示服务数量的 DataFrame。我想为每个县制作一组饼图,显示该县的服务数量。我尝试了多种不同的方法,但都没有成功。
这是我的数据
打印(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
然后生成一个空白绘图框
(我还不能嵌入图片所以这里是 link) Blank Plot Box
理想情况下,我希望它们都是次要情节,但在这个阶段我会采用一系列单独的情节。我发现的其他示例不处理键(县)的唯一值。
使用 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()
使用 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()
使用pandas
最后,可以使用 pandas 在一行中完成所有操作。
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()
这是你想要的吗?
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)