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
相关产品推荐
相关产品推荐

