关于Matplotlib绘制条形图居中聚集及X轴标签异常的问题咨询
问题根源&快速解决办法
嘿,我一眼就瞅出问题所在了——这根本不是条形图挤在中心的空间适配问题,是你创建的数据框结构完全搞错啦!
你用pd.DataFrame.from_dict([counts])生成的是一个只有1行、9列的数据框,长这样:
set1 set2 set3 set4 set9 set5 set6 set7 set8 0 110 12 661 34 2 7 23 53 65
当你调用df.plot.bar()时,pandas默认是按行来画条形图的——也就是把这一行里的所有列值,全堆到同一个x轴位置(标签是0),所以所有条形都挤成一团,X轴自然只会显示中间那个孤零零的"0"。
正确的处理方式(两种可选)
方式1:转成"长格式"数据框(推荐)
把字典转换成「类别列+数值列」的结构,这样每个类别会对应独立的条形:
import pandas as pd import matplotlib.pyplot as plt counts = {'set1': 110, 'set2': 12, 'set3': 661, 'set4': 34, 'set9': 2, 'set5': 7, 'set6': 23, 'set7': 53, 'set8': 65} # 转换成长格式数据框 df = pd.DataFrame(counts.items(), columns=['分组', '数量']) # 可选:按分组名称排序,让条形顺序更规整 df = df.sort_values('分组') # 绘制条形图,指定x轴为分组列 ax = df.plot.bar(x='分组', y='数量', rot=45) ax.get_legend().remove() # 加上这句,防止x轴标签被图片边缘截断 plt.tight_layout() plt.savefig('counts.png')
方式2:转置宽格式数据框
如果你不想改数据结构,直接把原数据框转置(行和列交换)再画也行:
import pandas as pd import matplotlib.pyplot as plt counts = {'set1': 110, 'set2': 12, 'set3': 661, 'set4': 34, 'set9': 2, 'set5': 7, 'set6': 23, 'set7': 53, 'set8': 65} df = pd.DataFrame.from_dict([counts]) # 转置后绘制,此时列名会变成x轴标签 ax = df.T.plot.bar(rot=45) ax.get_legend().remove() plt.tight_layout() plt.savefig('counts.png')
效果说明
两种方式都会让每个set(set1-set9)对应独立的条形,X轴标签会正常显示每个分组名称,再也不会挤在中心啦。
内容的提问来源于stack exchange,提问作者Slowat_Kela
相关产品推荐
相关产品推荐

