如何使用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
相关产品推荐
相关产品推荐

