本文总结自途索的慕课网课程,增加了些自己的理解。
matplotlib 是一个优秀的数据可视化库,可以很方便的使用Python
生成方便我们分析的数据图表,一起来看看吧。
导入必要的包
import matplotlib.pyplot as plt
import numpy as np
如果是在jupyter
中操作,可以使用%matplotlib inline
这个魔术方法,它会将matplotlib
绘制的图表显示在记事本中,方便直观的浏览。
同时我们还导入了numpy
,它是Python语言的一个扩充程序库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
准备绘图数据
下面我们用它来生成一些绘图需要的数据:
x = np.linspace(-np.pi, np.pi, 256)
c, s = np.cos(x), np.sin(x)
linspace
方法指定均匀的生成256个从-pi到pi之间的点,返回一个np.array
形式的数组。
见名知意,np.cos(x)
和 np.sin(x)
是对x
做了余弦和正弦的计算,并同样返回数组。
开始画图
有了数据我们开始画图:
plt.figure(1) # 当作是新建一个画布
# 在画布上画两个图形
plt.plot(x, c) # x是横轴,c是纵轴
plt.plot(x, s)
plt.show() # 显示图像
丰富我们的图形
当然,让面只是一个最简单的例子,实际操作时我们需要更多的标注信息,来时我们绘制的图形更易读。
线形、颜色和标题
在我们原来的代码上做些许修改:
plt.figure(1)
plt.plot(x, s, color='red', linestyle='-', label='sin') # label 后面绘制图例用
plt.plot(x, c, 'b--', label='cos') # b* 同时表示颜色和线型
plt.title('sin&cos') # 添加title信息
plt.show()
移动坐标轴
看起来好多了, 可是坐标轴在两侧有点别扭,我们把它挪到中间:
# 获取轴编辑器
ax = plt.gca()
# 将图像的上边框和右边框隐藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 将图像的下边框和左边框设置到数据域的0位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.show()
修改坐标值,添加图例
看起来不错,不过横轴看不出来我们的绘制点和pi
有啥关系,我们需要修改下单位信息,同时把图例加上。
# 指定五个点,使用laText,编辑公式并显示
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.legend(loc='upper left') # 根据label显示的图例相对于画面的位置
plt.grid() # 显示网格线
plt.show()
至此我们画了一个比较可观的图形了,下面是完整代码:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-np.pi, np.pi, 256)
c, s = np.cos(x), np.sin(x)
plt.figure(1)
plt.plot(x, s, color='red', linestyle='-', label='sin') # label 后面绘制图例用
plt.plot(x, c, 'b--', label='cos') # b* 同时表示颜色和线型
plt.title('sin&cos') # 添加title信息
# 获取轴编辑器
ax = plt.gca()
# 将图像的上边框和右边框隐藏
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 将图像的下边框和左边框设置到数据域的0位置
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
# 指定五个点,使用laText,编辑公式并显示
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.legend(loc='upper left')
plt.grid()
plt.show()
散点图的绘制
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
fig.add_subplot(3,3,1) # 将图像分割成三行三列,画在第一个区域中
n = 128
X = np.random.normal(0,1,n) # 生成随机高斯分布,0是均值,1是标准差,生成128个
Y = np.random.normal(0,1,n)
T = np.arctan2(Y, X) # 上色用
plt.scatter(X, Y, s=10, c=T) # s表示点的大小, c是颜色
# 限制轴的范围
plt.axis([-2,2,-2,2]) # [xmin, xmax, ymin, ymax]
plt.xticks([]) # 取消显示轴上的数值
plt.yticks([])
plt.title('scatter')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
柱状图的绘制
# 柱状图
fig.add_subplot(332) # 等价于 (3,3,2)
n = 10
X = np.arange(n)
Y1 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
Y2 = (1-X/float(n)) * np.random.uniform(0.5, 1.0, n)
plt.bar(X, +Y1, facecolor='red')
plt.bar(X, -Y2, facecolor='blue')
plt.xticks([]) # 取消显示轴上的数值
plt.yticks([])
# 添加注释
for x, y in zip(X, Y1):
plt.text(x, y, '%.2f' % y, ha='center', va='bottom')
for x, y in zip(X, Y2):
plt.text(x, -y, '%.2f' % -y, ha='center', va='top')
plt.show()
绘制饼图
# 饼图
fig.add_subplot(333)
n = 10
Z = np.ones(n)
Z[-1] = 2
plt.pie(Z, colors=['%.2f' % (i/float(n)) for i in range(n)],
labels=['%.2f' % (i/float(n)) for i in range(n)])
plt.gca().set_aspect('equal')
plt.xticks([]) # 取消显示轴上的数值
plt.yticks([])
plt.title('pie')
plt.show()
绘制极坐标图
# 极坐标
fig.add_subplot(334, polar=True) # 画图用的是plot, 所以指定polar
n = 20
theta = np.arange(0, 2*np.pi, 2*np.pi/n)
radii = 10*np.random.rand(n)
plt.plot(theta, radii)
plt.title('polar')
plt.show()
热图
# 热图
fig.add_subplot(335)
from matplotlib import cm # 上色用
cmap = cm.Blues
data = np.random.rand(3,3)
plt.imshow(data, cmap=cmap)
plt.title('heatmap')
plt.show()
3D图
from mpl_toolkits.mplot3d import Axes3D # 引入三维坐标系
fig.add_subplot(336, projection='3d') # 设置三维画布
X = [0,3]
Y = [0,3]
Z = [0,3]
plt.plot(X,Y,Z)
plt.title('3d')
plt.show()
热力图
# 热力图
fig.add_subplot(313)
def f(x,y):
return (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - Y**2)
n = 256
x = np.linspace(-3,3,n)
y = np.linspace(-3,3,n)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)
plt.show()
结语
好啦,至此我们用matplotlib
绘制了大多数的图形样式,并且使用了绘制子图的方式,将其绘制在同一个画布中,相信你已经可以根据自己的需求绘制相应的图形了。
最后如果我们想要保存绘制好的图形可以这样操作:
plt.savefig('./fig.png')
在项目目录下就会的到保存的图片啦。