用Python绘制图表在工作中是一项非常有用的技能,虽然说强大的matlab基本可以满足我们所有的绘图需求,但是在有些情况下,使用Python绘图,让图表直接可以直接随着Python程序的运行而产生。那这种便捷,也是非常有价值的。本文中,我将简单介绍使用Python的pyplot模块绘制图表的基本操作。当然绘图是一个细活,不同的实际需求,对图表的要求也是千变万化,所以,要把所有的绘图操作一一道来,是困难的,也不见得有多大价值。因此,本文更多的只是抛砖引玉罢了,更详细的绘图技巧大家应在实践中不断查阅,积累经验。

matplotlib是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图。其中,matplotlib的pyplot模块一般是最常用的,可以方便用户快速绘制二维图表。

绘制一个最简单的折线图

折线图在我的工作中用到的比较多,因为写论文时,经常要在不同的参数环境下比较算法的运行时间。同时,折线图也是最简单的,所以我拿它“开刀”,来介绍pyplot模块最基本的操作。

现在绘制一个简单的二维折线图,x值和对应的y值分别可以被表示如下:x=[1,2,3,4]x=[1,2,3,4],我们可以按如下代码画出折线图。

import matplotlib.pyplot as pltx = [1, 2, 3, 4]
y = [1.2, 2.5, 4.5, 7.3]# plot函数作图
plt.plot(x, y)  # show函数展示出这个图,如果没有这行代码,则程序完成绘图,但看不到
plt.show()  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

需要注意一下的是show()函数在通常的运行情况下,将会阻塞程序的运行,直到用户关闭绘图窗口。换句话说,在关闭show()函数弹出的图像窗口前,show()函数后面的代码不会运行,直到用户关闭图像窗口,才会继续。

此外,还可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。比如,我通过如下代码将生成的图像保存为”test.png”。并且用dpi参数指定图像的分辨率为120。最后,输出图像的宽度为8×120=9608×120=960个像素。

plt.savefig("test.png", dpi=120)
  • 1

注意:plt.savefig()函数应该出现在plt.show()函数之前,否则,关闭图像窗口后,图像对象也就被释放了,什么都保存不到。

当然了,这个图十分简陋,简陋到几乎不能用,现在我们一步步去优化这个图。

绘制不同风格的线条

首先,可以对折线本身的风格进行优化。最好是每个记录的点突出,同时折线的颜色,粗细以及样式可控。优化后,我们得到了下图:

具体的实现代码如下:

import matplotlib.pyplot as pltx = [1, 2, 3, 4]
y = [1.2, 2.5, 4.5, 7.3]plt.plot(x, y, color="r", linestyle="--", marker="*", linewidth=1.0)plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

解释一下,plot函数中,x,yx,y后面的参数分别用来控制线条颜色,线条风格,线条标记以及线条粗细。这个编码风格和matlab是极为相似的。我将常用的参照表摘抄如下,供参考:

线条风格

线条风格 实线 虚线 破折线 点画线 无线条
代码表示 - : -. None 或 ,

线条颜色

线条颜色 洋红 绿
代码表示 r m y g c b k w

线条标记

标记 描述 标记 描述 标记 描述
o 圆圈 . * 星号
+ 加号 v 朝下三角 ^ 朝上三角
< 朝左三角 > 朝右三角 D 大菱形
d 小菱形 s 正方形 p 五边形
H 大六边形 h 小六边形 p 八边形
x ✘号 None或, 无标记

坐标轴的控制

线条是我们想要的样子了,再来优化坐标轴。这当中主要涉及的是坐标轴的范围,取值以及名称。我们现在重新绘制一个连续的曲线。以y=sin(x)y=sin(x)之间的函数图,代码以及对应图像如下:

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-5, 5, 0.02)
y = np.sin(x)plt.axis([-np.pi, np.pi, -2, 2])plt.plot(x, y, color="r", linestyle="-", linewidth=1)plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看出对xx控制的是y轴方向的取值。

坐标范围

总结一下,下面形式的函数可以控制图像的绘图范围:

plt.axis([x_min, x_max, y_min, y_max])
  • 1

如果只是单独想要控制x轴或者y轴的取值,则可以用plt.xlim(x_min, x_max)plt.ylim(y_min, y_max),用法与plt.axis()类似。

坐标标题

函数plt.xlabel()plt.xlabel()用来实现对x轴和y轴添加标题

坐标间隔设定

函数plt.xticks()plt.xticks()用来实现对x轴和y轴坐标间隔(也就是轴记号)的设定。用法上,函数的输入是两个列表,第一个表示取值,第二个表示标记。当然如果你的标记就是取值本身,则第二个列表可以忽略。下面我举一个例子:

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-2 * math.pi, 2 * math.pi, 0.02)
y = np.sin(x)plt.axis([-10, 10, -2, 2])plt.xticks([i * np.pi/2 for i in range(-4, 5)], [str(i * 0.5) + "$\pi$" for i in range(-4, 5)])plt.yticks([i * 0.5 for i in range(-4, 5)])plt.xlabel("x")
plt.ylabel("y")plt.plot(x, y, color="r", linestyle="-", linewidth=1)plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

画出的图像如下所示:

可以看到plt.xticks()中,后面的列表存储了应该出现的所有标记,这是我们自定义的标记,而且,这里是支持latex公式表达的。

多图叠加

多曲线

大多时候,需要在同一张图中出现多条曲线,以便我们对数据有个直观的比较。那么做法非常简单,直接写多个作图函数plot()即可,比如,我按照如下代码,将两条曲线画在同一张图中。

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-1, 1, 0.1)
y1 = np.exp(x)
y2 = np.exp(2 * x)plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1)plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1)plt.xlabel("x")
plt.ylabel("y")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

多图与多子图

figure()函数可以帮助我们同时处理生成多个图,而subplot()函数则用来实现,在一个大图中,出现多个小的子图。需要注意的是,figure()中的参数为图片序号,一般是按序增加的,这里面还涉及一个当前图的概念,具体可以通过下面的例子来理解;subplot()中的参数一般有3个,分别为行数,列数,以及子图序号。比如,subplot(1, 2, 1)表示这是一个1行,2列布局的图(两个子图,在同一行,分居左右),其中,当前处理的子图是第一个图(也就是左图)。我举个例子:

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-1, 1, 0.1)y1 = np.exp(x)
y2 = np.exp(2 * x)
y3 = np.exp(1.5 * x)plt.figure(1) # 生成第一个图,且当前要处理的图为fig.1
plt.subplot(1, 2, 1) # fig.1是一个一行两列布局的图,且现在画的是左图
plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1) # 画图plt.xlabel("x")
plt.ylabel("y1")plt.figure(2) # 生成第二个图,且当前要处理的图为fig.2
plt.plot(x, y2, color="k", linestyle="-", marker="s", linewidth=1) # 画图,fig.2是一张整图,没有子图,默认subplot(1, 1, 1)plt.xlabel("x")
plt.ylabel("y2")plt.figure(1) # 当前要处理的图为fig.1,而且当前图是fig.1的左图
plt.subplot(1, 2, 2) # 当前图变为fig.1的右图
plt.plot(x, y3, color="b", linestyle="-", marker="v", linewidth=1)plt.xlabel("x")
plt.ylabel("y3")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

这样,我们就用一个脚本画了两张图fig.1和fig.2。其中,fig.1包含了分居左右的两个子图,分别是y1和y3的曲线;fig.2是一张整图,画的是y2曲线。我将fig.1展示如下:

如果希望某个子图占据整行或者整列,可以如下调用subplot():

plt.subplot(221) # 第一行的左图
plt.subplot(222) # 第一行的右图
plt.subplot(212) # 第二整行
plt.show()
  • 1
  • 2
  • 3
  • 4

画底下的大图时,实际上相当于把前两个小的子图看作一个整图。

标题和图例

图像标题 ###

函数plt.title()用来对图像命名。

图例 ###

函数plt.legend()用来为图像添加图例。标题和图例我用以下的例子做一个简单介绍:

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-1, 1, 0.1)y1 = np.exp(x)
y2 = np.exp(2 * x)plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1, label="y1")
plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1, label="y2")plt.legend(loc='upper left', bbox_to_anchor=(0.2, 0.95))plt.title("Figure 1")plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

legend()里面的参数loc表示图例的位置,参数bbox_to_anchor是一个二元组,用来进一步细化图例的位置,其中第一个数值用于控制legend的左右移动,值越大越向右边移动,第二个数值用于控制legend的上下移动,值越大,越向上移动。此外,我们在画两条曲线时,分别为它们添加了标签label,标签的内容也就是最后图例中对应的内容。

网格,背景色以及文字注释

添加网格

和matlab一样,用函数grid()添加网格,函数中我们可以定义网格的样式,比如线条颜色,类型,粗细等等。需要注意的是,如果你只想在对x轴,或者y轴添加网格,只需要设定参数axis="x"axis="y"即可。axis参数一般默认为"both"表示,两个维度上都建立网格。

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-1, 1, 0.1)y = [2 * i for i in x]plt.plot(x, y, color="r", linestyle="-", marker="^", linewidth=1)plt.grid(color="k", linestyle=":")
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

背景色

通过向plt.subplot()函数传递参数facecolor设置图像的背景色。需要注意的是背景色的设置代码应该在绘制曲线之前,否则相当于给整张图上色,覆盖了要展示的曲线。比如下图,我设置背景色为绿色。其实这个功能在我看来实在是没什么大用,大多情况下,我们要用到的背景色都是白色,也就是默认的背景色。

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-1, 1, 0.1)
y1 = np.exp(x)
y2 = np.exp(2 * x)plt.subplot(facecolor="g")plt.plot(x, y1, color="r", linestyle="-", marker="^")
plt.plot(x, y2, color="b", linestyle="-", marker="s")plt.grid(color="k", linestyle=":")
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

文字注释

plt.text(), plt.annotate()是两种向图像添加文本注释的方法。plt.text()可以在图像任意位置添加文字,plt.annotate()则可以帮助我们形象地为曲线中的某一个点添加注释。

import matplotlib.pyplot as plt
import numpy as npx = np.arange(-1, 1, 0.1)y1 = np.exp(x)
y2 = np.exp(2 * x)plt.plot(x, y1, color="r", linestyle="-", marker="^", linewidth=1)
plt.plot(x, y2, color="b", linestyle="-", marker="s", linewidth=1)plt.text(-0.5, 3, "exp functions", fontsize=10)plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

plt.text()中前两个参数表示添加文字的坐标位置,最后一个参数是要添加的文本。

plt.annotate()plt.text()类似,代码表示如下:

plt.annotate('A', xy=(0, 1), xytext=(-0.5, 2.5), arrowprops=dict(facecolor='k', headwidth=10, width=2))
  • 1

分别解释一下,第一个参数’A’是注释文本,xy表示要注释的点的坐标,xytext表示注释文本的起始坐标,arrowprops表示箭头,我们可以通过一个字典形的变量,设置其样式,包括颜色,宽度等等(headwidth表示箭头宽度,width表示箭身的宽度)。画出来的图如下所示:

关于matplotlib绘图,我在本篇博客中先总结这么多。当然,正像我开头说的那样,绘图的知识点很杂,很多,几乎不可能全部覆盖到,暂时也只是将一些我现在能想到的,常用的操作做一个简单的介绍。本文会保持持续更新。

转载至[添加链接描述](https://blog.csdn.net/guoziqing506/article/details/78975150)

matplotlib pyplot 画图基础教程相关推荐

  1. pandas操作excel,matplotlib.pyplot画图插入到excel,处理复杂excel简单练习

    在数据分析上,一直都在公司zeppelin上敲python/scala代码,进行数据分析,公司内搞了个小考试,操作excel,弄matplotlib画图之类的: 好久没弄过这些了,在小技术上感觉被打脸 ...

  2. 使用numpy与matplotlib.pyplot画图

    使用numpy与matplotlib.pyplot画图 1. 折线图 1 # -*- enccoding:utf-8 -*-2 import numpy as np3 import matplotli ...

  3. 解决使用matplotlib.pyplot画图包含中文乱码显示问题(macbook上 family ‘sans-serif‘ not found 问题)

    一.matplotlib画图中文乱码问题 使用matplotlib.pyplot画图,有中文字体会显示乱码问题,这时需要添加如下代码: import matplotlib.pyplot as plt ...

  4. Matplotlib Python 画图工具包教程学习笔记4 等高线图以及3D图形的画法

    文章目录 1.等高线图 1.1 meshgrid 1.2 plt.contourf 1.3 plt.contour 1.4 plt.clabe 1.5 测试代码 1.6 最终效果 2. 3D图形的绘制 ...

  5. matplotlib.pyplot画图 图片的二进制流的获取

    有些时候,我们需要画图后的二进制数据流,matplotlib没有提供相关的api,通过源码查看与百度,得到下面此方法 import matplotlib.pyplot as pltimport num ...

  6. matplotlib.pyplot画图--进阶

    柱状图 plt.bar() (刻度值倾斜–指定维设定颜色–标注字体等) 应用场景:目标检测平均类别精度分析问题中,类别过多,横向表格略显拥挤,因此可以用bar()来进行表达. ------------ ...

  7. matplotlib.pyplot画图完美调整图片白边大小

    1.原图片 2.去除白边后效果 3.设置方法 可以通过调节 pad_inches 的值调整白边的大小. import matplotlib.pyplot as plt# 设置数据 x = [0, 50 ...

  8. matplotlib库绘图基础

    matplotlib库画图基础 文章目录 matplotlib库画图基础 1.matplotlib简介 2.绘图操作 2.1导入画图库 2.2画第一个图 2.3创建figure 2.4控制线条风格 2 ...

  9. 科研绘图(Matplotlib.pyplot)

    本文为目标导向,目标就是利用Matplotlib绘制类似于下图的多子图.图例位于坐标轴外且格式为矢量图的论文插图. 利用Matplotlib库绘图的推荐路线: 首先根据需求搜索所需函数: 之后直接根据 ...

最新文章

  1. Cesar竞赛平台项目中期总结
  2. 【Android View绘制体系】requestLayout
  3. Google 出品的 Java 编码规范和编程指南!
  4. tornado学习笔记day05-访问数据库
  5. mysql怎么生成可执行文件_查询mysql数据库的java程序在myeclipse上运行正常,但生成可执行文件后查询不出结果。问题出在哪儿呢?...
  6. Win32 远程线程
  7. html点击按钮获取列表数据传递到页面,随笔:ajax传递数组,layui父子页面传值,下来菜单赋值,父页面数据获取,表格数据替换为字符串...
  8. Struts2学习笔记(十六) 文件上传(File Upload)
  9. 游戏开发之nullptr和的NULL的区别(C++基础)
  10. 【Mac】nsurlsessiond 后台下载问题的解决方法
  11. NOIP2007 T1奖学金 解题报告-S.B.S.
  12. 3.2 GUN as汇编(本文内容大部分引用原文,非原创)
  13. 彻底搞懂遗传算法原理+代码讲解+具体例子
  14. Android基础整合项目之节日群发助手(三)
  15. 深入理解计算机系统第四章(4.55-4.58)
  16. 六级考试-考前最后一背
  17. .pdm文件怎么打开
  18. 泛型及其使用、Stream的方法(Java小白进阶day17)
  19. 2021年度训练联盟热身训练赛第一场 A.Weird Flecks, But OK (最小覆盖圆)
  20. ASP.NET 网页模板-基础

热门文章

  1. 【金猿人物展】树根互联COO黄路川:从“灯塔工厂”到“数字领航”,工业互联网操作系统助推新型工业化...
  2. office产品处于非活动状态——word无法修改
  3. 华硕服务器主板安装系统提示驱动,解决B150主板安装win7操作系统USB设备无法读取故障...
  4. 写500字关于漫威英雄的论文
  5. 全攻略:实现pynq-z2条形码识别
  6. c语言 inc文件夹,汇编 inc 和 dec 指令
  7. RabbitMQ ACK消息确认机制 快速入门
  8. 快速响应 智慧应急|大势智慧亮相第三届武汉国际安全应急博览会
  9. snipaste截图软件编辑时修改方框粗细
  10. 2022北京养老展(中国国际老年产业博览会)