将图例移至绘图区域外时丢失第二个系列的解决方法
解决Pandas双Y轴绘图移动图例丢失系列项的问题
你遇到的这个情况其实挺典型的——当用Pandas绘制带次Y轴的双系列图表时,直接调用主轴的legend()方法只会处理主轴上的系列,次Y轴的系列不会被包含进去,所以移动图例就会丢失第二个标签。这里有两个简便的解决办法:
方法一:合并两个轴的图例元素
我们可以分别获取主、次Y轴上的线条和标签,合并后再创建完整的图例:
import pandas as pd import numpy as np x = np.arange(0,100,1) y1 = x y2 = x**2 tempDF = pd.DataFrame({'y1': y1, 'y2': y2}, index=x) # 绘制主Y轴系列,获取主轴对象 ax = tempDF.plot(y='y1') # 绘制次Y轴系列,获取次轴对象 ax2 = tempDF.plot(y='y2', ax=ax, secondary_y=True) # 分别获取两个轴的图例线条和标签 lines, labels = ax.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() # 合并后创建图例,指定位置 ax.legend(lines + lines2, labels + labels2, loc=(1.15,.9))
原理很简单:次Y轴的y2系列是属于ax2这个独立的轴对象的,主ax默认不会管它的图例,所以我们需要手动把两个轴的图例元素整合到一起。
方法二:直接用matplotlib的全局legend
如果你导入了matplotlib.pyplot,可以直接调用plt.legend(),它会自动收集当前所有轴上的可见系列,一步到位:
import pandas as pd import numpy as np import matplotlib.pyplot as plt x = np.arange(0,100,1) y1 = x y2 = x**2 tempDF = pd.DataFrame({'y1': y1, 'y2': y2}, index=x) ax = tempDF.plot(y='y1') tempDF.plot(y='y2', ax=ax, secondary_y=True) # 直接创建包含所有系列的图例 plt.legend(loc=(1.15,.9))
这种方法更简洁,适合快速解决问题。
为什么原来的ax.legend()会失效?因为ax是主Y轴的轴对象,它只负责管理自己上面绘制的y1系列,次Y轴的系列属于另一个独立的轴(你也可以通过ax.right_ax访问到它),所以单独调用主轴的legend()只会显示主轴的系列标签。
内容的提问来源于stack exchange,提问作者m.j.har
相关产品推荐
相关产品推荐

