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');

 

在这里插入图片描述

posted @ 2018-10-19 03:39  Parallax  阅读(147)  评论(0编辑  收藏  举报