Matplotlib入门
首先补充一下python shell,ipython shell及jupyter概念。
python shell:安装python后系统终端进入的输入界面,不好用。
ipython shell::安装ipython后即有,通过anaconda终端(anaconda prompt)输入ipython进入。每次执行的是"In[xxx ]"本次输入。
jupyter:即ipython notebook(是ipython的网页版,可以植入各种模式,文字、图片、代码等)。%matplotlib等就是针对此平台的。(用这个或spyder)
1 #导入Matplotlib 2 import matplotlib as mpl #交互界面中 3 import matplotlib.pyplot as plt 4 5 #设置绘图格式 6 plt.style.use('classic') 7 8 #显示图形 9 plt.show() 10 11 #作图 12 fig = plt.figure() #plt.figure生成图片(这张纸) 13 ax = plt.axes() #plt.axes生成坐标轴 14 x = np.linspace(0, 10, 1000) 15 ax.plot(x, np.sin(x)); #ax.plot说明图线是通过坐标轴画出的。 16 plt.plot(x, np.sin(x)) #也可以用pylab接口画-plt 17 plt.plot(x, np.sin(x)) #想在图中多家一条线,可以重复调用plot命令。 18 19 plt.plot(x, x + 4, linestyle='-') # 实线 20 plt.plot(x, x + 5, linestyle='--') # 虚线 21 plt.plot(x, x + 6, linestyle='-.') # 点划线 22 plt.plot(x, x + 7, linestyle=':'); # 实点线 23 24 plt.plot(x, x + 0, '-g') # 绿色实线 25 plt.plot(x, x + 1, '--c') # 青色虚线 26 plt.plot(x, x + 2, '-.k') # 黑色点划线 27 plt.plot(x, x + 3, ':r'); # 红色实点线 28 29 plt.xlim(-1, 11) #调整坐标轴 30 plt.ylim(-1.5, 1.5) 31 plt.xlim(10, 0) #坐标轴逆序 32 plt.ylim(1.2, -1.2); 33 34 plt.axis([xmin, xmax, ymin, ymax]); #一行代码设置坐标刻度 35 plt.axis('tight') # 按照图形内容自动收紧坐标轴,不留空白。 36 plt.axis('equal') #x轴y轴是1:1,单位长度相等。 37 38 #设置图形标签,更细节的这些标签的设置风格参考文档 39 plt.title("A Sine Curve") #设置图题 40 plt.xlabel("x") #x轴标签 41 plt.ylabel("sin(x)") #y轴标签 42 plt.legend() #图例 43 44 #标签也可以在plt.plot函数中设置 45 plt.plot(x, np.sin(x), '-g', label='sin(x)')
虽然绝大多数的 plt 函数都可以直接转换成 ax 方法(例如plt.plot() → ax.plot()、 plt.legend() → ax.legend()等) , 但是并非所有的命令都可以这样用。 尤其是用来设置坐标轴上下限、 坐标轴标题和图形标题的函数, 它们大都稍有差别。 一些MATLAB 风格的方法和面向对象方法的转换如下所示
1 plt.xlabel() → ax.set_xlabel() 2 plt.ylabel() → ax.set_ylabel() 3 plt.xlim() → ax.set_xlim() 4 plt.ylim() → ax.set_ylim() 5 plt.title() → ax.set_title() 6 7 #通常的一次性设置做法: 8 ax = plt.axes() #创建坐标轴 9 ax.plot(x, np.sin(x)) 10 ax.set(xlim=(0, 10), ylim=(-2, 2),xlabel='x', ylabel='sin(x)', 11 title='A Simple Plot'); 12 13 14 # 先创建图形网格 15 # ax是一个包含两个Axes对象的数组 16 fig, ax = plt.subplots(2) #两个子图片 17 # 在每个对象上调用plot()方法 18 ax[0].plot(x, np.sin(x)) #子图片1 19 ax[1].plot(x, np.cos(x)) #子图片2
散点图函数plt.plot和plt.scatter区别
1 plt.scatter #更高级灵活,可单独控制每个点的设置。 2 plt.plot #效率更高性能好,当大型数据时。(eg.几千个点时)
plt.plot函数:
1 x = np.linspace(0, 10, 30) 2 y = np.sin(x) 3 plt.plot(x, y, 'o', color='black') 4 plt.plot(x, y, '-ok'); # 直线(-) 、 圆圈(o) 、 黑色(k) 5 6 #颜色之间的对应关系: 7 b---blue c---cyan g---green k----black 8 m---magenta r---red w---white y----yellow 9 #符号和线型对应关系 : 10 - 实线 11 -- 短线 12 -. 短点相间线 13 : 虚点线
plt.scatter函数
1 plt.scatter(x, y, c=colors, s=sizes, alpha=0.3,cmap='viridis') # alpha表示标注点的颜色透明度,cmap表示配色系,比如viridis是代指某三种搭配颜色。因此可以做到用颜色和点的标注或尺寸大小表示两个变量,这样在二维坐标系中一个点可以表示四个量(x , y , 点颜色,点大小)。
plt.fill_between : 对曲线添加不同宽度色块表示连续误差
matplotlib三维可视化(本质是二维): plt.contour、 plt.contourf 与 plt.imshow
1 #contour()函数画普通黑白等高线图 2 x = np.linspace(0, 5, 50) 3 y = np.linspace(0, 5, 40) 4 X, Y = np.meshgrid(x, y) 5 Z = f(X, Y) 6 plt.contour(X, Y, Z, colors='black'); 7 plt.colorbar(); #作出右边图例(类似CFD的那种)通用。 8 9 #contourf()函数画出等高线间填充过的等高图形 ,缺点是颜色改变非连续(等高) 10 plt.contourf(X, Y, Z, 20, cmap='RdGy') 11 12 #imshow()函数,不支持用 x 轴和 y 轴数据设置网格, 而是必须通过extent 参数设置图形的坐标范围 [xmin, xmax, ymin, ymax]。 13 plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower',cmap='RdGy')
频次(率)直方图:
由样本上下界将区间等分成m个小区间(b-a)/n, 则本区间矩形的高为(f/n)/((b-a)/n) ,样本点落入本区间内的概率f/n即为矩形的面积.
1 import numpy as np 2 import matplotlib.pyplot as plt 3 plt.style.use('seaborn-white') 4 data = np.random.randn(1000) 5 plt.hist(data, bins=100, density=True, alpha=0.8, #最基础的频次直方图函数plt.hist() 6 histtype='stepfilled', color='steelblue',edgecolor='none') # bins值代表横坐标被分区间个数,越大,单个矩形宽越小。
1 #用频次直方图对不同分布特征的样本进行对比时, 将histtype='stepfilled' 与透明性设置参数 alpha 搭配使用的效果非常好。(多个直方图在一张图对比) 2 x1 = np.random.normal(0, 0.8, 1000) 3 x2 = np.random.normal(-2, 1, 1000) 4 x3 = np.random.normal(3, 2, 1000) 5 kwargs = dict(histtype='stepfilled', alpha=0.3, normed=True, bins=40) 6 plt.hist(x1, **kwargs) 7 plt.hist(x2, **kwargs) 8 plt.hist(x3, **kwargs); 9 10 #计算每段区间的样本数而并不想画图显示它们,直接用 np.histogram() 11 counts, bin_edges = np.histogram(data, bins=5) 12 print(counts)
二维频次直方图与数据区间划分
plt.hist2d: 二维频次直方图(正方形划分) ,此外还有plt.hexbin:六边形区间划分
以下为plt.hist2d正方形划分。
1 mean = [0, 0] 2 cov = [[1,1], [1,2]] 3 x, y = np.random.multivariate_normal(mean, cov, 10000).T #用一个多元高斯分布(multivariate Gaussian distribution) 生成 x 轴与 y 轴的样本数据。 4 plt.hist2d(x, y, bins=30, cmap='Blues') 5 cb = plt.colorbar() 6 cb.set_label('counts in bin')
还有一种评估多维数据分布密度的常用方法是核密度估计(kernel density estimation, KDE)。
用matplotlib画三维图:mplot3d函数
1 #画一个空的三维坐标系 2 from mpl_toolkits import mplot3d 3 fig = plt.figure() #生成空白图 4 ax = plt.axes(projection='3d') #生成坐标轴,附加(projection='3d')即可。 5 ax = plt.axes(projection='3d') 6 7 # 三维线的数据 8 zline = np.linspace(0, 15, 1000) 9 xline = np.sin(zline) 10 yline = np.cos(zline) 11 ax.plot3D(xline, yline, zline, 'gray') 12 13 # 三维散点的数据 14 zdata = 15 * np.random.random(100) 15 xdata = np.sin(zdata) + 0.1 * np.random.randn(100) 16 ydata = np.cos(zdata) + 0.1 * np.random.randn(100) 17 ax.scatter3D(xdata, ydata, zdata, c=zdata, cmap='Greens');
绘制三维等高线图:ax.contour3D
1 def f(x, y): 2 return np.sin(np.sqrt(x ** 2 + y ** 2)) 3 x = np.linspace(-6, 6, 30) 4 y = np.linspace(-6, 6, 30) 5 X, Y = np.meshgrid(x, y) 6 Z = f(X, Y) 7 8 fig = plt.figure() 9 ax = plt.axes(projection='3d') 10 ax.contour3D(X, Y, Z, 50, cmap='binary') 11 ax.set_xlabel('x') 12 ax.set_ylabel('y') 13 ax.set_zlabel('z'); 14 15 ax.view_init(60, 35) #view_init(a,b)调整观察角度a和方位角b, a: xy平面的旋转角,b: 绕Z轴顺时针旋转角度。 16 fig
绘制三维曲面图:需要二维数据(直角坐标或极坐标均可)。
ax.plot_surface
1 r = np.linspace(0, 6, 20) 2 theta = np.linspace(-0.9 * np.pi, 0.8 * np.pi, 40) 3 r, theta = np.meshgrid(r, theta) 4 X = r * np.sin(theta) 5 Y = r * np.cos(theta) 6 Z = f(X, Y) 7 ax = plt.axes(projection='3d') 8 ax.plot_surface(X, Y, Z, rstride=1, cstride=1, 9 cmap='viridis', edgecolor='none');