legend的用法
阅读原文时间:2023年08月31日阅读:2

1. 自动检测

设置titlelabel标签,随后使用不带参数的legend函数也会自动显示(但不限于一种方式设置图形的label,只要设置了图形的label,使用legend函数会自动显示图例)

import matplotlib as mlp
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 2, 3], label='y = x')
ax.legend(loc='upper left', fontsize='large', title='linear function')
plt.show()

另一种方式(设置某个对象的label属性,可以是各种对象)

import matplotlib as mlp
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
# 必须得加逗号,不然line就是一个列表了
line, = ax.plot([1, 2, 3], [1, 2, 3])
# 结果是<class 'matplotlib.lines.Line2D'>
print(type(line))
# 设置途中的线条标签
line.set_label('y = x')
ax.legend(loc='upper left', fontsize='large', title='linear function')
plt.show()

  • 特别注意

通过在标签以下划线 - 开头的对象上使用标签,可以从自动图例元素选择中排除特定的图表元素。以下划线开头的字符串是所有图表元素的默认标签,因此如果在没有任何参数的情况下调用Axes.legend且没有手动设置标签,将不会绘制图例。例子如下:

import matplotlib as mlp
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
# 必须得加逗号,不然line就是一个列表了
line, = ax.plot([1, 2, 3], [1, 2, 3])
# 结果是<class 'matplotlib.lines.Line2D'>
print(type(line))
# 设置途中的线条标签
line.set_label('_y = x')
ax.legend(loc='upper left', fontsize='large', title='linear function')
plt.show()

2. 明确列出图例中的图表元素和标签

要完全控制哪些图表元素具有图例条目,可以分别传递一个图表元素的可迭代对象和一个图例标签的可迭代对象,例子如下:

  • 绘制sin,cos,线性函数三条曲线,并以明确列出图例中的图表元素和标签设置图例

    import matplotlib as mlp
    import matplotlib.pyplot as plt
    import numpy as np

    fg, ax = plt.subplots()
    x = np.linspace(0, 10, 10000)
    y = np.sin(x)
    z = np.cos(x)
    w = 0.01 * x

    必须得加逗号,不然line就是一个列表了

    sin_curve, = ax.plot(x, y, color='red', linewidth=2)
    cos_curve, = ax.plot(x, z, color='blue', linewidth=2)
    line, = ax.plot(x, w,color='green', linewidth=2)

    ax.legend([sin_curve, cos_curve, line], ['y = sin(x)', 'z = cos(x)', 'w = 0.01 * x'], title= 'some function')
    plt.show()

另一种方法

import matplotlib as mlp
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
x = np.linspace(0, 10, 10000)
y = np.sin(x)
z = np.cos(x)
w = 0.01 * x
# 必须得加逗号,不然line就是一个列表了
sin_curve, = ax.plot(x, y, color='red', linewidth=2, label = 'sin')
cos_curve, = ax.plot(x, z, color='blue', linewidth=2, label = 'cos')
line, = ax.plot(x, w,color='green', linewidth=2, label = 'line')

ax.legend(handles = [sin_curve, cos_curve, line],  title= 'some function')
plt.show()

3. 容易造成混乱的一种写法

这种调用方式不被推荐,因为绘图元素与标签之间的关系只能通过它们的顺序隐式地确定,很容易混淆。要为一个Axes上的所有图表元素创建图例,请使用一个字符串的可迭代对象,每个字符串对应一个图例项。例如(下面是错误的实例):

import matplotlib as mlp
import matplotlib.pyplot as plt
import numpy as np

fg, ax = plt.subplots()
x = np.linspace(0, 10, 10000)
y = np.sin(x)
z = np.cos(x)
w = 0.01 * x
# 必须得加逗号,不然line就是一个列表了
sin_curve, = ax.plot(x, y, color='red', linewidth=2)
cos_curve, = ax.plot(x, z, color='blue', linewidth=2)
line, = ax.plot(x, w,color='green', linewidth=2)

# # 创建图例,使用字符串对应绘图元素的顺序,一定要对应,否则很容易出错
ax.legend(['sin', 'line', 'cos'],  title= 'some function')
plt.show()

1. 位置设置

图例的位置可以通过 loc 参数进行设置。以下是一些常用的位置选项:

'upper left', 'upper right', 'lower left', 'lower right':将图例放置在对应角落。

'upper center', 'lower center', 'center left', 'center right':将图例放置在对应边的中心。'center':将图例放置在坐标轴中心。'best':在已定义的九个位置中,选择与其他元素重叠最小的位置。注意,对于大量数据的图表,此选项可能会降低绘图速度。

2. 图例盒子定位

除了位置,可以使用 bbox_to_anchor 参数来定位图例。以下是一些常见用法:

使用4元组 (x, y, width, height) 指定图例的盒子位置和大小。

使用2元组 (x, y) 指定图例的角落位置,以 loc 为基准。

3. 列数设置

如果图例中的条目过多,可以通过设置 ncols 参数来控制图例的列数,以便更好地排列条目。

4. 字体和标签颜色

可以使用 prop 参数来设置图例的字体属性。同时,通过 labelcolor 参数,可以调整标签的颜色,使其与线条或标记的颜色匹配。

5. 标记数量和大小

numpoints 参数设置图例中标记的数量。

scatterpoints 参数设置散点图图例中标记的数量。

scatteryoffsets 参数设置散点图标记的垂直偏移。

6. 图例背景和边框

可以通过以下参数设置图例的背景和边框样式:

frameon:是否绘制图例的边框。

fancybox:是否启用圆角边框。

shadow:是否在图例后面绘制阴影。

7. 对齐和标题

alignment:设置图例标题和条目框的对齐方式。

title:设置图例的标题。

8. 图例项顺序和拖动

reverse:设置是否反转图例条目顺序。

draggable:设置是否允许通过鼠标拖动图例。

9. 其他细节参数

此外,还有一些其他参数可以进一步细化图例的外观,如边距、间距以及标记的长度和高度等。具体可以查官方文档:

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html