Matplotlib入门

首先补充一下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
#符号和线型对应关系 :
					-      实线
					--     短线
					-.     短点相间线
					:     虚点线

在这里插入图片描述

扫描二维码关注公众号,回复: 3712050 查看本文章

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42422981/article/details/83155667