如何解决地块类别、比例、总数
我正在尝试使用名称、道具、总数在 python 中制作条形图。这个想法是我应该有名字,然后我是否可以显示总流量和男性比例。
我有以下示例数据
NAME prop_male total
GGD 0.254147 727240
CCG 0.216658 323510
PPT 0.265414 251023
MMMA 0.185105 210416
JKK 0.434557 201594
BBD 0.279319 198998
KNL. 0.277761 190246
TSK 0.277653 171030
LIS 0.218444 165168
BRK 0.44755 161124
我试过了,但不知何故我错过了技巧
将熊猫导入为 pd 将 seaborn 导入为 sns
x,y,hue = "name","proportion","total"
(df[x]
.groupby(df[hue])
.value_counts(normalize=True)
.rename(y)
.reset_index()
.pipe((sns.barplot,"data"),x=x,y=y,hue=hue))
有人可以建议/帮助一个有意义的情节,我可以一起显示所有 3 个信息。
提前致谢
解决方法
实现这一目标的各种方法。一种方法是计算男性的数量并将条形图绘制在彼此的顶部:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
df = pd.DataFrame({"name": list("ABC"),"proportion": [0.2,0.7,0.1],"total": [123,321,213]})
df["male"] = df.proportion * df.total
ax = sns.barplot(data=df,x="name",y="total",color="lightblue")
sns.barplot(data=df,y="male",color="blue",ax=ax)
ax.set_ylabel("male/total")
plt.show()
seaborn中的hue
参数通常是long-form data中的一个分类类别。为了说明这个语句,这里有一个示例代码:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
df = pd.DataFrame({"name": list("ABC"),213]})
df["male"] = df.proportion * df.total
#transform the data from wide to long form
df_plot = df.melt(id_vars=["name"],value_vars=["male","total"])
#use the former column names as categories in a barplot
sns.barplot(data=df_plot,y="value",hue="variable")
plt.show()
您也可以决定分别显示百分比和总数:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
df = pd.DataFrame({"name": list("ABC"),213]})
fig,ax1 = plt.subplots()
ax2 = ax1.twinx()
sns.barplot(data=df,color="lightblue",ax=ax1)
sns.lineplot(data=df,y= "proportion",color="black",lw=3,ls="--",ax=ax2)
plt.show()
我有没有提到有不止一种方法?
,绘制这些信息的方法有无数种, 但是,如果您想在条形图(可见的图表)中对其进行汇总,则列的比例是完全不同的。
最好的方法可能是 T 先生建议的,情节看起来非常好(不过我会添加一个图例来解释深蓝色条是男性计数,而浅蓝色是总数)。
为了完整起见,我将报告其他两个选项,它们给出的结果不太容易解释 ():
您可以缩放“总计”列以使其可见, 你可以做一个散点图
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
Name = ['GGD','CCG','PPT','MMMA','JKK','BBD','KNL']
prop_male = [0.254147,0.216658,0.265414,0.185105,0.434557,0.279319,0.277761]
total = [727240,323510,251023,210416,201594,198998,190246]
#Plot as bar
x = np.arange(len(Name)) # the label locations
width = 0.35 # the width of the bars
fig,ax = plt.subplots(1,2,figsize=(20,8))
rects1 = ax[0].bar(x - width/2,[float(i)/1e6 for i in total],width,label=r'Total $\times$ 1e-6 ')
rects2 = ax[0].bar(x + width/2,prop_male,label='Prop_male')
ax[0].set_xticks(x)
ax[0].set_xticklabels(Name,size=15)
ax[0].legend()
ax[0].set_ylabel("Counts [a.u.]",size=15)
#plot as scatter
norm = matplotlib.colors.Normalize(vmin=0,vmax=len(Name))
mapper = matplotlib.cm.ScalarMappable(norm=norm,cmap='viridis')
colors = np.array([(mapper.to_rgba(v)) for v in range(len(Name))])
for x,y,c in zip(prop_male,total,colors):
ax[1].plot(x,'o',color=c,markersize=10,alpha=0.8)
cmap = plt.get_cmap('viridis',len(Name))
sm = plt.cm.ScalarMappable(cmap=cmap,norm=norm)
sm.set_array([])
cbar = plt.colorbar(sm,ticks=np.linspace(0,len(Name),len(Name)))
cbar.ax.set_yticklabels(Name)
cbar.set_label('Name',size=15)
ax[1].set_xlabel("prop_male",size=15)
ax[1].set_ylabel("total",size=15)
剧情应该是这样的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。