[ Matplotlib version: 3.2.1 ]
八、配置图例
在可视化图形中使用图例,可以为不同的图形元素分配标签。
本文介绍如何在Matplotlib中自定义图例的位置与艺术风格。
图例默认配置
可以用plt.legend()命令来创建最简单的图例,它会自动创建一个包含每个图形元素的图例
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib inline
x = np.linspace(0, 10, 1000)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), '-b', label='Sine')
ax.plot(x, np.cos(x), '--r', label='Cosine')
ax.axis('equal')
leg = ax.legend()

自定义图例
- 设置图例位置
loc - 是否有外边框
frameon - 设置图例标签列数
ncol - 图例定义圆角边框
fancybox - 增加阴影
shadow - 改变外边框透明度
framealpha - 改变文字间距
borderpad
ax.legend(loc='upper left', frameon=False)
fig

ax.legend(frameon=False, loc='lower center', ncol=2)
fig

ax.legend(fancybox=True, framealpha=1, shadow=True, borderpad=1)
fig

(一)选择图例显示的元素
图例会默认显示所有元素的标签。如果不想显示全部,可以通过一些图形命令来指定显示图例中的哪些元素和标签。
plt.plot()可以一次创建多条线,返回线条实例列表
- 一种方法是将需要显示的线条传入
plt.legend() - 另一种方法是只为需要在图例中显示的线条设置标签
- 注意:默认情况下图例会忽略不带标签的元素
# 方法一
y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5))
lines = plt.plot(x, y)
# lines变量是一组plt.Line2D实例
plt.legend(lines[:2], ['first', 'second'])

# 方法二
plt.plot(x, y[:, 0], label='first')
plt.plot(x, y[:, 1], label='second')
plt.plot(x, y[:, 2:])
plt.legend(framealpha=1, frameon=True)

(二)在图例中显示不同尺寸的点
用不同尺寸的点来表示数据的特征
# 美国加州个城市的地理位置、面积和人口数量
# 目的:创建一个通过不同尺寸的点显示不同人口数量级的图例(隐藏无关数据标签)
import pandas as pd
cities = pd.read_csv('./data/california_cities.csv')
# 提取数据
lat, lon = cities['latd'], cities['longd']
population, area = cities['population_total'], cities['area_total_km2']
# 用不同尺寸和颜色的散点图表示数据,但不带标签
plt.scatter(lon, lat, label=None,
c=np.log10(population), cmap='viridis',
s=area, linewidth=0, alpha=0.5)
plt.axis(aspect='equal')
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.colorbar(label='log$_{10}$(population)')
plt.clim(3, 7)
# 创建图例
# 画一些带标签和尺寸的空列表
for area in [100, 300, 500]:
plt.scatter([], [], c='k', alpha=0.3, s=area,
label=str(area) + ' km$^2$')
plt.legend(scatterpoints=1, frameon=False,
labelspacing=1, title='City Area')
plt.title('California Cities: Area and Population')

- 图例通常是图形中对象的参照,如果想显示某种形状就需要将它画出来。但是示例中,对象(灰色圆圈)并不在图形中,因此把它们用空列表假装画出来(图例只会显示带标签元素)
- 为了画出这些空列表中的图形元素,需要为它们设置标签,以便图例可以显示,这样就可以从图例中获取信息了(这个策略对于创建复杂可视化图形很有效)
- 在处理这类地理数据时,如果能把州的地理边界或其他地图元素也显示出来,图形会更加逼真(Matplotlib的Basemap(底图)插件工具箱可以实现)
(三)同时显示多个图例
在同一张图上显示多个图例
- 用Matplotlib解决这个问题并不同意,因为通过标准的
legend接口只能为一张图创建一个图例,如果用plt.legend()或ax.legend()方法创建第二个图例,那么第一个图例就会被覆盖 - 可以通过从头开始创建一个新图例艺术家对象(legend artist)然后用底层(lower-level)的
ax.add_artist()方法在图上添加第二个图例
# 带双图例的曲线图
from matplotlib.legend import Legend
fig, ax = plt.subplots()
lines = []
styles = ['-', '--', '-.', ':']
x = np.linspace(0, 10, 1000)
for i in range(4):
lines += ax.plot(x, np.sin(x-i*np.pi/2),
styles[i], color='black')
ax.axis('equal')
# 设置第一个图例要显示的线条和标签
ax.legend(lines[:2], ['line A', 'line B'],
loc='upper right', frameon=False)
# 创建第二个图例,通过add_artist方法添加到图上
leg = Legend(ax, lines[2:], ['line C', 'line D'],
loc='lower right', frameon=False)
ax.add_artist(leg)

Matplotlib 相关阅读:
[Python3] Matplotlib —— (一) 入门基础
[Python3] Matplotlib —— (二) 简易线形图
[Python3] Matplotlib —— (三) 简易散点图
[Python3] Matplotlib —— (四) 可视化异常处理
[Python3] Matplotlib —— (五) 密度图与等高线图
[Python3] Matplotlib —— (六) 频次直方图、数据区间划分和分布密度
总结自《Python数据科学手册》

本文介绍了在Matplotlib 3.2.1中如何配置图例,包括选择图例显示的元素、显示不同尺寸的点以及同时显示多个图例。通过自定义图例的位置、边框、阴影和标签,提升数据可视化的清晰度和专业性。

1210

被折叠的 条评论
为什么被折叠?



