7

辅助轴图的图例以某种方式对另一个轴的图是透明的。重现问题的最小示例:

import matplotlib.pyplot as plt

ax1 = plt.subplot(111)
ax2 = ax1.twinx()
ax2.plot([1, 2, 3], [0.3, 0.2, 0.1], 'r')  
ax1.plot([1, 2, 3], [1, 2, 3], 'b', label='ax1')
ax1.legend(loc=2)
plt.show()

我得到的输出是: 错误的情节

如您所见,蓝色情节的图例被红色情节透支。重新排列绘图命令、更改 alpha 值或更改对象的 z 顺序都无济于事。

有什么方法可以让传说对所有情节都不透明?

编辑:@ tcaswell:虽然您的答案适用于单个图例,但如果两个轴都有单独的图例,则它不起作用。在以下代码中,我添加了一个标签ax2

import matplotlib.pyplot as plt
plt.figure()
ax1 = plt.subplot(111)
ax2 = ax1.twinx()
ax2.plot([1, 2, 3], [0.3, 0.2, 0.1], 'r', label='ax2')  
ax1.plot([1, 2, 3], [1, 2, 3], 'b', label='ax1')
ax1.legend(loc=2)
ax2.legend(loc=1)

ax1.set_zorder(1) # make it on top
ax1.set_frame_on(False) # make it transparent
ax2.set_frame_on(True) # make sure there is any background

plt.show()

结果如下:

有两个传说的错误情节

虽然您更通用的方法解决了这个问题,但Figure.legend不幸的是,使用会将图例放在情节之外。明确地放置它们loc有点乏味,并且在缩放绘图时效果不佳。有更好的解决方案吗?

4

2 回答 2

9

由于 matplotlib 呈现绘图的方式,您遇到了问题。默认情况下,第二个轴在第一个轴之后zorder呈现(它们具有相同的因此它们按照添加的顺序呈现)。

为了得到你想要的,你只需要调整你的轴的一些东西:

figure()
ax1 = plt.subplot(111)
ax2 = ax1.twinx()
ax2.plot([1, 2, 3], [0.3, 0.2, 0.1], 'r')  
ax1.plot([1, 2, 3], [1, 2, 3], 'b', label='ax1')
ax1.legend(loc=2)

ax1.set_zorder(1) # make it on top
ax1.set_frame_on(False) # make it transparent
ax2.set_frame_on(True) # make sure there is any background

plt.show()

我们将zorderof设置ax1为更高,以便稍后渲染它,但如果我们这样做,第二个轴根本不可见,因为它全部绘制在 的框架(白色背景和框)下ax1。为了解决这个问题,我们关闭了框架ax1(所以我们可以看到ax2)。但是,现在我们根本没有背景或边界框。然后我们可以重新打开框架ax2,这给了我们想要的效果。

上面的方法是临时的而不是通用的,如果你想确保你的轴高于所有轴,你需要使用Figure.ledgend(),这是一个figure,而不是axes特性。目前,它不会自动找到您的标签,因此您必须明确传递句柄和标签:

fig = figure()

ax1 = plt.subplot(111)
ax2 = ax1.twinx()

ln2, = ax2.plot([1, 2, 3], [0.3, 0.2, 0.1], 'r', label='ax2')  
ln1, = ax1.plot([1, 2, 3], [1, 2, 3], 'b', label='ax1')

interesting_lines = [ln1, ln2]

fig.legend(*zip(*[(il, il.get_label()) for il in interesting_lines]), loc=2)

plt.show()

请注意,此图例现在使用图形坐标放置。

于 2013-06-18T01:11:07.523 回答
0

我使用 bbox_to_anchor 设置两个图例的位置,它们出现在顶部。不知道为什么,但它奏效了。例如:

ax1.legend(bbox_to_anchor=(0.16,0.2))
ax2.legend(bbox_to_anchor=(1,0.2))
于 2016-09-12T00:03:17.430 回答