快速绘图
快速绘图
matplotlib中的快速绘图的函数库可以通过如下语句载入:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 1000)
y = np.sin(x)
z = np.cos(x**2)
接下来调用figure创建一个绘图对象,并且使它成为当前的绘图对象:
plt.figure(figsize=(8,4))
plot函数的调用方式很灵活,第一句将x,y数组传递给plot之后,用关键字参数指定各种属性:
plt.plot(x, y, label="$sin(x)$", color="red", linewidth=2)
plt.plot(x, z, "b--", label="$cos(x^2)$")
•label:给所绘制的曲线一个名字,此名字在图示(legend)中显示。只要在字符串前后添加''$''符号,matplotlib就会使用其内嵌的latex引擎绘制的数学公式。
•color:指定曲线的颜色
•linewidth:指定曲线的宽度
•"b--":指定曲线的颜色和线型
接下来通过一系列函数设置绘图对象的各个属性:
plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.ylim(-1.2,1.2)
plt.legend()
•xlabel / ylabel:设置X轴/Y轴的文字
•title:设置图表的标题
•ylim:设置Y轴的范围
•legend:显示图示
最后调用plt.show()显示出创建的所有绘图对象。
还可以调用plt.savefig()将当前的Figure对象保存成图像文件,图像格式由图像文件的扩展名决定。
plt.savefig("test.png",dpi=120)
注意:如果show()先执行,则savefig() 不起作用
绘制多轴图
一个绘图对象(figure)可以包含多个轴(axis),在Matplotlib中用轴表示一个绘图区域,可以将其理解为子图。可以使用subplot函数快速绘制有多个轴的图表:
subplot(numRows, numCols, plotNum)
按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域的编号为1。subplot在plotNum(取值范围从1 到 numRows * numCols)指定的区域中创建一个轴对象。
如果需要同时绘制多幅图表,可以给figure()传递一个整数参数指定Figure对象的序号。
如果序号所指定的figure对象已经存在,将不创建新的对象,而只是让它成为当前的Figure对象。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) #创建图表1
plt.figure(2) #创建图表2
#最后一个被创建或激活的图表是图表2,所以子图被创建在图表2中:
ax1 = plt.subplot(211) #在图表2中创建子图1
ax2 = plt.subplot(212) #在图表2中创建子图2
x = np.linspace(0, 3, 100)
for i in range(5):
plt.figure(1) # 选择图表1
plt.plot(x, np.exp(i*x/3))
#当ax1、ax2成为子图时,包含它们的图表2也自动成为当前图表,因此不需要调用figure(2):
plt.sca(ax1) # 选择图表2的子图1
plt.plot(x, np.sin(i*x))
plt.sca(ax2) # 选择图表2的子图2
plt.plot(x, np.cos(i*x))
plt.show()
坐标轴设定(略)
Axis容器包括坐标轴的刻度线、刻度标签、坐标网格以及坐标轴标题等内容。刻度包括主刻度和副刻度。每个刻度线都是一个XTick或YTick对象,它包括实际的刻度线和刻度标签。
获得刻度:get_major_ticks(),get_minor_ticks()
获得刻度标签和刻度线:get_ticklabels()、get_ticklines()
与刻度定位和文本格式化相关的类都在matplotlib.ticker模块中定义:
from matplotlib.ticker import MultipleLocator, FuncFormatter
放置主、副刻度线:set_major_locator()、set_minor_locator()
绘图函数简介
对数坐标图
绘制对数坐标图的函数有三个:semilogx()、semilogy()和loglog(),它们分别绘制X轴为对数坐标、Y轴为对数坐标以及两个轴都为对数坐标时的图表。
import numpy as np
import matplotlib.pyplot as plt
w = np.linspace(0.1, 1000, 1000)
p = 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()
极坐标图
极坐标系是和笛卡尔(X-Y)坐标系完全不同的坐标系,极坐标系中的点由一个夹角和一段相对中心点的距离来表示。
import numpy as np
import matplotlib.pyplot as plt
theta = np.arange(0, 2*np.pi, 0.02)
plt.subplot(121, polar=True) #通过设polar参数为True创建极坐标子图
plt.plot(theta, 1.6*np.ones_like(theta), linewidth=2)
plt.plot(3*theta, theta/3, "--", linewidth=2)
plt.subplot(122, polar=True)
plt.plot(theta, 1.4*np.cos(5*theta), "--", linewidth=2)
plt.plot(theta, 1.8*np.cos(4*theta), linewidth=2)
plt.rgrids(np.arange(0.5, 2, 0.5), angle=45)
# rgrids()设置同心圆栅格的半径大小和文字标注的角度,因此右图中的虚线圆圈有三个,半径分别为0.5、1.0和1.5,这些文字沿着45°线排列
plt.thetagrids([0, 45])
# thetagrids()设置放射线栅格的角度,因此右图中只有两条放射线,角度分别为0°和45°
plt.show()
柱状图
data = np.loadtxt("china_population.txt")
width = (data[1,0] - data[0,0])*0.4
plt.figure(figsize=(8,5))
plt.rcParams['font.sans-serif']=['SimHei'] #绘图显示中文
plt.bar(data[:,0]-width, data[:,1]/1e7, width, color="b", label=u"男")
plt.bar(data[:,0], data[:,2]/1e7, width, color="r", label=u"女")
plt.xlim(-width, 100)
plt.xlabel(u"年龄")
plt.ylabel(u"人口(千万)")
plt.legend()
plt.show()

散列图
使用plot()绘图时,如果指定样式参数为仅绘制数据点,那么所绘制的就是一幅散列图。
plt.plot(np.random.random(100), np.random.random(100), "o")
这种方法所绘制的点无法单独指定颜色和大小。
用scatter()所绘制的散列图可以指定每个点的颜色和大小:
import numpy as np
import matplotlib.pyplot as plt
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")
Øs:指定点的大小,它可以是一个数,指定所有点的大小;也可以是数组,分别对每个点指定大小。此处设置值和点的面积成正比。
Øc:指定点的颜色,可以是数值或数组。这里使用一维数组为每个点指定了一个数值(通过颜色映射表,每个数值都会与一个颜色相对应,默认的颜色映射表中蓝色与最小值对应,红色与最大值对应)。
Ømarker:设置点的形状,可以是表示形状的字符串;也可以是表示多边形的两个元素的元组:第一个元素表示多边形的边数,第二个元素表示多边形的样式,取值0表示多边形,1表示星形,2表示放射形,3表示圆形。
Øalpha:点的透明度。
Ølw:线宽(line width)。
Øfacecolors:“none”表示散列点没有填充色。
plt.xlim(0,1)
plt.ylim(0,1)
plt.show()
注:此处使用的版本似乎不符合对c和 facecolors 的描述
图像(略)
imread()可以从图像文件读入数据,得到一个表示图像的NumPy数组。它的第一个参数是文件名或文件对象,format参数指定图像类型,如果省略,就由文件的扩展名决定图像类型。对于灰度图像,它返回一个形状为(M,N)的数组;对于彩色图像,返冋形状为(M,N,C)的数组。其中,M为图像的高度,N为图像的宽度,C为3或4,表示图像的通道数。
imshow()可以用来显示imread()返回的数组。从JPG图像中读入的数据是上下颠倒的,为了正常显示图像,可以将数组的第0轴反转,或者设置imshow()的origin参数为“lower”:
plt.imshow(img[::-1]) #反转图像数组的第0轴
plt.imshow(img, origin="lower") #让图表的原点在左下角
等值线图(略)
所谓等值线,是指由函数值相等的各点连成的平滑曲线。等值线可以直观地表示二元函数值的变化趋势,例如等值线密集的地方表示函数值在此处的变化较大。
matplotlib中可以使用contour()和contourf()描绘等值线,它们的区别是:contourf()所得到的是带填充效果的等值线。
import numpy as np
import matplotlib.pyplot as plt
y, x = np.ogrid[-2:2:200j, -3:3:300j]
z = x * np.exp( - x**2 - y**2)
extent = [np.min(x), np.max(x), np.min(y), np.max(y)]
plt.figure(figsize=(10,4))
plt.subplot(121)
cs = plt.contour(z, 10, extent=extent)
plt.clabel(cs)
plt.subplot(122)
plt.contourf(x.reshape(-1), y.reshape(-1), z, 20)
plt.show()
三维绘图(略)
mpl_toolkits.mplot3d模块在matplotlib基础上提供了三维绘图的功能。由于它使用matplotlib的二维绘图功能来实现三维图形的绘制工作,因此绘图速度有限,不适合用于大规模数据的三维绘图。如果需要更复杂的三维数据可视化功能,可使用Mayavi。
import numpy as np
import mpl_toolkits.mplot3d
import matplotlib.pyplot as plt
x, y = np.mgrid[-2:2:20j, -2:2:20j]
z = x * np.exp( - x**2 - y**2)
ax = plt.subplot(111, projection='3d') # projection='3d'指定使用三维投影
ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap = plt.cm.Blues_r)
rstride:行方向的步长(每隔2行采样一次)
cstride:列方向的步长(每隔1列采样一次)
cmap=plt.cm.Blues_r:指定颜色映射为反向蓝白渐变(Blues_r)
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
plt.show()