You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python绘制分类计数的分组水平条形图,避免条形重叠

实现非重叠分组水平条形图的代码

方法1:直接用pandas绘图(最简便)

先对齐两组计数数据再统一绘制,pandas会自动错开两组条形避免重叠:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'a':[1,2,3,1,2,2,2],
                   'b':[1,1,1,3,2,2,2]})
# 对齐两列的计数结果,某列不存在的取值计数补0,避免位置错位
count_df = pd.DataFrame({
    'a': df['a'].value_counts(),
    'b': df['b'].value_counts()
}).fillna(0)
# 直接绘制分组水平条形图
ax = count_df.plot(kind='barh', color=['skyblue', 'orange'], width=0.7, alpha=0.8)
plt.legend()
plt.show()

原代码出现重叠的原因:两次单独调用plot方法时,两组计数的相同取值会被放在同一y坐标位置,因此会出现重叠。


方法2:用matplotlib原生方法(灵活度更高)

如果需要自定义两组条形的间距、位置,可以手动计算偏移量绘制:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({'a':[1,2,3,1,2,2,2],
                   'b':[1,1,1,3,2,2,2]})
# 按取值排序,保证两组数据y轴位置对应
count_a = df['a'].value_counts().sort_index()
count_b = df['b'].value_counts().sort_index()
y_labels = count_a.index
y = range(len(y_labels))
width = 0.35 # 单组条形的宽度

fig, ax = plt.subplots()
# 第一组条形向左偏移半个宽度
ax.barh([i - width/2 for i in y], count_a, width, color='skyblue', alpha=0.8, label='a')
# 第二组条形向右偏移半个宽度
ax.barh([i + width/2 for i in y], count_b, width, color='orange', alpha=0.8, label='b')
# 设置y轴刻度标签
ax.set_yticks(y, y_labels)
plt.legend()
plt.show()

内容的提问来源于stack exchange,提问作者fredooms

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:09:03