matplotlib 更改图例框中标记的大小/字母

fae0ux8s  于 2023-04-06  发布在  其他
关注(0)|答案(5)|浏览(181)

放大和设置图例框中标记的alpha值(回到1.0)的最方便方法是什么?我也很喜欢大的彩色框。

import matplotlib.pyplot as plt
import numpy as np

n = 100000
s1 = np.random.normal(0, 0.05, n)
s2 = np.random.normal(0, 0.08, n)
ys = np.linspace(0, 1, n)

plt.plot(s1, ys, ',', label='data1', alpha=0.1)
plt.plot(s2, ys, ',', label='data2', alpha=0.1)
plt.legend(bbox_to_anchor=(1.005, 1), loc=2, borderaxespad=0.)

fruv7luv

fruv7luv1#

对于大小,您可以在调用图例时包含关键字markerscale=##,这将使标记更大(或更小)。

import matplotlib.pyplot as plt 
import numpy as np
fig = plt.figure(1)
fig.clf()

x1,y1 = 4.*randn(10000), randn(10000)
x2,y2 = randn(10000), 4.*randn(10000)
ax = [fig.add_subplot(121+c) for c in range(2)]

ax[0].plot(x1, y1, 'bx',ms=.1,label='blue x')
ax[0].plot(x2, y2, 'r^',ms=.1,label='red ^')
ax[0].legend(loc='best')

ax[1].plot(x1, y1, 'bx',ms=.1,label='blue x')
ax[1].plot(x2, y2, 'r^',ms=.1,label='red ^')
ax[1].legend(loc='best', markerscale=40)

tv6aics1

tv6aics12#

leg = plt.legend()    
for lh in leg.legendHandles: 
    lh.set_alpha(1)

https://izziswift.com/set-legend-symbol-opacity-with-matplotlib/

zzwlnbp8

zzwlnbp83#

我们可以在.legend()中使用handler_map选项来定义一个自定义函数来更新图例中所有Line2D示例的alpha或标记。这种方法的优点是它可以在第一次获得正确的图例标记,之后不需要修改它们,并且修复了原始图例标记有时仍然可以看到的问题。
这个方法使用了matplotlib.legend_handler模块中的HandlerLine2D。我不知道有没有一种方法可以不添加额外的导入来完成这个任务。
一个完整的脚本看起来像这样:

import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
import numpy as np

# Generate data
n = 100000
s1 = np.random.normal(0, 0.05, n)
s2 = np.random.normal(0, 0.08, n)
ys = np.linspace(0, 1, n)

# Create figure and plot the data
fig, ax = plt.subplots()
ax.plot(s1, ys, ',', label='data1', alpha=0.1)
ax.plot(s2, ys, ',', label='data2', alpha=0.1)

def change_alpha(handle, original):
    ''' Change the alpha and marker style of the legend handles '''
    handle.update_from(original)
    handle.set_alpha(1)
    handle.set_marker('.')

# Add the legend, and set the handler map to use the change_alpha function
ax.legend(bbox_to_anchor=(1.005, 1), loc=2, borderaxespad=0.,
          handler_map={plt.Line2D: HandlerLine2D(update_func=change_alpha)})

plt.show()

  • 请注意,下面是我最初的答案。我把它留给后人,因为它可能适用于某些用例,但有一个问题,当你改变alpha和标记时,它实际上会在图例上创建新的示例,并且不会删除旧的示例,所以两者仍然可以看到。我建议在大多数情况下使用上面的方法。*

如果你命名为legend,你就可以遍历其中包含的行。例如:

leg=plt.legend(bbox_to_anchor=(1.005, 1), loc=2, borderaxespad=0.)

for l in leg.get_lines():
    l.set_alpha(1)
    l.set_marker('.')

注意,您还必须再次设置标记。我建议在这里将其设置为.而不是,,以使其更明显

2mbi3lxu

2mbi3lxu4#

对我来说,诀窍是使用正确的属性:

leg = axs.legend()

for l in leg.get_lines():
    l._legmarker.set_markersize(6)
holgip5t

holgip5t5#

另一个选择:而不是改变你的图例的标记,你可以做一个自定义图例(ref the matplotlib legend tutorial

import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import numpy as np

n = 100000
s1 = np.random.normal(0, 0.05, n)
s2 = np.random.normal(0, 0.08, n)
ys = np.linspace(0, 1, n)

plt.plot(s1, ys, ',', label='data1', alpha=0.1)
plt.plot(s2, ys, ',', label='data2', alpha=0.1)

# manually generate legend
handles, labels = plt.axes().get_legend_handles_labels()
patches = [Patch(color=handle.get_color(), label=label) for handle, label in zip(handles, labels)]
plt.legend(handles=patches, bbox_to_anchor=(1.005, 1), loc=2, borderaxespad=0., frameon=False)

相关问题