绘图与可视化——Matplotlib
Matplotlib 入门知识
matplotlib在Python中应用最多的2D图像的绘图工具包,使用matplotlib能够非常简单的可视化数据。在matplotlib中使用最多的模块就是pyplot。pyplot非常接近Matlab的绘图实现,而且大多数的命令及其类似Matlab.当然,与Matlab类似,需要很多的数学运算,因此numpy这个组件同样是必不可少的。所以很多人说python+matplotlib+numpy就是MATLAB。
首先,在matplotlib建议使用别名,引入包,这样方便以后模块的使用,一般以以下两句开始:
import numpy as np
import matplotlib.pyplot as plt
对plot函数的讲解
上面介绍了简单的绘图,用的基本上都是plot,因此有必要对plot函数进行简单的介绍。官网参考网址:plot使用。熟悉Matlab的人对plot不会陌生,在matplotlib中的使用方式大致和Matlab中是一致的,使用plot,可以对点的标记的样式以及线条的样式进行设置。
函数的声明为:matplotlib.pyplot.plot
(*args, **kwargs)。args的参数的长度是不定 的,可以设置很多的属性,kwargs主要是应用于设置线条的属性。对于标注和线条的样式,可以通过简单的字符来表示。
More
一些单词
plot 绘图 axis 轴线 axisymmetric 轴对称的 spines 象限 tick 标记
solid line 实线 dashed line (--)虚线 dash-dot 点画线 dotted line (::)虚线
pixel marker (,)像素标记 triangle down (^)下三角标记 square marker 正方形标记
figure对象画图
接下来调用figure创建一个绘图对象,并且使用它成为当前的绘图对象。
figsize参数指定对象的宽度和高度,单位为英寸;dpi:分辨率,即每个英寸多少像素,缺省值是80,如下创建窗口的宽度为8*80=640像素。
put.figure(figsize=(8,4))
plot函数画图
也可以不创建绘图对象直接用plot函数绘图,matplotlib会自动创建一个绘图对象。
plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)
plt.plot(x,z,"b--",label="$cos(X^2)$")
- label: 给绘制的图一个名字
- linewidth 曲线宽度
- b--颜色和线型
其他函数设置属性
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot Forsdt Example")
plt.ylim(-1.2,1.2)
plt.legend()
- x/y label: x/y轴的文字
- title:图的标题
- ylim: y轴范围
- legend: 显示图示
显示出所有绘图对象:
plt.show()
多幅图表
如果需呀同时绘制多幅图表的话,可以传递一个整数参数指定对应图标的序号给figure对象,也可以使用subplot函数绘制有多个轴的图片。
subplot(numRows,numCols,plotNum)
subplot在plotNum指定的区域中创建一个轴对象,如新创建的轴与之前轴重叠的话,之前的会被删除。
创建3行2列6个轴,通过axisbg参数给每个轴设置不同的颜色:
for idx, color in enumerate("rgbyck"):
plt. subplot(320+idx+1.axisbg=color)
plt.show()
sup=bplots_adjust()调节轴间距及边框间距。
保存图像文件
plt.savefig("test.png",dpi=120)
dpi为120输出8*120个像素宽度图片。
多幅图时选定图并绘图
创建2个图1,2,在图2创建上下并排两个子图,用变量分别保存:
plt.figure(1)
plt.figure(2)
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)
在循环中,选定图1为当前图,在上面绘图,然后让图2两个子图为当前图,并绘图:
for i in xrange(5):
plt.figure(1)
plt.plot(x,np.exp(Ix/3))
plt.sca(ax1)
plt.plot(x,np,sin(Ix))
plt.sca(ax2)
plt.plot(x,np,cos(I*x))
plt.show()
坐标轴设定
Axis容器包括坐标轴的刻度线/刻度标签/坐标网格及坐标轴标题等,刻度分主刻度和副刻度。以下绘制线图并得到当前图的X轴对象axis:
plt.plot([1,2,3],[4,5,6])
plt.show()
axis = plt.gca().xaxis
axis.get_ticklocs()#刻度位置列表
axis.get_ticklabels()#标签列表
[x.get_text() for x in axis.get_ticklabels()]#文本字符串
more
对数坐标图
- semiology()#x轴为对数坐标
- semiology()#y轴为对数坐标
- loglog()# 两个轴都为对数坐标
使用四种坐标图绘制低通滤波器的频率响应曲线,算术和三种对数坐标图:
w = np.linspace(0.1,1000,1000)
p =n np.abs(1/(1+0.1j*w))
plt.subplot(221)
plt.plot(w,p,linewidth=2)
plt.ylim(0,1.5)
plt.subplot(222)
plt.semilogx(w,p,linewidth=2)
plt.ylim(0,1.5)
plt.subplot(223)
plt.semilogy(w,p,linewidth=2)
plt.ylim(0,1.5)
plt.subplot(224)
plt.loglog(w,p,linewidth=2)
plt.ylim(0,1.5)
plt.show()
柱状图
柱状图每根柱子长度表示大小,用来对比多组值。
data = np.loadtxt("xxx.txt")
width = (data[1,0]-data[0,0])*0.4
plt.figure(figsize=(8,5))
//让每根柱子左侧的横坐标为年纪减去柱子的宽度
plt.bar(data[:,0]-width,data[:,1]/1e7, width, color='"b",label=u"男")
plt.bar(data[:,0]-width,data[:,2]/1e7, width, color='"r",label=u"女")
plt.xlim(0width,100)
plt.xlabel(u"年龄")
plt.ylabel(u"人口(千万)")
plt.legend()
plt.show()
散列图
- 以下方法无法单独指定每个点的颜色和大小:
plt.plot(np.random.random(100), np.random.random(100),"o")
plt.figure(figsize=(8,4))
x = np.random.random(100)
y = np.random.random(100)
plt.scatter(x,y,s=x*1000,c=y,marker=(5,1),alpha=0.8,lw=2, facecolors="none")
plt.xlim(0,1)
plt.ylim(0,1)
plt.show()
scatter()函数前三个参数是数组
- 前两个是x/y轴坐标
- s是点的大小
- c是每个点的颜色,默认的颜色映射表中蓝色对应最小值,红色最大值
- marker设置点的形状,第一个参数是多边形的边数,第二个是其样式(0:多边形,1:星,2:放射形,3:圆形)
- alpha设置点的透明度
- lw 线宽
- facecolors 参数为none时,表示散列点没有填充颜色
饼图
ply.pie()
explode 将某部分弹出来,数据使用元组,数值的大小是分割出来的与其他两块的间隙
labeldistance 文本的位置离原点有多远,1.1指1.1倍半径的位置
autopct 圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
shadow 饼是否有阴影
startangle 起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
pctdistance 百分比的text离圆心的距离