如何去除matplotlib绘图中y=0位置出现的多余水平直线?

问题根因
多余水平线是plt.legend()的调用位置错误导致的:
- 你把图例渲染逻辑写在了绘图的for循环内部,第一次进入循环时,还没有执行
plt.plot()生成任何带有效标签的线条对象,此时matplotlib会初始化一个无标签的默认线条锚定在y=0位置。 - 后续循环中反复调用
plt.legend()不会清除这个初始生成的无效线条,该线条因为没有绑定label属性,所以不会出现在图例列表中,就呈现为你看到的“不属于数据集的多余水平线”。 - 循环内反复调用
plt.legend()属于冗余操作,除了引发这类渲染异常,还会不必要地消耗绘图资源。
修复方案
将plt.legend()移动到for循环外部,等所有折线全部绘制完成后,仅调用一次图例渲染即可。修正后的可运行代码如下:
datelist2 = [str(x) for x in datelist] x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in datelist2] plt.figure(figsize=(10,8), dpi=150) ax = plt.gca() ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y')) ax.xaxis.set_major_locator(mdates.DayLocator(interval=5)) for i in range(1, 10): y = pushdf.iloc[:, i] plt.plot(x, y, label=pushdf.columns[i]) # 所有线条绘制完成后统一添加图例 plt.legend(loc='best') plt.xlabel("Date") plt.ylabel("Weight (lb)") plt.title("Push Progression") plt.gcf().autofmt_xdate() plt.show()
补充排查
如果调整位置后依然存在异常线条,检查两个点:
- 确认
pushdf的列索引是否正确,range(1,10)有没有误取到全为0/空值的列,未设置label的列绘制出的线条也不会出现在图例中 - 确认没有在其他代码段提前调用过
plt.axhline(y=0)这类绘制水平参考线的接口
内容的提问来源于stack exchange,提问作者ReDyE
相关产品推荐
相关产品推荐

