[Python3] Matplotlib —— (七) 配置图例

文章目录

    • 八、配置图例
      • (一)选择图例显示的元素
      • (二)在图例中显示不同尺寸的点
      • (三)同时显示多个图例


[ 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()

[Python3] Matplotlib —— (七) 配置图例_第1张图片

自定义图例

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

[Python3] Matplotlib —— (七) 配置图例_第2张图片

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

[Python3] Matplotlib —— (七) 配置图例_第3张图片

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

[Python3] Matplotlib —— (七) 配置图例_第4张图片

(一)选择图例显示的元素

图例会默认显示所有元素的标签。如果不想显示全部,可以通过一些图形命令来指定显示图例中的哪些元素和标签。

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'])

[Python3] Matplotlib —— (七) 配置图例_第5张图片

# 方法二

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)

[Python3] Matplotlib —— (七) 配置图例_第6张图片

(二)在图例中显示不同尺寸的点

用不同尺寸的点来表示数据的特征

# 美国加州个城市的地理位置、面积和人口数量
# 目的:创建一个通过不同尺寸的点显示不同人口数量级的图例(隐藏无关数据标签)

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')

[Python3] Matplotlib —— (七) 配置图例_第7张图片

  • 图例通常是图形中对象的参照,如果想显示某种形状就需要将它画出来。但是示例中,对象(灰色圆圈)并不在图形中,因此把它们用空列表假装画出来(图例只会显示带标签元素)
  • 为了画出这些空列表中的图形元素,需要为它们设置标签,以便图例可以显示,这样就可以从图例中获取信息了(这个策略对于创建复杂可视化图形很有效)
  • 在处理这类地理数据时,如果能把州的地理边界或其他地图元素也显示出来,图形会更加逼真(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)

[Python3] Matplotlib —— (七) 配置图例_第8张图片


Matplotlib 相关阅读:

[Python3] Matplotlib —— (一) 入门基础
[Python3] Matplotlib —— (二) 简易线形图
[Python3] Matplotlib —— (三) 简易散点图
[Python3] Matplotlib —— (四) 可视化异常处理
[Python3] Matplotlib —— (五) 密度图与等高线图
[Python3] Matplotlib —— (六) 频次直方图、数据区间划分和分布密度


总结自《Python数据科学手册》

你可能感兴趣的:(Python3,#,Matplotlib,Data,Science,数据可视化,python)