[Python3] Matplotlib —— (十) 文字与注释

文章目录

    • 十一、文字与注释
      • (一)在图中添加文字标签
      • (二)坐标变换与文字位置
      • (三)箭头与注释


[ 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

案例:节假日对美国出生率的影响

  • 日均出生人数统计图
    [Python3] Matplotlib —— (十) 文字与注释_第1张图片
# 在图上增加文字标签
# 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

[Python3] Matplotlib —— (十) 文字与注释_第2张图片

(二)坐标变换与文字位置

有时候需要将文字放在与数据无关的位置上,比如坐标轴或者图形中。在Matplotlib中,通过调整坐标变换(transform)来实现。

任何图形显示框架都需要一些变换坐标系的机制。

  • 例如:当一个位于(x,y)=(1,1)位置的点需要以某种方式显示在图上特定的位置时,就需要用屏幕的像素来表示
  • 用数学方法处理这种坐标系变换很简单,matplotlib.transforms子模块中有一组工具可以实现类似功能

一共有三种解决这类问题的预定义变换方式:

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

[Python3] Matplotlib —— (十) 文字与注释_第3张图片

  • 注意:如果改变了坐标轴上下限,那么只有transData坐标会受影响,其他坐标系都不变
  • 在Jupyter Notebook中,可以把%matplotlib inline改成%matplotlib notebook,然后用图形菜单与图形交互(拖动按钮)就可以实现坐标轴平移
# 改变坐标轴上下限
ax.set_xlim(0, 2)
ax.set_ylim(-6, 6)
fig

[Python3] Matplotlib —— (十) 文字与注释_第4张图片

(三)箭头与注释

除了刻度线和文字,简单的箭头也是一种有用的注释标签。

  • (不推荐)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"))

[Python3] Matplotlib —— (十) 文字与注释_第5张图片

用前面的案例演示箭头注释:

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)

[Python3] Matplotlib —— (十) 文字与注释_第6张图片

  • 箭头和文本框的配置功能非常细致,这样就可以创建自己想要的箭头风格了。
  • 不过,功能太过细致往往也就意味着操作起来比较复杂,如果要做一个产品级的图形,可能要耗费大量时间。

Matplotlib 相关阅读:

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



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

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