8.9 自定义图例

原文:Customizing Plot Legends

译者:飞龙

协议:CC BY-NC-SA 4.0

本节是《Python 数据科学手册》(Python Data Science Handbook)的摘录。

绘图的图例将意义赋予可视化,为各种绘图元素标识意义。我们以前看过如何创建简单的图例;在这里,我们将介绍如何在 Matplotlib 中自定义图例的位置和样式。

可以使用plt.legend()命令创建最简单的图例,该命令会自动为任何已标记的绘图元素创建图例:

import matplotlib.pyplot as plt
plt.style.use('classic')%matplotlib inline
import numpy as npx = 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();

但是我们可能有很多方法想要定制这样一个图例。例如,我们可以指定位置并关闭边框:

ax.legend(loc='upper left', frameon=False)
fig

我们可以使用ncol命令来指定图例中的列数:

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

我们可以使用圆角框(fancybox)或添加阴影,更改边框的透明度(alpha值),或更改文本周围的边距:

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

可用图例选项的更多信息,请参阅plt.legend文档字符串。

为图例选择元素

我们已经看到,图例默认包含所有已标记的元素。如果这不是我们想要的,我们可以通过使用plot命令返回的对象,来微调图例中出现的元素和标签。plt.plot()命令可以一次创建多个线条,并返回已创建的线条实例的列表。将这些中的任何一个,以及我们想要标识的标签传递给plt.legend()将告诉它识别哪些:

y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5))
lines = plt.plot(x, y)# 直线是 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);

请注意,默认情况下,图例会忽略没有设置label属性的所有元素。

用于点的大小的图例

有时,图例默认值不足以满足给定的可视化效果。例如,你可能正在使用点的大小来标记数据的某些特征,并且想要创建反映这一点的图例。这是一个例子,我们将使用点的大小来表示加州城市的人口。我们想要一个标识点大小比例的图例,我们将通过绘制一些没有条目的标记数据来实现它:

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 附加工具包,我们将在“地理数据和 Basemap”中探讨。

多个图例

有时在设计绘图时,你需要在同一轴域上添加多个图例。不幸的是,这对 Matplotlib 并不容易:通过标准的legend接口,只能为整个绘图创建一个图例。如果你尝试使用plt.legend()ax.legend()创建第二个图例,它将简单地覆盖第一个。我们可以通过从头开始创建一个新的图例艺术家来解决这个问题,然后使用较低级别的ax.add_artist()方法,手动将第二个艺术家添加到绘图中:

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)# 创建第二个图例,并手动添加艺术家
from matplotlib.legend import Legend
leg = Legend(ax, lines[2:], ['line C', 'line D'],loc='lower right', frameon=False)
ax.add_artist(leg);

这是对构成任何 Matplotlib 绘图的,低级艺术家对象的窥视。
如果你检查一下ax.legend()的源代码(回想一下你可以在 IPython 笔记本中使用ax.legend??来实现),你会看到该函数只包含一些逻辑,创建合适的Legend艺术家,然后将其保存在legend_属性中,并在绘图时添加到图形中。

数据科学 IPython 笔记本 8.9 自定义图例相关推荐

  1. 数据科学 IPython 笔记本 8.14 自定义 Matplotlib:配置和样式表

    8.14 自定义 Matplotlib:配置和样式表 原文:Customizing Matplotlib: Configurations and Stylesheets 译者:飞龙 协议:CC BY- ...

  2. 数据科学 IPython 笔记本 8.13 自定义刻度

    8.13 自定义刻度 原文:Customizing Ticks 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Data Scienc ...

  3. 数据科学 IPython 笔记本 翻译完成

    原文:donnemartin/data-science-ipython-notebooks 译者:飞龙 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以 ...

  4. 数据科学 IPython 笔记本 8.10 自定义颜色条

    8.10 自定义颜色条 原文:Customizing Colorbars 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Data S ...

  5. 数据科学 IPython 笔记本 8.4 简单的折线图

    8.4 简单的折线图 原文:Simple Line Plots 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Data Scienc ...

  6. 数据科学 IPython 笔记本 8.3 Matplotlib 可视化

    8.3 Matplotlib 可视化 原文:Visualization with Matplotlib 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册> ...

  7. 数据科学 IPython 笔记本 7.14 处理时间序列

    7.14 处理时间序列 原文:Working with Time Series 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Dat ...

  8. 数据科学 IPython 笔记本 8.7 密度和等高线图

    8.7 密度和等高线图 原文:Density and Contour Plots 译者:飞龙 协议:CC BY-NC-SA 4.0 本节是<Python 数据科学手册>(Python Da ...

  9. 数据科学 IPython 笔记本 9.9 花式索引

    9.9 花式索引 本节是<Python 数据科学手册>(Python Data Science Handbook)的摘录. 译者:飞龙 协议:CC BY-NC-SA 4.0 在前面的章节中 ...

最新文章

  1. 物体6-Dof pose estimation主流方法汇总
  2. softmax 与 logsoftmax 区别 或者说logsoftmax优点
  3. AnnotationConfigApplicationContext容器初始化
  4. java string.format_如果性能很重要,我应该使用Java的String.format()吗?
  5. [Linux] 头文件加载顺序
  6. C#实现外部图片的拖拽到应用程序的简单功能,附全部源码,供有需要的参考...
  7. 实时数据库中的二级压缩技术
  8. snabbdom vdom 框架
  9. 17.看板方法---瓶颈和非即时可用资源
  10. grafana导入json文件没有数据_基于SpringBoot将Json数据导入到数据库
  11. CrossApp推出移动应用开发神器CrossApp Style
  12. 高一计算机课程教案,高一信息技术复习课教案.doc
  13. [BZOJ1597]土地购买
  14. java 抛体运动6_抛体运动的公式
  15. 搭建超级实用的免费机器翻译api
  16. C语言学习之请编程序将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。
  17. 客单价怎么算 影响客单价的主要因素有哪些?
  18. 华为内部的关于IC验证的经验总结
  19. Joint fully convolutional and graph convolutional networks for weakly-supervised segmentation of
  20. pytorch 定义torch类型数据_PyTorch 使用TorchText进行文本分类

热门文章

  1. (70)FPGA面试题-使用不同的代码实现2:1 MUX ?使用case语句
  2. (17)System Verilog禁止类中所有变量随机属性
  3. FPGA不积跬步(目录篇)
  4. 数据结构之树的定义及操作
  5. 高性能HTTP加速器Varnish(概念篇)
  6. java 命令 native2ascii_java native2ascii.exe命令
  7. mysql space id_MySQL8.0新特性:增加系统文件追踪space ID和物理文件的映射-阿里云开发者社区...
  8. 【重难点】【JUC 02】volitale 常用模式 、JUC 下有哪些内容 、并发工具类
  9. 力扣836.矩形重叠
  10. linux 系统配置