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

Don*_*cht 38 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 )
Run Code Online (Sandbox Code Playgroud)

小智 42

更新:有一个更简单的方法!首先,在创建变量时将图例分配给变量:

leg = plt.legend()
Run Code Online (Sandbox Code Playgroud)

然后:

for lh in leg.legendHandles: 
    lh._legmarker.set_alpha(1)
Run Code Online (Sandbox Code Playgroud)

要么

for lh in leg.legendHandles: 
    lh.set_alpha(1)
Run Code Online (Sandbox Code Playgroud)

分别使a plt.plot或a的标记透明plt.scatter.

请注意,仅lh.set_alpha(1)使用a plt.plot将使图例中的线条透明而不是标记.您应该能够为其他绘图类型调整这两种可能性.

资料来源:合成一些好的建议DRV约标记尺寸.更新的灵感来自欧文的有用评论.

  • 这是迄今为止我的问题最简单的答案!我将添加两个注释:1)创建图例时,可以通过`leg = plt.legend()`获取图例选项.2)对我来说,我需要`lh.set_alpha(1)`不是`lh._legmarker.set_alpha(1)`(不确定API是否已经改变......) (4认同)
  • 在 Matplotlib 3.7 中,“legendHandles”属性已重命名为“legend_handles”。旧名称将在 3.9 中删除。 (2认同)

小智 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()
Run Code Online (Sandbox Code Playgroud)


Imp*_*est 6

这里的其他答案通过在创建后更改图例中的 alpha 值或在创建图例后更改线条的 alpha 提供了很好的实用解决方案。

以下是在图例中实现不同不透明度而无需进行任何操作的解决方案。它使用一个handler_map和一个更新函数。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(43)
from matplotlib.collections import PathCollection
from matplotlib.legend_handler import HandlerPathCollection, HandlerLine2D


plt.plot(np.linspace(0,1,8), np.random.rand(8), marker="o", markersize=12, label="A line", alpha=0.2)

plt.scatter(np.random.rand(8),np.random.rand(8), s=144,
            c="red", marker=r"$\clubsuit$",  label="A scatter", alpha=0.2)

def update(handle, orig):
    handle.update_from(orig)
    handle.set_alpha(1)

plt.legend(handler_map={PathCollection : HandlerPathCollection(update_func= update),
                        plt.Line2D : HandlerLine2D(update_func = update)})

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


cos*_*sis 5

如果要在图例中包含特定的内容,则使用适当的文本定义放置在图例中的对象会更容易。例如:

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)
Run Code Online (Sandbox Code Playgroud)

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