Pandas堆叠水平条形图y轴值异常,添加水平线失效求助
Pandas堆叠水平条形图y轴值异常解决办法
先给你说清问题根源:用groupby+unstack处理完数据后,调用plot.barh()时,Pandas默认把DataFrame的**行索引位置(0、1、2...这类整数)**作为水平条形图的y轴坐标,而非你原数据里的'y'列数值。你设axhline(y=400)时看不到线,是因为y轴范围根本没到400;改成500能看见纯粹是巧合(比如你的数据行数刚好接近500)。
下面给你两种实用解决思路:
思路1:让y轴显示'y'列数值,对应位置画水平线
这是最贴合你需求的做法,步骤如下:
- 确保处理后的DataFrame保留原'y'列(或处理时将'y'列设为行索引)
- 绘图时手动指定y轴刻度标签为'y'列的值
- 找到'y'列目标值(比如400)对应的行位置,用该位置绘制水平线
示例代码:
import pandas as pd import matplotlib.pyplot as plt # 假设处理后的DataFrame为df,包含'y'列和需要堆叠的列(如'col1'、'col2') ax = df.plot.barh(y=['col1', 'col2'], stacked=True, figsize=(10,6)) # 将y轴刻度标签替换为原'y'列的值 ax.set_yticks(range(len(df))) ax.set_yticklabels(df['y']) # 定位y=400对应的行位置,绘制红色水平线 target_value = 400 y_position = df[df['y'] == target_value].index[0] ax.axhline(y=y_position, color='red', linestyle='--') plt.show()
思路2:将'y'列设为行索引,直接用索引定位水平线位置
如果处理数据时把'y'列设为行索引,绘图时y轴标签会自动显示这些值,找水平线位置更直接:
# 处理数据时将'y'列设为行索引(假设原数据为raw_df) df = raw_df.groupby(['y', '分组列']).sum().unstack() ax = df.plot.barh(stacked=True, figsize=(10,6)) # 直接通过索引找到目标值的位置 y_position = df.index.get_loc(400) ax.axhline(y=y_position, color='red', linestyle='--') plt.show()
注意:水平条形图的y轴本质是分类轴,不是连续数值轴——你看到的y轴数值只是标签,背后的坐标还是0、1、2这类整数位置。如果非要让y轴为连续数值轴,堆叠条形图可能不适用,得换用其他绘图方式,但一般堆叠水平条形图都是用来展示分类数据的,上面两种思路足够解决你的问题。
内容的提问来源于stack exchange,提问作者aipower
相关产品推荐
相关产品推荐

