Python 如何使用matplotlib在DataFrame中创建数据分组条形图

Python 如何使用matplotlib在DataFrame中创建数据分组条形图,python,python-3.x,pandas,matplotlib,Python,Python 3.x,Pandas,Matplotlib,这是我当前的输出: 现在,我希望在已绘制的条形图旁边显示下一条条形图 我的数据帧有3列:“块”、“簇”和“区” “块”和“簇”包含用于打印的数字,分组基于 关于“地区”中的字符串 如何在现有条形图旁边绘制其他条形图? df=pd.read_csv("main_ds.csv") fig = plt.figure(figsize=(20,8)) ax = fig.add_subplot(111) plt.xticks(rotation=90) bwidth=0.30 indic1

这是我当前的输出: 现在,我希望在已绘制的条形图旁边显示下一条条形图

我的数据帧有3列:“块”、“簇”和“区”

“块”和“簇”包含用于打印的数字,分组基于 关于“地区”中的字符串

如何在现有条形图旁边绘制其他条形图?

df=pd.read_csv("main_ds.csv")
fig = plt.figure(figsize=(20,8))
ax = fig.add_subplot(111)
plt.xticks(rotation=90)
bwidth=0.30
indic1=ax.bar(df["District"],df["Block"], width=bwidth, color='r')
indic2=ax.bar(df["District"],df["Cluster"], width=bwidth, color='b')
ax.autoscale(tight=False)

def autolabel(rects):
    for rect in rects:
        h = rect.get_height()
        ax.text(rect.get_x()+rect.get_width()/2., 1.05*h, '%d'%int(h),
                ha='center', va='top')
autolabel(indic1)
autolabel(indic2)
plt.show()
数据:

地区街区集群村庄学校十年增长率识字率男性识字率女性识字率小学。。。政府学校学校学校政府学校农村学校农村政府学校招生政府学校招生农村学校教师 0迪马普尔53027849423.285.488.182.5147。。。298 196 242 90 33478 57176 21444 18239 3701 3571 基菲尔3394142-58.473.176.570.471。。。118 24 118 24 5947 7123 5947 7123 853 261 2 Kohima 5 5 121 290 22.7 85.6 89.3 81.6 128。。。189 101 157 49 10116 26464 5976 8450 2068 2193 3龙岭2 37 113-30.5 71.1 75.6 65.4 60。。。90 23 90 23 3483 4005 3483 4005 830 293 4星期一5 139 309-3.8 56.6 60.4 52.4 165。。。231 78 219 58 18588 16578 17108 8665 1667 903 5行×26列

尝试更改

indic1=ax.bar(df["District"],df["Block"], width=bwidth, color='r')
indic2=ax.bar(df["District"],df["Cluster"], width=bwidth, color='b')

试用

将熊猫作为pd导入
将numpy作为np导入
从io导入StringIO
起始日期时间导入日期
将matplotlib.pyplot作为plt导入
def添加值标签(最大,间距=5):
对于ax.patches中的rect:
y_值=rect.get_高度()
x_value=rect.get_x()+rect.get_width()/2
空间=间距
#正值的垂直对齐
va=‘底部’
#如果条形图的值为负值:将标签放置在条形图下方
如果y_值<0:
#反转空间以在下方放置标签
空格*=-1
#在顶部垂直对齐标签
va=‘顶级’
#使用Y值作为标签,并设置小数点后一位的数字格式
label=“{.1f}”。格式(y_值)
#创建注释
ax.annotate(
标签,#使用'label'作为标签
(x_值,y_值),#将标签放置在条的末端
xytext=(0,空格),#按`空格'垂直移动标签`
textcoords=“偏移点”,#将'xytext'解释为点中的偏移
ha='center',#水平居中标签
va=va)#垂直对齐标签,不同的方式
#正值和负值。
first3columns=StringIO(““”区块簇
迪马普尔530
基菲尔33
大岛5
龙岭2号
星期一5
""")
df_plot=pd.read_csv(前3列,delim_空格=True)
图,ax=plt.子批次()
#df_plot.set_索引(['District'],inplace=True)
df_plot[['Block','Cluster']].plot.bar(ax=ax,color=['r','b'])
ax.set_xticklabels(df_地块['District'))
添加值标签(ax)
plt.show()

上图是您的目标还是当前输出?如果是目标:现在的结果是什么?Else:您想要堆叠的条形图吗?上图是我当前的输出。我希望第二个条形图堆叠在它旁边……啊,好的,所以分组条形图。另一件事是,请注意,条形图的值并没有很好地位于条形图的顶部。到处都是……你说的“地区”是什么意思。内容仍然是一个数字,但是字符串格式吗?不,它似乎不是堆叠在它旁边,而是堆叠在它上面。你现在看到了什么?请提供一些数据来复制它(print(df.head())。TypeError:不支持的操作数类型例如:“‘str’和‘float’地区街区集群村庄学校十年增长率识字率男女识字率小学……政府学校私人学校政府学校农村私人学校农村政府学校招生私人学校招生政府学校招生农村政府学校教师私人教师0迪马普尔53027849423.285.488.1182.5147…298196 242 90 33478 57176 21444 18239 3701 3571 1基弗3394 142-58.473.176.574 71…118241182459477123594771238532612科希玛5112129022.785.689.389.381.6128…18910115741011626464784502068 3df[“地区”]是一个文本字符串,所以你不能对它进行数学运算,我想…这里,df_plot=pd.DataFrame({'District':[date(2020,8,19),date(2020,8,20),date(2020,8,21),date(2020,8,22)],'Block':[2,15,2,7],'Cluster':[0,2,11,0]})当我从csv文件读取数据时,我可以改为使用df[“District”?@OchenAo你没有提供数据,因此,我自己生成了一些,用我的代码来显示绘图的样子。我的代码逻辑与数据无关。@OchenAo当然可以。您只需将我的
df_plot
定义替换为
df_plot=pd.read_csv(“main_ds.csv”)
。KeyError:“['District']中没有任何一个列”@OchenAo查看我的更新答案。我避免使用
df\u绘图。设置索引(['District'],inplace=True)
indic1=ax.bar(df["District"]-bwidth/2,df["Block"], width=bwidth, color='r')
indic2=ax.bar(df["District"]+bwidth/2,df["Cluster"], width=bwidth, color='b')