我正在制作一个带有半透明'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 )
答案 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运行该图时,该图如下所示:
答案 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中,我会在以后找到它,并帮助我以后的生活。