使用matplotlib设置图例符号不透明度?

时间:2012-10-11 21:30:17

标签: python matplotlib

我正在制作一个带有半透明'x'标记(20%alpha)的情节。如何使标记在图例中以100%不透明度显示?

import matplotlib.pyplot as plt
plt.plot_date( x = xaxis, y = yaxis, marker = 'x', color=[1, 0, 0, .2], label='Data Series' )
plt.legend(loc=3, mode="expand", numpoints=1, scatterpoints=1 )

6 个答案:

答案 0 :(得分:7)

跟进宇宙观的回答,为了使图中的“假”线不可见,你可以使用NaN,它们仍然可以用于生成图例条目:

import numpy as np
import matplotlib.pyplot as plt
# Plot data with alpha=0.2
plt.plot((0,1), (0,1), marker = 'x', color=[1, 0, 0, .2])
# Plot non-displayed NaN line for legend, leave alpha at default of 1.0
legend_line_1 = plt.plot( np.NaN, np.NaN, marker = 'x', color=[1, 0, 0], label='Data Series' )
plt.legend()

答案 1 :(得分:4)

如果您希望在图例中包含特定内容,则可以更轻松地使用适当的文本定义放置在图例中的对象。例如:

import matplotlib.pyplot as plt
import pylab

plt.plot_date( x = xaxis, y = yaxis, marker = 'x', color=[1, 0, 0, .2], label='Data Series' )
line1 = pylab.Line2D(range(1),range(1),color='white',marker='x',markersize=10, markerfacecolor="red",alpha=1.0)
line2 = pylab.Line2D(range(10),range(10),marker="_",linewidth=3.0,color="dodgerblue",alpha=1.0)
plt.legend((line1,line2),('Text','Other Text'),numpoints=1,loc=1)

这里,line1定义了一条短的白线(基本上是不可见的),标记“x”为红色和完全不透明度。例如,line2为您提供更长的蓝线,没有可见的标记。通过创建这些“线条”,您可以更轻松地控制图例中的属性。

答案 2 :(得分:1)

我发现.set_alpha()函数适用于许多图例对象,但不幸的是,许多图例对象都有多个部分(例如errorbar()的输出)和{{1} } call只会影响其中一个。

可以使用.set_alpha(),然后遍历部分句柄和.get_legend_handles_labels(),但不幸的是,.set_alpha()似乎无法在句柄列表上工作,因此情节本身将会被影响。我能找到的最好的解决方法是将原始alphas copy.deepcopy()保存到我想要的位置,创建图例,然后将绘图alphas重置回原始值。如果我可以深度复制.set_alpha()(我不需要保存alpha值或重置它们)会更清晰,但我不能在python2.7中这样做(可能这取决于对象是什么)传说)。

handles

答案 3 :(得分:1)

看起来matplotlib在之后绘制了绘图线,它将alpha级别复制到图例。这意味着您可以使用图例中所需的Alpha级别创建绘图线,创建图例以复制该Alpha级别,然后更改绘图线上的Alpha级别。

这是一个完整的例子:

import matplotlib.pyplot as plt

x = (0, 1, 2)
y = (0, 2, 1)
line, = plt.plot(x, y, 'ro', label='label')  # Default alpha is 1.0.
plt.legend()  # Copy alpha to legend.
line.set_alpha(0.2)  # Change alpha for data points.

plt.show()

当我在Python 2.7.15上使用matplotlib 2.2.3运行该图时,该图如下所示:

Example plot

答案 4 :(得分:0)

就我而言,set_alpha(1) 还修改了 edgecolors,这是我不想要的:我有“不可见”的边缘,并且将 alpha 设置为不透明使它们在图例中可见。以下代码段 (OOP) 在不改变边框颜色的情况下改变了人脸的不透明度

leg = ax.legend()
for lh in leg.legendHandles:
    fc_arr = lh.get_fc().copy()
    fc_arr[:, -1] = 1  # set opacity here
    lh.set_fc(fc_arr)

注意对 .copy() 的调用,如果我们不这样做,它将修改整个图的不透明度。调用 copy 意味着我们只修改了图例框内的 facecolor。

或者,您可以将此函数添加到您的库中:

def opaque_legend(ax):
    """
    Calls legend, and sets all the legend colors opacity to 100%.
    Returns the legend handle.
    """
    leg = ax.legend()
    for lh in leg.legendHandles:
        fc_arr = lh.get_fc().copy()
        fc_arr[:, -1] = 1
        lh.set_fc(fc_arr)
    return leg

然后只需将 leg = ax.legend() 替换为 leg = opaque_legend(ax)。希望这会有所帮助!

安德烈斯

答案 5 :(得分:-1)

我找到了另一种方式,而不是弄乱了图例的不透明性。首先,我以我希望图例的样式创建一条情节线。然后,我更改了情节线条样式,并且,奇迹般地,图例样式保持不变。 MWE:

plt.plot(x, y, 'ro', label='label')
for lh in plt.gca().get_legend_handles_labels():
    lh[0].set_alpha(new_alpha)

我想解释一下为什么它起作用,但是我不能。我也不确定它是否适用于所有后端。


是的,我知道这个问题很旧。它仍然会出现在Google中,我会在以后找到它,并帮助我以后的生活。