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