[ Matplotlib version: 3.2.1 ]
一些场景中,可视化需要辅之以少量文字提示(textual cue)和标签。
最基本的注释(annotation)类型有坐标轴标题与图标题,此外,可以通过plt.text
/ax.text
命令手动添加注释,它们可以在具体的x/y坐标点上放上文字
ax.text
方法需要一个x轴坐标、一个y轴坐标、一个字符串和一些可选参数,比如文字的颜色、字号、风格、对齐方式以及其他文字属性%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl
plt.style.use('seaborn-whitegrid')
import numpy as np
import pandas as pd
案例:节假日对美国出生率的影响
# 在图上增加文字标签
# ha是水平对齐方式缩写(horizonal alignment)
style = dict(size=10, color='gray')
ax.text('2012-1-1', 3950, "New Year's Day", **style)
ax.text('2012-7-4', 4250, "Independence Day", ha='center', **style)
ax.text('2012-9-4', 4850, "Labor Day", ha='center', **style)
ax.text('2012-10-31', 4600, "Halloween", ha='right', **style)
ax.text('2012-11-25', 4450, "Thanksgiving", ha='center', **style)
ax.text('2012-12-25', 3850, "Christmas", ha='right', **style)
# 设置坐标轴标题
ax.set(title='USA births by day of year (1969-1988)',
ylabel='average daily births')
# 设置x轴刻度值,让月份居中显示
ax.xaxis.set_major_locator(mpl.dates.MonthLocator())
ax.xaxis.set_minor_locator(mpl.dates.MonthLocator(bymonthday=15))
ax.xaxis.set_major_formatter(plt.NullFormatter())
ax.xaxis.set_minor_formatter(mpl.dates.DateFormatter('%h'))
fig
有时候需要将文字放在与数据无关的位置上,比如坐标轴或者图形中。在Matplotlib中,通过调整坐标变换(transform)来实现。
任何图形显示框架都需要一些变换坐标系的机制。
一共有三种解决这类问题的预定义变换方式:
ax.transData
:以数据为基准的坐标变换ax.transAxes
:以坐标轴为基准的坐标变换(以坐标轴维度为单位)fig.transFigure
:以图形为基准的坐标变换(以图形维度为单位)默认情况下,文字在各自的坐标系中都是左对齐。
transData
坐标用x轴与y轴的标签作为数据坐标tranAxes
坐标以坐标轴(下图白色矩形)左下角的位置为原点,按坐标轴尺寸的比例呈现坐标transFigure
坐标以图形(下图灰色矩形)左下角的位置为原点,按图形尺寸的比例呈现坐标# 用三种变换方式将文字画在不同的位置
fig, ax = plt.subplots(facecolor='lightgray')
ax.axis([0, 10, 0, 10])
# transform=ax.transData是默认值
ax.text(1, 5, ". Data: (1, 5)", transform=ax.transData)
ax.text(0.5, 0.1, ". Axes: (0.5, 0.1)", transform=ax.transAxes)
ax.text(0.2, 0.2, ". Figure: (0.2, 0.2)", transform=fig.transFigure)
transData
坐标会受影响,其他坐标系都不变%matplotlib inline
改成%matplotlib notebook
,然后用图形菜单与图形交互(拖动按钮)就可以实现坐标轴平移# 改变坐标轴上下限
ax.set_xlim(0, 2)
ax.set_ylim(-6, 6)
fig
除了刻度线和文字,简单的箭头也是一种有用的注释标签。
plt.arrow()
函数可以实现这个功能,但它创建出的箭头是SVG向量图对象,会随着图形分辨率的变化而改变,最终得出的可能不是想要的结果。plt.annotate()
函数既可以创建文字,也可以创建箭头,而且它创建的箭头能够进行非常灵活的配置。fig, ax = plt.subplots()
x = np.linspace(0, 20, 1000)
ax.plot(x, np.cos(x))
ax.axis('equal')
# 箭头的风格是通过arrowprops字典控制的
ax.annotate('local maximum', xy=(6.28, 1), xytext=(10, 4),
arrowprops=dict(facecolor='black', shrink=0.05))
ax.annotate('local minimum', xy=(5 * np.pi, -1), xytext=(2, -6),
arrowprops=dict(arrowstyle="->",
connectionstyle="angle3,angleA=0,angleB=-90"))
用前面的案例演示箭头注释:
fig, ax = plt.subplots(figsize=(12, 4))
births_by_date.plot(ax=ax)
# 在图上增加箭头标签
ax.annotate("New Year's Day", xy=('2012-1-1', 4100), xycoords='data',
xytext=(50, -30), textcoords='offset points',
arrowprops=dict(arrowstyle="->",
connectionstyle="arc3,rad=-0.2"))
ax.annotate("Independence Day", xy=('2012-7-4', 4250), xycoords='data',
bbox=dict(boxstyle="round", fc="none", ec="gray"),
xytext=(10, -40), textcoords='offset points', ha='center',
arrowprops=dict(arrowstyle="->"))
ax.annotate('Labor Day', xy=('2012-9-4', 4850), xycoords='data', ha='center',
xytext=(0, -20), textcoords='offset points')
ax.annotate('', xy=('2012-9-1', 4850), xytext=('2012-9-7', 4850),
xycoords='data', textcoords='data',
arrowprops={
'arrowstyle': '|-|,widthA=0.2,widthB=0.2', })
ax.annotate('Halloween', xy=('2012-10-31', 4600), xycoords='data',
xytext=(-80, -40), textcoords='offset points',
arrowprops=dict(arrowstyle="fancy",
fc="0.6", ec="none",
connectionstyle="angle3,angleA=0,angleB=-90"))
ax.annotate('Thanksgiving', xy=('2012-11-25', 4500), xycoords='data',
xytext=(-120, 60), textcoords='offset points',
bbox=dict(boxstyle="round4,pad=.5", fc="0.9"),
arrowprops=dict(arrowstyle="->",
connectionstyle="angle,angleA=0,angleB=80,rad=20"))
ax.annotate('Christmas', xy=('2012-12-25', 3850), xycoords='data',
xytext=(-30, 0), textcoords='offset points',
size=13, ha='right', va="center",
bbox=dict(boxstyle="round", alpha=0.1),
arrowprops=dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1))
# 设置坐标轴标题
ax.set(title='USA births by day of year (1969-1988)',
ylabel='average daily births')
# 设置x轴刻度值,让月份居中显示
ax.xaxis.set_major_locator(mpl.dates.MonthLocator())
ax.xaxis.set_minor_locator(mpl.dates.MonthLocator(bymonthday=15))
ax.xaxis.set_major_formatter(plt.NullFormatter())
ax.xaxis.set_minor_formatter(mpl.dates.DateFormatter('%h'))
ax.set_ylim(3600, 5400)
Matplotlib 相关阅读:
[Python3] Matplotlib —— (一) 入门基础
[Python3] Matplotlib —— (二) 简易线形图
[Python3] Matplotlib —— (三) 简易散点图
[Python3] Matplotlib —— (四) 可视化异常处理
[Python3] Matplotlib —— (五) 密度图与等高线图
[Python3] Matplotlib —— (六) 频次直方图、数据区间划分和分布密度
[Python3] Matplotlib —— (七) 配置图例
[Python3] Matplotlib —— (八) 配置颜色条
[Python3] Matplotlib —— (九) 多子图
总结自《Python数据科学手册》