我正在通过documentation中所述的pandas绘制界面通过第二个y轴绘制pandas数据框,如下所示:
df = pd.DataFrame(np.random.randn(24*3, 3),
index=pd.date_range('1/1/2019', periods=24*3, freq='h'))
df.columns = ['A (left)', 'B (right)', 'C (right)']
ax = df.plot(secondary_y=['B (right)', 'C (right)'], mark_right=False)
ax.set_ylabel('A scale')
ax.right_ax.set_ylabel('BC scale')
ax.legend(loc='upper right')
plt.show()
产生
可以看出,当我使用
ax.legend(loc='upper right')
设置位置时,图例会丢失条目。
有人知道我如何设置图例位置并保留所有条目吗?
谢谢!
答案 0 :(得分:4)
我们可以使用.get_legend_handles_labels()
获得更正确的解决方案:
np.random.seed(42)
df = pd.DataFrame(np.random.randn(24*3, 3),
index=pd.date_range('1/1/2019', periods=24*3, freq='h'))
df.columns = ['A (left)', 'B (right)', 'C (right)']
ax = df.plot(secondary_y=['B (right)', 'C (right)'], mark_right=False)
ax.set_ylabel('A scale')
ax.right_ax.set_ylabel('BC scale')
h1, l1 = ax.get_legend_handles_labels()
h2, l2 = ax.right_ax.get_legend_handles_labels()
ax.legend(h1+h2, l1+l2, loc=1)
我们之所以需要使用该方法,是因为ax
和ax.right_ax
各自都有自己的图例,只需将它们设置在相同的位置即可将它们相互叠加。