栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Matplotlib自定义图例(多张独立图共享图例)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Matplotlib自定义图例(多张独立图共享图例)

1、应用场景

可视化不同方法在各种超参数(或者不同数据集)的性能时,若用多个子图形式可视化,则图太小啦;若每个子图弄成单独的figure,则每个张图都有一个图例显得非常冗余,如图1所示。

图1 每张图都有一个图例(非常冗余,并且有的数据被遮挡)

2、期望达到的效果,如图2所示

解决方案:两个子图都不需要设置图例,图例单独用一个figure来显示(自定义图例)

图2 期望的效果

3、自定义图例matplotlib代码实现 (1)方法一:利用Patch以及Line2D自定义图例
  • 缺点:暂时只能定义直线的图的图例;散点图的图例不行;
  • 优点:运行该代码后,Figure 1就是我们想要的图例图。
import matplotlib.pyplot as plt
import matplotlib.lines as lines
import matplotlib.patches as mpatches

# 自定义图例标记
line1 = lines.Line2D([0], [0], label='line1', marker='o', lw=2, c='green')
line2 = lines.Line2D([0], [0], label='line2', marker='X', lw=2, c='blue')
patch1 = mpatches.Patch(color='purple', label='patch1')
patch2 = mpatches.Patch(color='red', label='patch2')

# 构造图例
# plt.figure() figsize: default: [6.4, 4.8]
handles = [line1, line2, patch1, patch2]
# 注意根据图例的行数调整figsize的高度(i.e., 0.32)
fig, ax = plt.subplots(figsize=(6.4, 0.32))
ax.legend(handles=handles, mode='expand', ncol=4, borderaxespad=0)
"""
legend常见参数设置
borderpad:控制上下边距(default=0.4)
borderaxespad:控制legend与图边框的距离(default=0.5)
handlelength: handle与legend边框的距离(default=2)
handletextpad: handle与text之间的距离(default=0.8)
mode='expand', 水平展示图例
frameon=False: 不要图例边框
edgecolor: 图例边框颜色
fontsize: 图例字体大小
ncol=4    水平图例的个数

"""

ax.axis('off')  # 去掉坐标的刻度
plt.show()
(1.1)方法一可视化效果,如图3所示

图3 方法一可视化效果

(2)方法二:利用plt自定义图例
  • 缺点:会显示2个Figure,其中Figure 2才是我们想要的图例图;
  • 优点:和我们以前画图的方式一样(更加简单),并且能够构建散点图的图例;
import matplotlib.pyplot as plt

# plt.plot()返回值后面要加一个逗号,不然会报错;若使用Line2D就不需要逗号
# 注意:range(10)是随机取的值,这里只需要它的图例图。
l1, = plt.plot(range(10), label='line1', marker='o', lw=2, c='green')
l2, = plt.plot(range(10), label='line2', marker='X', lw=2, c='blue')
s1 = plt.scatter(range(10), range(10), label='scatter1', marker='+')
s2 = plt.scatter(range(10), range(10), label='scatter2', marker='+')
fig, ax = plt.subplots(figsize=(6.4, 0.32))
ax.legend(handles=[l1, l2, s1, s2], labels=list('abcd'), mode='expand', ncol=4, borderaxespad=0)
# ax.legend(handles=[l1, s1], labels=list('ab'), mode='expand', ncol=4, borderaxespad=0)  # 若只需要显示部分曲线/散点图的图例时
ax.axis('off')  # 去掉坐标的刻度
plt.show()
(2.1)方法二可视化效果,如图4所示

 图4 方法三的可视化效果,其中Figure 2就是我们需要的图

(3)方法三:混合实验方法一和方法二
import matplotlib.pyplot as plt
import matplotlib.lines as lines
import matplotlib.patches as mpatches

# 自定义图例标记
line1 = lines.Line2D([0], [0], label='line1', marker='o', lw=2, c='green')
# 注意line2后面的逗号
line2,  = plt.plot([0], [0], label='line2', marker='X', lw=2, c='blue')
s = plt.scatter([0], [0], label='scatter', marker='+')
patch1 = mpatches.Patch(color='purple', label='patch1')
# patch2 = mpatches.Patch(color='red', label='patch2')

# 构造图例
# plt.figure() figsize: default: [6.4, 4.8]
handles = [line1, line2, patch1, s]
# 注意根据图例的行数调整figsize的宽(i.e., 0.32)
fig, ax = plt.subplots(figsize=(6.4, 0.32))
ax.legend(handles=handles, mode='expand', ncol=4, borderaxespad=0)
"""
legend常见参数设置
axes:图框; handle:图例的每个元素; text:图例每个元素对应name
borderpad:控制上下边距(default=0.4)
borderaxespad:控制legend与图边框的距离(default=0.5)
handlelength: handle与legend边框的距离(default=2)
handletextpad: handle与text之间的距离(default=0.8)
mode='expand', 水平展示图例
frameon=False: 不要图例边框
edgecolor: 图例边框颜色
fontsize: 图例字体大小
ncol=4    水平图例的个数

"""
# plt.scatter
ax.axis('off')  # 去掉坐标的刻度
plt.show()
(3.1)方法三的可视化效果如图5所示

图5 方法三可视化修改,其中Figure 2就是我们需要的图例图

(4)总结
# 导入对应的模块
from matplotlib import lines
import matplotlib.pyplot as plt
from matplotlib import patches

a. 定义线图例
# 方法1
line1 = lines.Line2D([0], [0], label='line1', marker='o', lw=2, c='green')
# 方法2,注意别丢逗号
line2,  = plt.plot([0], [0], label='line2', marker='X', lw=2, c='blue')


b. 定义矩形图例
path1 = mpatches.Patch(color=’red’, label=’patch’)


c. 定义散点图图例
s1 = plt.scatter([0], [0], label='scatter', marker='+')


d. 显示图例
handles = [line1, path1, line2, s1]
fig, ax = plt.subplots(figsize=(6.4, 0.32)) # 根据行数更改0.32
ax.legend(handles=handles, mode=’expand’, ncol=4, borderaxespad=0)
ax.axis(“off”) # 去掉坐标刻度

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004654.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号