利用numpy+matplotlib绘图的基本操作教程


Posted in Python onMay 03, 2017

简述

Matplotlib是一个基于python的2D画图库,能够用python脚本方便的画出折线图,直方图,功率谱图,散点图等常用图表,而且语法简单。具体介绍见matplot官网。

Numpy(Numeric Python)是一个模仿matlab的对python数值运算进行的扩展,提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生,而且据说自从他出现了以后,NASA就把很多原来用fortran和matlab做的工作交给了numpy来做了,可见其强大。。。他的官网在这里,具体的资料都在里面。

安装

$sudo apt-get install python-matplotlib
$sudo apt-get install python-numpy

(牛力大法好~)

使用

matplotlib可以在脚本中使用,不过如果在ipython中使用则会更加炫(直接添加?pylab参数可以免去导包的过程),而且能得到类似Matlab/Mathematica一样的功能,即时输入,即时输出。个人觉得说白了他就是模仿Matlab/Mathematica的,但是的确比前者更加方便编程。

很多情况下matplot需要配合numpy包一起用,关于numpy包我不打算分开来说,用到的时候提一下就行。有一点需要注意的是,numpy包通常是这样导入的:

import numpy as np

会给他起一个叫np的别名,而且这几乎已经是约定俗成了。

在python或者ipython中输入help(*需要查找的函数*) 就行(当然需要先导入下包)。

第一个图像

需要导入的包:

import numpy as np
from pylab import *

第一个函数图像

X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plot(X,C)
plot(X,S)
show()

有matlab基础的同学肯定不陌生。。。是的,这两个模块的组合几乎就跟matlab的用法无二。。

      1、首先用np.linspace方法生成一个数组X,这个数组是从$-\pi$开始到$\pi$的总共包含256个元素的数组,endpoint参数表示是否包含首尾端点(他的值是True或False,首字母要大写。。。。)。当然,这个数组就是一个普通的数组了,跟其他数组没有区别。

      2、然后用np.cos()np.sin()方法作用在X数组上,对于X中的每一个元素进行计算,生成结果数组。(免去了迭代的过程)。

      3、接着调用pylab的plot方法,第一个参数是横坐标数组,第二个参数是纵坐标数组,其他参数暂且不谈。这样他会生成一个默认的图表了。(不会立刻显示)

      4、当然,最后还要调用show方法来显示图表。

      5、结果:

利用numpy+matplotlib绘图的基本操作教程

图表的名字叫figure1,左下面有几个按钮,都是很实用的东西,右下角会显示当前鼠标左边,也很方便。

图表布局和坐标分布

每一个图表都是在一个figure里面,我们可以通过如下命令生成一个空的figure:

figure(figsize=(8,6), dpi=80)

这里参数的顺序没有要求,但是一定要加上参数名,因为他是根据参数名来区别每个参数的,是一种跟C语言类型不同的函数。figsize参数表示figure的宽高比,然后dpi表示每一份占的长度,比如这里就表示图像是640x480的。

输出命令之后会立刻出现一个窗口,接下来所有的plot命令都会立刻显示在这个窗口上而不用再输入show命令了。

一个figure里也能显示多个图表,我们可以用如下函数来分割一个figure:

subplot(3,4,6)

这样就会把当前的figure分割成3行4列的表,而激活其中的第6张,即第2行第3张。以后的plot都是在这一个子表上生成的,如果需要更换则可以重新输入subplot命令来确定其新的位置。

除此之外,如果我们对图表显示的范围不满意,我们还可以直接调整图表的坐标范围:

xlim(-4.0,4.0)
ylim(-1.0,1.0)

这就表示x轴的范围设置在-4到4,y轴的范围设置在-1到1。当然,如果是想相对的进行修改我们可以利用下numpy数组的min和max方法。比如X.min() 这样的东西。

如果对坐标显示的密度啊什么的不满意,我们也可以调节他的标注点:

xticks(np.linspace(-4,4,9,endpoint=True))
yticks(np.linspace(-1,1,5,endpoint=True))

对于xticks和yticks,我们实际上可以传入任意的数组,这里不过是为了方便而用numpy快速生成的等差数列。

当然,我们也可以给标注点进行任意的命名,像下面这样:

xticks([1,2,3,4,5],['one','two','three','four','five'])

效果也很好想象,就不贴图了。需要注意的是这里也可以支持LaTex语法,将LaTex引用在两个$之间就可以了。(关于LaTex)

这里也有个小窍门,就是如果想不显示标注的话,我们就可以直接给xticks赋一个空的数组。

更改色彩和线宽

我们可以在画plot的时候用如下方法指定他的颜色和线宽:

plot(X, C, color='#cadae3', linestyle='-',linewidth=1.3, marker='o', markerfacecolor='blue', markersize=12,)

同样,这里参数的顺序不重要,名字才重要。

color参数可以指定RGB的色相,也可以用一些默认的名字,比如red blue之类的。

linestyle参数则指定了线的样式,具体参照以下样式:

参数 样式
‘-‘ 实线
‘?' 虚线
‘-.' 线-点
‘:' 点虚线

linewidth参数指定折线的宽度,是个浮点数。

marker参数指定散点的样式,具体参照以下样式:

参数 样式
‘.' 实心点
‘o' 圆圈
‘,' 一个像素点
‘x' 叉号
‘+' 十字
‘*' 星号
‘^' ‘v' ‘' 三角形(上下左右)
‘1' ‘2' ‘3' ‘4' 三叉号(上下左右)

markerfacecolor参数指定marker的颜色

markersize参数指定marker的大小

这样就基本上能够自定义任何的折线图、散点图的样式了。

移动轴线

这段有点小复杂,暂时不想具体了解奇奇怪怪的函数调用,姑且先记录下用法和原理:

ax = gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

我们知道一张图有上下左右四个轴线,这里我们把右边和上边的轴线颜色调为透明,然后把下边设置到y轴数据为0的地方,把左边设置到x轴数据为0的地方。这样我们就能根据自己想要位置来调节轴线了。

比如下面这段官方的代码:

# -----------------------------------------------------------------------------
# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8,5), dpi=80)
ax = plt.subplot(111)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-")
plt.xlim(X.min()*1.1, X.max()*1.1)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
 [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, 0, +1],
 [r'$-1$', r'$0$', r'$+1$'])
plt.show()

显示的结果就是:

利用numpy+matplotlib绘图的基本操作教程

图例和注解

图例十分简单,下述代码就可以解决:

plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plot(X, S, color="red", linewidth=2.5, linestyle="-", label="sine")
legend(loc='upper left')

在plot里指定label属性就好了,最后调用下legend函数来确定图例的位置,一般就是'upper left'就好了。

注解就有点麻烦了,要用到annotate命令,挺复杂的,暂时是在不想看,姑且贴一段完整的代码和效果图吧:

# -----------------------------------------------------------------------------
# Copyright (c) 2015, Nicolas P. Rougier. All Rights Reserved.
# Distributed under the (new) BSD License. See LICENSE.txt for more info.
# -----------------------------------------------------------------------------
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8,5), dpi=80)
ax = plt.subplot(111)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
X = np.linspace(-np.pi, np.pi, 256,endpoint=True)
C,S = np.cos(X), np.sin(X)
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cosine")
plt.plot(X, S, color="red", linewidth=2.5, linestyle="-", label="sine")
plt.xlim(X.min()*1.1, X.max()*1.1)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
  [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
plt.ylim(C.min()*1.1,C.max()*1.1)
plt.yticks([-1, +1],
  [r'$-1$', r'$+1$'])
t = 2*np.pi/3
plt.plot([t,t],[0,np.cos(t)],
  color ='blue', linewidth=1.5, linestyle="--")
plt.scatter([t,],[np.cos(t),], 50, color ='blue')
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
  xy=(t, np.sin(t)), xycoords='data',
  xytext=(+10, +30), textcoords='offset points', fontsize=16,
  arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.plot([t,t],[0,np.sin(t)],
  color ='red', linewidth=1.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 50, color ='red')
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
  xy=(t, np.cos(t)), xycoords='data',
  xytext=(-90, -50), textcoords='offset points', fontsize=16,
  arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.legend(loc='upper left', frameon=False)
plt.savefig("../figures/exercice_9.png",dpi=72)
plt.show()

效果图:

利用numpy+matplotlib绘图的基本操作教程

还是十分高能的。。。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
python实现将excel文件转化成CSV格式
Mar 22 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
Python中print和return的作用及区别解析
May 05 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
python getpass模块用法及实例详解
Oct 07 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
Python小白不正确的使用类变量实例
May 29 Python
Python3+Flask安装使用教程详解
Feb 16 Python
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 #Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 #Python
python中解析json格式文件的方法示例
May 03 #Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 #Python
Pycharm学习教程(3) 代码运行调试
May 03 #Python
在centos7中分布式部署pyspider
May 03 #Python
python3读取MySQL-Front的MYSQL密码
May 03 #Python
You might like
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
JS设置获取cookies的方法
2014/01/26 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
2014/10/08 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
简述vue中的config配置
2018/01/23 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
Threejs实现滴滴官网首页地球动画功能
2020/07/13 Javascript
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
python机器学习之随机森林(七)
2018/03/26 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
python中如何设置代码自动提示
2020/07/15 Python
Python 利用OpenCV给照片换底色的示例代码
2020/08/03 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
去加拿大的旅行和假期:Canadian Affair
2016/10/25 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
c++工程师面试问题
2013/08/04 面试题
材料成型及控制工程专业求职信
2014/06/19 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
开幕式邀请函
2015/01/31 职场文书
2016年学校“3.12”植树节活动总结
2016/03/16 职场文书
python OpenCV学习笔记
2021/03/31 Python