matplotlib6 -- 添加 图例 legend

本文介绍了matplotlib库中创建和管理图例的方法,包括通过label参数设置图例内容,使用legend函数控制图例位置,创建特殊artists以添加到图例中,以及在同一Axes上添加多个图例的技巧。详细讲解了图例的四个核心术语:图例条目、图例键、图例标签和图例句柄,并提供了示例代码展示如何操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一下比较简单的legend:

  1. 在plot()函数中使用label关键字参数指明图例的文字内容
  2. axes.legend()函数说明图例的位置等相关属性,
fig = plt.figure(1)
ax = plt.subplot(111)
ax.plot(x, cosx, 'r',label='y=cos(x)')
ax.plot(x, sinx, 'c',label='y=sin(x)')
ax.legend()
plt.show()

在这里插入图片描述

legend最常用的参数loc,默认: 对于Axes, ‘best’, 对于Figure, 'upper right'
在这里插入图片描述

fig = plt.figure(1)
ax = plt.subplot(111)
ax.plot(x, cosx, 'r',label='y=cos(x)')
ax.plot(x, sinx, 'c',label='y=sin(x)')
ax.legend(loc=1)
plt.show()

在这里插入图片描述
参考文档:
Legned guide
Legend API
axes.legend()

主要讲解一下Legend guide:

legend主要涉及一下四个术语:
在这里插入图片描述

  • legend entry: 图例条目, 一个图例由一个或多个条目组成,而每个条目由键和值(标签组成)
  • legend key:图例键, 每个图例标签左边的颜色或图案标记
  • legend label:图例标签, 每个图例键右边的文字描述
  • legend handle:图例句柄, 用于在图例中生成合适的图例条目的原始对象

直接调用legend(),不传入任何参数,将会自动获取图例句柄和与之相对应的图例标签,与下列函数等效:

handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels)

函数get_legend_handles_labels()返回handles/artists的列表的元组(handles, labels),

fig = plt.figure(1)
ax = plt.subplot(111)
ax.plot(x, cosx, 'r',label='y=cos(x)')
ax.plot(x, sinx, 'c',label='y=sin(x)')
ax.legend(loc='upper left')
handles, labels = ax.get_legend_handles_labels()

print(ax.get_legend_handles_labels())
plt.show()

在这里插入图片描述

但是注意的是并非所有的artists都可以直接添加到图例中,此时需要创建’proxy’, see Creating artists specifically for adding to the legend (aka. Proxy artists)

想要完全控制添加到图例中的内容,通常传递将句柄handles作为参数传递给legend()

fig = plt.figure(1)
ax = plt.subplot(111)
line1, = ax.plot(x, cosx, 'r',label='y=cos(x)')
line2, = ax.plot(x, sinx, 'c',label='y=sin(x)')
# 此时是一个Line2D对象,包含各种属性, color, label等
ax.legend(handles=[line1, line2])



plt.show()

在这里插入图片描述

有时, 不好直接设置图例的标签,也可以通过参数传递给legend()

fig = plt.figure(1)
ax = plt.subplot(111)
line1, line2 = ax.plot(x, cosx, 'r', x, sinx, 'c')
ax.legend([line1, line2], ['y=cos(x)', 'y=sin(x)'])
plt.show()

在这里插入图片描述

创建特殊的artists,添加到图例中。

并不是所有的handles都能自动转化为图例,经常需要创建artist,使用在Axes或Figure上不存在的句柄。

假设我们要创建一个图例,该图例的legend key为黄色的颜色块,而此对象并不存在与Axes上。

import matplotlib.patches as mpatches
fig = plt.figure(1)
ax = plt.subplot(111)
red_patch = mpatches.Patch(color='yellow', label='The yellow data')

ax.legend(handles=[red_patch])
plt.show()

在这里插入图片描述

当然还有很多其他的图例,比如创建line with dot

import matplotlib.lines as mlines
fig = plt.figure(1)
ax = plt.subplot(111)
cyan_line = mlines.Line2D([], [], color='c', marker='o',
                          markersize=15, label='Cyan dot')
plt.legend(handles=[cyan_line])


plt.show()

在这里插入图片描述

Legend location

可以使用legend()函数参数loc指定位置。

也可以通过bbox_to_anchorbbox_transform来指定准确的位置

  • bbox_to_anchoe: (0,0)左下角, (1,1)右上角
  • bbox_transform: 默认是Axes,plt.gcf().transFigure使用Figure
    比如讲图标放在Figure的右下角
fig = plt.figure(1)
axes0 = plt.subplot(211)
axes0.plot(x, cosx, 'k',linewidth=1, label='y=cos(x)')
axes0.legend(bbox_to_anchor=(1, 1),
           )
axes1 = plt.subplot(212)
axes1.plot(x, sinx, 'r', linewidth=1, label='y=sin(x)')


axes1.legend(bbox_to_anchor=(1, 1),
           bbox_transform=plt.gcf().transFigure)


plt.show()

注意两个图例 ‘y=cos(x), y=sin(x)’的位置
在这里插入图片描述

更多的例子:

import matplotlib.pyplot as plt


plt.subplot(211)
plt.plot([1,2,3], label="test1")
plt.plot([3,2,1], label="test2")
# Place a legend above this subplot, expanding itself to
# fully use the given bounding box.
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3,
           ncol=2, mode="expand", borderaxespad=0.)

plt.subplot(223)
plt.plot([1,2,3], label="test1")
plt.plot([3,2,1], label="test2")
# Place a legend to the right of this smaller subplot.
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()

在这里插入图片描述

在同一个Axes上添加多个legend

有时候将legend entries 分成多个legends更加清晰,而如果多次调用legend,你会发现只会出现最新的legend,所以我们要手动将旧的图例添加到Axes上。

fig = plt.figure(1)
ax = plt.subplot(111)
line1,  = ax.plot(x, cosx, 'r-.',label = 'y=cos(x)' )
line2, =ax.plot(x, sinx, 'c',label = 'y=sin(x)')

# 创建第一个图例:y=cosx
first_legend = plt.legend(handles=[line1], loc='lower right')
# 添加第一个图例
ax.add_artist(first_legend)

# 添加第二个图例
ax.legend(handles=[line2], loc='upper right')

plt.show()

在这里插入图片描述

### 在 Matplotlib添加图例的方法 在 Matplotlib 中,可以通过 `plt.plot()` 方法中的 `label` 参数为每条曲线指定名称,并调用 `plt.legend()` 函数来显示这些图例。以下是详细的介绍和示例代码。 #### 基本概念 - **`label` 参数**:当使用 `plt.plot()` 绘制图形时,可以通过设置 `label` 参数为该线条命名[^1]。 - **`plt.legend()`**:此函数用于将之前定义的 `label` 显示出来作为图例。还可以通过传递额外参数来自定义图例的位置和其他属性[^2]。 #### 示例代码 1:简单图例添加 以下是一个基本的例子,展示了如何在同一张图表中绘制两条不同的曲线并为其分别添加图例: ```python import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 2 * np.pi, 100) y1 = np.sin(x) y2 = np.cos(x) plt.plot(x, y1, label='正弦波 Sine') # 添加标签 '正弦波' plt.plot(x, y2, label='余弦波 Cosine') # 添加标签 '余弦波' plt.legend() # 调用 legend 函数以显示图例 plt.xlabel('X轴') plt.ylabel('Y轴') plt.title('正弦与余弦波形') plt.show() ``` #### 自定义图例位置 可以进一步定制图例的位置以及其他样式选项。例如,通过修改 `loc` 参数控制图例放置的具体区域[^3]。 ##### 示例代码 2:自定义图例位置及字体大小 ```python import matplotlib.pyplot as plt from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = False x = [1, 2, 3, 4, 5] y = [1, 2, 3, 4, 5] plt.plot(x, y, label='直线 Y=X') plt.legend(loc="upper left", fontsize=10) # loc 设置图例位置,fontsize 修改字体大小 plt.title("带有图例的简单折线图") plt.show() ``` #### 处理特殊情况下图例外观异常的问题 有时可能会遇到图例的文字只显示首字母的情况,在这种情形下可以在传入 `label` 参数的时候加上逗号使其成为真正的元组形式,这样就能正常渲染整个字符串[^4]。 ##### 示例代码 3:修正图例外观错误 ```python import matplotlib.pyplot as plt import numpy as np x = np.arange(-6, 6, 0.1) y1 = np.sin(x) line1, = plt.plot(x, y1, 'r--', label=("Sin Function", )) # 注意这里的逗号使 label 成为了一个元组 plt.legend(loc="best", fontsize=8) plt.title("修正后的图例外观问题演示") plt.show() ``` #### 更复杂的配置——最佳实践 对于更复杂的应用场景,推荐结合实际需求灵活运用各种可用参数优化用户体验。比如选择最合适的定位策略(`loc`)、调整边距(padding)等细节均能显著改善最终呈现效果[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值