matplotlib 使用twinx时在图例上绘制数据

xytpbqjk  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(152)

我正在尝试使用Python和Matplotlib来绘制一些不同的数据集。我使用twinx将一个数据集绘制在主轴上,另一个绘制在副轴上。我想为这些数据集提供两个单独的图例。
在我目前的解决方案中,来自次轴的数据被绘制在主轴图例的顶部,而来自主轴的数据没有被绘制在次轴图例上。
我根据下面的示例生成了一个简化版本:http://matplotlib.org/users/legend_guide.html
以下是我到目前为止的情况:

import matplotlib.pyplot as plt
import pylab

fig, ax1 = plt.subplots()
fig.set_size_inches(18/1.5, 10/1.5)
ax2 = ax1.twinx()

ax1.plot([1,2,3], label="Line 1", linestyle='--')
ax2.plot([3,2,1], label="Line 2", linewidth=4)

ax1.legend(loc=2, borderaxespad=1.)
ax2.legend(loc=1, borderaxespad=1.)

pylab.savefig('test.png',bbox_inches='tight', dpi=300, facecolor='w', edgecolor='k')

其结果是以下曲线图:

如图所示,ax2的数据绘制在ax1图例上,我希望图例位于数据的顶部。我错过了什么?

zbwhf8kr

zbwhf8kr1#

技巧是绘制第一个图例,删除它,然后使用add_artist()在第二个轴上重新绘制它:

legend_1 = ax1.legend(loc=2, borderaxespad=1.)
legend_1.remove()
ax2.legend(loc=1, borderaxespad=1.)
ax2.add_artist(legend_1)

向@ImportanceOfBeingErnest致敬:
https://github.com/matplotlib/matplotlib/issues/3706#issuecomment-378407795

toiithl6

toiithl62#

您可以将图例设置行替换为:

ax1.legend(loc=1, borderaxespad=1.).set_zorder(2)
ax2.legend(loc=2, borderaxespad=1.).set_zorder(2)

它应该能起作用。
请注意,位置已更改以对应于线,并且在定义图例后应用.set_zorder()方法。
zorder中的较高整数将被绘制在其上的“较高”层。

相关问题