这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要给大家介绍了利用 numpy+matplotlib 绘图的基本操作,文中介绍的非常详细,对大家学习 matplotlib 绘图具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。
简述
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、首先用
方法生成一个数组 X,这个数组是从
- np.linspace
开始到
- $-\pi$
的总共包含 256 个元素的数组,endpoint 参数表示是否包含首尾端点 (他的值是 True 或 False,首字母要大写。。。。)。当然,这个数组就是一个普通的数组了,跟其他数组没有区别。
- $\pi$
2、然后用
和
- np.cos()
方法作用在 X 数组上,对于 X 中的每一个元素进行计算,生成结果数组。(免去了迭代的过程)。
- np.sin()
3、接着调用 pylab 的 plot 方法,第一个参数是横坐标数组,第二个参数是纵坐标数组,其他参数暂且不谈。这样他会生成一个默认的图表了。(不会立刻显示)
4、当然,最后还要调用 show 方法来显示图表。
5、结果:
图表的名字叫 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()
显示的结果就是:
图例和注解
图例十分简单,下述代码就可以解决:
- 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()
效果图:
还是十分高能的。。。
总结
来源: http://www.phperz.com/article/17/0722/334821.html