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

Pandas直方图secondary_y模式下图例丢失问题求助

解决Pandas双Y轴直方图图例不显示/被遮挡的问题

嗨,这个问题我之前也碰到过!核心原因是当你使用secondary_y=True绘制第二个直方图时,Pandas会自动创建第二个独立的坐标轴对象,而你直接调用plt.legend()只会对当前默认的第一个坐标轴生效,所以第二个系列的图例压根没被添加进去,自然看不到啦。

下面给你两种可行的解决方案,代码直接就能用:

方法1:分别给两个坐标轴设置独立图例

这种方式可以让你灵活控制两个图例的位置,避免互相遮挡:

import matplotlib.pyplot as plt
import pandas as pd

# 构造你的测试数据(和你提供的一致)
data = {
    'hour_read': [16.0,14.0,13.0,14.0,None,13.0,13.0,16.0,14.0,16.0,15.0,16.0,15.0,15.0,15.0],
    'hour_sent': [13]*10 + [15]*5
}
campaign = pd.DataFrame(data)

plt.figure(figsize=(15,8))
plt.xlabel('Email sent vs open hour')

# 绘制第一个直方图,获取对应的坐标轴ax1
ax1 = campaign.hour_read.plot(kind='hist', alpha=0.8, label='Hour Read')
# 绘制第二个直方图,获取第二个坐标轴ax2(secondary_y=True返回的就是这个轴)
ax2 = campaign.hour_sent.plot(kind='hist', alpha=0.8, secondary_y=True, label='Hour Sent')

# 给两个坐标轴分别添加图例,设置不同位置
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')

plt.show()

方法2:合并两个图例到同一个位置

如果你希望两个图例放在一起,更整洁,可以收集两个系列的图例元素,统一创建一个合并的图例:

import matplotlib.pyplot as plt
import pandas as pd

data = {
    'hour_read': [16.0,14.0,13.0,14.0,None,13.0,13.0,16.0,14.0,16.0,15.0,16.0,15.0,15.0,15.0],
    'hour_sent': [13]*10 + [15]*5
}
campaign = pd.DataFrame(data)

plt.figure(figsize=(15,8))
plt.xlabel('Email sent vs open hour')

ax1 = campaign.hour_read.plot(kind='hist', alpha=0.8, label='Hour Read')
ax2 = campaign.hour_sent.plot(kind='hist', alpha=0.8, secondary_y=True, label='Hour Sent')

# 收集两个坐标轴的图例元素
handles1, labels1 = ax1.get_legend_handles_labels()
handles2, labels2 = ax2.get_legend_handles_labels()

# 在第一个坐标轴上创建合并后的图例
ax1.legend(handles1 + handles2, labels1 + labels2, loc='upper right')

plt.show()

为什么之前的方法没用?

你之前尝试ax1.legend(loc=1)和ax2.legend(loc=2)没生效,大概率是因为你没有正确获取到两个坐标轴的对象——直接调用campaign.plot()如果不接收返回值,就没法操作对应的坐标轴实例。只要显式把plot()的返回值赋值给ax1和ax2,再分别调用legend就没问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:07:44