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 strip()函数 介绍
May 24 Python
python类参数self使用示例
Feb 17 Python
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
Python实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
利用 python 对目录下的文件进行过滤删除
Dec 27 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
判断python对象是否可调用的三种方式及其区别详解
Jan 31 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
python 模拟登陆github的示例
Dec 04 Python
全网非常详细的pytest配置文件
Jul 15 Python
教你用Python matplotlib库制作简单的动画
PyQt5实现多张图片显示并滚动
pyqt5蒙版遮罩mask,setmask的使用
详解Python描述符的工作原理
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
用python修改excel表某一列内容的操作方法
Windows安装Anaconda3的方法及使用过程详解
You might like
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
node.js请求HTTPS报错:UNABLE_TO_VERIFY_LEAF_SIGNATURE\的解决方法
2016/12/18 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
浅谈ECMAScript 中的Array类型
2019/06/10 Javascript
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
简单谈谈python中的多进程
2016/11/06 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
python实现一个点绕另一个点旋转后的坐标
2019/12/04 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
FORZIERI福喜利中国官网:奢侈品购物梦工厂
2019/05/03 全球购物
大四自我鉴定范文
2013/10/06 职场文书
毕业学生推荐信
2013/12/01 职场文书
高二地理教学反思
2014/01/24 职场文书
陈欧的广告词
2014/03/18 职场文书
产品质量保证书
2014/04/29 职场文书
服务之星事迹材料
2014/05/03 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
申报材料格式
2014/12/30 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
python爬虫框架feapde的使用简介
2021/04/20 Python
Python如何用re模块实现简易tokenizer
2022/05/02 Python