[ 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')
在同一张图上显示多个图例
legend
接口只能为一张图创建一个图例,如果用plt.legend()
或ax.legend()
方法创建第二个图例,那么第一个图例就会被覆盖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数据科学手册》