图例透明度,使用辅助轴时

Posted

技术标签:

【中文标题】图例透明度,使用辅助轴时【英文标题】:Legend transparency, when using secondary axis 【发布时间】:2013-06-17 23:27:52 【问题描述】:

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

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 明确地放置它们有点乏味,并且在缩放绘图时效果不佳。有没有更好的解决方案?

【问题讨论】:

【参考方案1】:

由于 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()

我们将ax1zorder 设置为更高,以便稍后渲染,但如果我们这样做,第二个轴根本不可见,因为它全部绘制在框架下(白色背景和框)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()

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

【讨论】:

谢谢!这已经有很大帮助了。不幸的是,它并没有完全解决我的问题,请参阅我的编辑。 @bzn 由于 mpl 渲染图像的方式(逐层),我认为没有更好的解决方案,底部轴中的任何内容都不能“位于”来自顶轴。您应该提出一个关于放置图例的更好方法的新问题。【参考方案2】:

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

ax1.legend(bbox_to_anchor=(0.16,0.2))
ax2.legend(bbox_to_anchor=(1,0.2))

【讨论】:

以上是关于图例透明度,使用辅助轴时的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB | 怎样拥有精致的圆角半透明图例?

如何知道用户是不是在“设置”->“辅助功能”中禁用了透明度?

Matplotlib配置图例legend()设置透明和并排显示

ggplot 密度图 alpha 未在图例中呈现

三维封闭曲线着色,在图中插入子图,指定显示的图例。

MATLAB | 分段赋色折线图及其图例绘制