Matplotlib可视化之添加让统计图变得简单易懂的注释


Posted in Python onJune 11, 2021

一、前言

在系列博文的中,我们已经学习了如何自定义绘图的颜色和样式,以使得绘制更加精美、符合审美要求。可以用Matplotlib绘制出复杂而又精美的统计图,但是如果没有注释,我们很难让其他人明白图中的点、线究竟代表着什么,有什么样的含义,也就失去了统计图的意义,为了解决这一问题,Matplotlib提供了大量对图形进行注释的方法,这些注释方法对于所有的绘图函数(如plt.plot()、plt.scatter()、plt.histogram()等)都是通用的,利用这些注释可以使统计图变得通俗易懂。

二、添加标题

从最简单的添加标题开始:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4, 4, 10005)
y = 5 * (x + 4.2) * (x + 4.) * (x - 2.5)
plt.title('A polynomial')
plt.plot(x, y, c = 'm')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释Tips:

plt.title()函数接受一个字符串作为参数并将其作为整个图形的标题。

三、为坐标轴添加标签

在实际应用中,对统计图坐标轴的适当描述有助于用户理解图形所表达的含义。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
plt.title('Acceleration Moving')
plt.xlabel('Time')
plt.ylabel('distance')
plt.plot(x, y, c = 'c')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释Tips:

使用plt.xlabel()和plt.ylabel()函数分别为水平轴和垂直轴添加注释。

四、添加文本说明

虽然我们已经学习了如何图形添加标题,以及为坐标轴添加注释,但是,很多时候我们还需要在图形中添加说明文本,来凸显图中点或线的重要性。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
plt.title('Acceleration Moving')
plt.xlabel('Time')
plt.ylabel('distance')
plt.scatter(x[0],y[0])
plt.text(x[0], y[0], 'start')
plt.plot(x, y, c = 'c')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

Tips:plt.text()函数接受要显示的位置和文本作为参数。位置以坐标形式给出,其指定了文本框左下角的位置。

五、文本的对齐方式

文本外围包含隐式文本框(下文会介绍文本框的显示方法),此框用于将文本与传递给plt.text()的坐标进行相对对齐。使用verticalalignmenthorizontalalignment参数(它们分别可以简写为vaha)控制对齐的方式。
垂直对齐选项如下所示:

参数值 说明
center 参数坐标相对于文本框的中心
top 参数坐标相对于文本框的上侧
bottom 参数坐标相对于文本框的底部
baseline 参数坐标相对于文本的基线
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
x_b = np.linspace(0, 8, 1000)
y_b = np.zeros_like(x_b)
plt.title('Acceleration Moving')
plt.xlabel('Time')
plt.ylabel('distance')
plt.scatter(x[0],y[0])
plt.text(0, 0, 'center', va='center')
plt.text(2, 0, 'top', va='top')
plt.text(4, 0, 'bottom', va='bottom')
plt.text(6, 0, 'baseline', va='baseline')
plt.plot(x, y, c = 'c')
plt.plot(x_b, y_b, c = 'm')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

水平对齐选项如下所示:

参数值 说明
center 参数坐标相对于文本框的中心
left 参数坐标相对于文本框的左侧
right 参数坐标相对于文本框的右侧
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
y_b = np.linspace(0, 100, 1000)
x_b = np.zeros_like(y_b)
plt.title('Acceleration Moving')
plt.xlabel('Time')
plt.ylabel('distance')
plt.scatter(x[0],y[0])
plt.text(0, 0, 'center', ha='center')
plt.text(0, 50, 'left', ha='left')
plt.text(0, 100, 'right', ha='right')
plt.plot(x, y, c = 'c')
plt.plot(x_b, y_b, c = 'm')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

六、文本边界框

上文介绍了文本外围包含隐式文本框,为了可以显式的绘制文本框,plt.plot()支持一个以字典为输入的bbox参数,此词典用于定义文本框的外观配置:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
box = {
    'facecolor': '.75',
    'edgecolor': 'r',
    'boxstyle': 'round'
}
plt.title('Acceleration Moving')
plt.text(0, 8, 'start', bbox=box)
plt.plot(x, y, c = 'c')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

bbox参数的字典定义包含以下常见键值对:

说明与可选值
facecolor 用于设置文本框背景和边的颜色
edgecolor 用于设置文本框边缘的颜色
alpha 用于设置透明度级别,使文本框与背景更好的混合
boxstyle 设置文本框的样式,可选值包括"round"和"square"
pad 如果"boxstyle"设置为"square",则它定义文本和文本框边之间的填充量

七、添加箭头

添加文本框当然可以帮助注释图形,但有时当说明文本过多,并不能清楚的说明究竟与图形的那一部分相对应,因此要说明图形中的特定部分,没有什么比使用箭头更好的了,Matplotlib使用plt.annotate()函数绘制箭头。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 8, 1000)
y = 2.0 * x + 0.5 * 5 * x ** 2
plt.annotate('start',
        ha = 'center', va = 'bottom',
        xytext = (2, 30.),
        xy = (0, 0),
        arrowprops = { 'facecolor' : 'black', 'shrink' : 0.05 })
plt.title('Acceleration Moving')
plt.plot(x, y, c = 'c')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

Tips:plt.annotate()函数在显示与plt.text()作用相同的说明文本文本外,同时也会渲染箭头。要显示的说明文本是第一个参数;xy参数指定箭头的目标;xytext参数指定文本位置,同样可以通过ha和va参数来改变文本对齐方式
箭头的样式由传递给arrowprops参数的字典控制,其中常用的键值包括:

说明与可选值
arrowstyle 控制箭头的样式,可选值包括"<-"、"<"、“wedge”、"simple"和"fancy"等
facecolor 用于设置箭头背景和边的颜色
edgecolor 用于设置箭头边的颜色
alpha 用于设置透明度级别,使箭头与背景更好的混合

收缩参数控制箭头端点和箭头本身之间的间隙。

八、添加图例

在复杂图形中,往往包含大量不同的曲线和点,如果这些曲线和点没有相应的图例,将无法对其进行准确的区分,因此图例在实践中是必不可少的。
使用plt.legend()函数以及绘图函数的label可选参数,可以添加图例:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 6, 1024)
data = np.random.standard_normal((150, 2))
print(data.size)
y_1 = np.sin(x)
y_2 = np.cos(x)
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y_1, c = 'm', lw = 3., label = 'sin(x)')
plt.plot(x, y_2, c = 'c', lw = 3., ls = '--', label = 'cos(x)')
plt.scatter(data[:,0],data[:,1],c='y', label = 'random')
plt.legend()
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

Tips:每个plt绘图函数(如plt.plot()、plt.scatter()等)都有一个可选的label参数来命名图形的元素。plt.legend()函数的作用是呈现图例,图例是根据标签自动生成的。
plt.legend()函数包含可选参数来控制图例的呈现:

参数 说明与可选值
loc 用于控制图例的位置,默认值为"best",将以适合的方式自动放置图例,其他可选值包括"upper left"、“lower left”、“lower right”、“right”、“center left”、“center right”、“lower center”、“upper center"和"center”
shadow 可选值包括True和False,用于设置是否使用阴影效果呈现图例
fancybox 可选值包括True和False,用于是否使用圆角框呈现图例
title 用于为图例设置标题
ncol 强制设置图例的列数

九、使用LaTex风格的符号

我们已经学习了为图形添加多种注释的方法。然而,在实践中,我们通常需要使用数学符号,因此,我们需要使用LaTex语法来添加数字符号。
要使用LaTex风格的符号,首先需要在计算机上安装可用的LaTeX配置,以便Matplotlib可以解释LaTeX语法来呈现数学文本。有关于安装LaTeX的方法,不在本文的主题主题,大家可以根据自己的操作系统检索安装方法.

十、LaTex简介

LaTex是学术界广泛使用的一种文献排版系统。与Microsoft Word等文档编辑器不同,LaTeX用户在编辑文档时无法看到其最终显示效果。文档被描述为纯文本文档中存储的文本及命令。最终,LaTeX将解释文档以进行呈现。在科学和工程界,LaTeX的公式语言通常用于在电子邮件和论坛中编写数学文本。

十一、使用LaTex符号示例

使用LaTex风格的符号时,函数接受的字符串参数值以“$”字符开头和结尾,这是向Matplotlib发出信号,以将文本解释并呈现为LaTeX样式的数学文本。字符串的内容就是数学文本的标准语言,关于Matplotlib中LaTeX样式的数学文本的介绍,可以参考Matplotlib官网。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-4, 4, 10005)
y = 3 / 5 * (x + 4.2) * (x + 4.) * (x - 2.5)
plt.title('$f(x)=\\frac{3}{5}(x+4.4)(x+4)(x-2.5)$')
plt.plot(x, y, c = 'k')
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

Tips:这种LaTex风格的符号不限于标题,它可以用于任何其它注释。LaTeX语言在很大程度上依赖于转义字符\,但此符号恰好也是Python的字符串转义字符。因此,如果要在一个LaTeX文本中使用\作为转移字符,需要在Python字符串中使用两个\。为了避免漏掉转义字符,可以在字符串前面加上r,这样就不需要任何转义字符了,即:"$f(x)=\\frac{1}{4}(x+4)(x+1)(x-2)$"等价于r'$f(x)=\frac{1}{4}(x+4)(x+1)(x-2)$'。

十二、使用中文字符

中文是使用Matplotlib的一个痛点,但是在实际应用中,又不可避免的会使用到中文用于统计图注释的显示,如果不进行配置,会将中文字符显示为乱码。
使用中文字符作为注释有多种方式,这里本着简单就是最优的理念,使用plt.rcParams['font.sans-serif']进行设置:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 6, 1024)
data = np.random.standard_normal((150, 2))
y_1 = np.sin(x)
y_2 = np.cos(x)
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.title('中文字符使用示例')
plt.plot(x, y_1, c = 'm', lw = 3., label = '正弦函数')
plt.plot(x, y_2, c = 'c', lw = 3., ls = '--', label = '余弦函数')
plt.scatter(data[:,0],data[:,1],c='y', label = '随机点')
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.legend()
plt.show()

Matplotlib可视化之添加让统计图变得简单易懂的注释

Tips:使用plt.rcParams['font.sans-serif']设定支持中文字符的字体,使用中文字符的用法范围与LaTex风格的符号一样,它可以用于所有注释,另外需要确保系统支持所设定的中文字符字体。

系列链接

学会Python-Matplotlib可视化,快速完成数据分析(1)

一文详解常见统计图的绘制学会Python-Matplotlib可视化,快速完成数据分析(2)

到此这篇关于Matplotlib可视化之添加让统计图变得简单易懂的注释的文章就介绍到这了,更多相关Matplotlib可视化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
python基础知识小结之集合
Nov 25 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
Python入门教程之运算符与控制流
Aug 17 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
为什么Python中没有&quot;a++&quot;这种写法
Nov 27 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
Jan 10 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
Python实现单例模式的5种方法
Jun 15 Python
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
用python修改excel表某一列内容的操作方法
Windows安装Anaconda3的方法及使用过程详解
You might like
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
thinkphp模板用法和内容输出实例
2014/11/28 PHP
PHP文件操作方法汇总
2015/07/01 PHP
详解php实现页面静态化原理
2017/06/21 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
jquery $(document).ready()和window.onload的区别浅析
2015/02/04 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
vue如何引用其他组件(css和js)
2017/04/13 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
浅谈js闭包理解
2019/03/28 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
RC4文件加密的python实现方法
2015/06/30 Python
Python排序算法实例代码
2017/08/10 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
Python实现高斯函数的三维显示方法
2018/12/29 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
关于Python作用域自学总结
2019/06/10 Python
Python类class参数self原理解析
2020/11/19 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
药学专业毕业生求职信
2013/10/20 职场文书
教师自荐信
2013/12/10 职场文书
高中毕业生的个人自我评价
2014/02/21 职场文书
义和团口号
2014/06/17 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
亮剑观后感500字
2015/06/05 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
个人工作总结(管理人员)范文
2019/08/13 职场文书
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python