这里为什么先介绍Matplotlib库呢?那是因为大多数人对于学习枯燥的文字叙述叙述表示头疼,而如果能够将其可视化了后就有一种耳目一新的感觉,我也属于这类人。
Matplotlib或者说更为重要的PyPlot子包,是Python中用来可视化二维数据的基本工具。PyPlot使用命令式函数,是仿照MatLab进行工作的,每个PyPlot函数都会对其实例做一些改变,其核心算法是Plot方法,最为简单的实现是传入一个列表或一堆数组。
如果只传入一个参数,plot会假设该参数为y值序列,且自动生成x值(一般情况下我们会给plot传入两个一位数组或列表分别作为x、y轴。当然,plot还可以接受一个用来指明线条属性的参数,例如线条颜色、宽度及风格等。且看如下示例:、
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0., 6., 0.2 )
plt.plot(x, x**4, 'r', x, x*90, 'bs', x, x**3, 'g')
plt.show()
运行上述代码后,结果如图:
由运行结果可以看出,这段代码打印出三条不同风格的线条:红色、蓝色及绿色,pyplot可以传入多对坐标数组来绘制多个线条,下面我们来看创建多个坐标轴的subplot命令。
import numpy as np
import matplotlib.pyplot as plt
x1 = np.arange(0., 5., 0.1 )
x2 = np.arange(0., 5., 0.2 )
plt.figure(1)
plt.subplot(211)
plt.plot(x1, x1**4, 'r', x1, x1*90, 'bs', x1, x1**3, 'g^', linewidth=3.0)
plt.subplot(212)
plt.plot(x2, np.cos(2*np.pi*x2), 'k')
plt.show()
上述代码的输出结果如下:
下面我们来看一下matplotlib的直方图:hist()对象以一个数组或一个数组序列作为输入值。第二个参数是方柱的数量,我们以10个方柱为例:
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x=mu+sigma*np.random.randn(1000)
#当设置normed为1或True时,表示要对计数进行归一化,形成概率密度
n, bins, patches = plt.hist(x, 10, normed=1,
facecolor='b')
plt.xlabel('Frequency')
plt.ylabel('Probability')
plt.title('Histogram Example')
plt.text(40, .028, 'mean=100 std.dev .=15')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
上述代码运行结果如下:
Matplotlib散点图:散点图通过scatter函数来实现,其对象以长度一样的两个序列对象作为参数,对应代码如下:
import numpy as np
import matplotlib.pyplot as plt
N =100
x = np.random.rand(N)
y = np.random.rand(N)
colors = ('r', 'b', 'g')
area = np.pi*(10*np.random.rand(N))*2 #点的半径范围0-10
plt.scatter(x, y, s=area, c=colors,alpha=0.5)
plt.show()
运行后结果如下图:
Matplotlib三维图像:针对三维图像,Matplotlib也具有强大的工具包,其创建方法和二维图形类似,下面我们以简单的三维点、线、面为例说明(这里我们使用了gca函数的当前坐标轴,设置投影参看为三维):
代码如下:
import matplotlib as mpl
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
mpl.rcParams['legend.fontsize'] = 10
fig = plt.figure()
ax = fig.gca(projection='3d')
theta = np.linspace(-3 * np.pi, 6*np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 +1
x = r * np.sin(theta)
y = r * np.cos(theta)
ax.plot(x, y, z)
theta2 = np.linspace(-3 * np.pi, 6*np.pi, 20)
z2 = np.linspace(-2, 2, 20)
r2 = z2**2 +1
x2 = r2 * np.sin(theta2)
y2 = r2 * np.cos(theta2)
ax.scatter(x2, y2, z2, c='r')
x3 = np.arange(-5, 5, 0.25)
y3 = np.arange(-5, 5, 0.25)
x3, y3 = np.meshgrid(x3, y3)
R = np.sqrt(x3**2 + y3**2)
z3 =np.sin(R)
surf = ax.plot_surface(x3, y3, z3, rstride=1, cstride=1, cmap=cm.Greys_r,
linewidth=0, antialiased=False)
ax.set_zlim(-2, 2)
plt.show()
运行以上代码,显示结果如下: