这是学习莫烦老师Matplotlib库后的总结。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import gridspec
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import animation
# 使用linspace实现-1到1的分成均匀间隔的50个数字
# linspace与arange的区别是: linespace样本数量 arange样本步长
x = numpy.linspace(-1, 1, 50)
y = 2 * x + 1
plt.plot(x,y) # plot将点连接绘制成线
plt.show()
# 用figure构建图像实例 将两条线显示在一张画布中
x = np.linspace(-3, 3, 50)
y1 = 2 * x + 1
y2 = x ** 2
plt.figure(num=1, figsize=(8, 5))
l1, = plt.plot(x, y2, label='up') #plt.plot返回值为表现所绘制图像的数组 而我们只需要第一个值 所以加逗号
l2, = plt.plot(x, y1, color='red', linestyle='--', label='down')
plt.xlim(-1, 2) # 图像x轴的显示限制
plt.ylim(-2, 3) # 图像y轴的显示限制
tick = np.linspace(-1, 2, 5) # 返回值是-1到2的均匀间隔的5个点 且为浮点数
plt.xticks(tick) # xticks yticks是对坐标轴个性化设置
plt.yticks([-2, -1.8, -1, 1.22, 3], [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$'])
ax = plt.gca() # get current axes
ax.spines['right'].set_color('red') # spines可以理解为框架
ax.spines['top'].set_color('blue')
ax.xaxis.set_ticks_position('bottom') # 设置底部轴为x坐标轴
ax.yaxis.set_ticks_position('left') # 设置左轴为y坐标轴
ax.spines['bottom'].set_position(('data', 0)) # 设置x轴从y轴的哪个数据点穿过
ax.spines['left'].set_position(('data', 0)) # 设置y轴从x轴的哪个数据点穿过
# 设置图例
# handles是为了对两条线手动控制 labels给其重新命名 loc=best自动寻找最佳位置
plt.legend(handles=[l1,l2,],labels=['aaa','bbb'],loc='best')
x0 = 1
y0 = 2 * x0 + 1
plt.scatter(x0, y0) # 绘制一个点
plt.plot([x0, x0], [y0, 0], linestyle='--') # 绘制连接(x0,y0)(x0,0)两个点的线
# 注释文本
# 文本 参考点为(x0,y0) 参考的坐标系是数据的坐标系 文本位置相对参考点移动一定距离 arrowprops绘制箭头
'''
xy(箭头尖端)和xytext位置(文本位置)都以数据坐标为单位
可以使用xycoords和textcoords以及下列字符串之一(默认为data)指定xy和xytext的坐标系。
| 参数 | 坐标系 |
| 'figure points' | 距离图形左下角的点数量 |
| 'figure pixels' | 距离图形左下角的像素数量 |
| 'figure fraction' | 0,0 是图形左下角,1,1 是右上角 |
| 'axes points' | 距离轴域左下角的点数量 |
| 'axes pixels' | 距离轴域左下角的像素数量 |
| 'axes fraction' | 0,0 是轴域左下角,1,1 是右上角 |
| 'data' | 使用轴域数据坐标系 |
'''
plt.annotate(r'$2x+1=3$',xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',
fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))
plt.text(-3.7,3,r'$This\ is\ a\ text.$',fontdict={'color':'red','size':16})
# 绘制散点图
n = 1024
X = np.random.normal(0, 1, n) # 正态随机数
Y = np.random.normal(0, 1, n)
T = np.arctan2(Y, X) # for color value
plt.scatter(X, Y, s=75, c=T, alpha=0.5)
plt.xlim((-1.5, 1.5)) # 存疑为什么两个括号
plt.ylim((-1.5, 1.5))
plt.xticks(())
plt.yticks(())
plt.show()
# 绘制柱状图
n = 12
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='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')
for (x, y) in zip(X, Y1):
# ha:horizontal水平位置 va:竖直位置
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')
# 用矩阵绘图
a = np.random.rand(9).reshape(3, 3)
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower') # interpolation是图像处理方式 nearest较为清晰
plt.colorbar()
# 绘制3D图像
fig = plt.figure()
ax = Axes3D(fig) # 在画布上形成3D轴
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X ** 2 + Y ** 2)
Z = np.sin(R)
# rstride:行之间的跨度 cstride:列之间的跨度
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))
# 绘制从3D曲面到底部的投影 zdir可选 'z'|'x'|'y'| 分别表示投影到z,x,y平面
ax.contourf(X, Y, Z, zdir='z',offset=-2,cmap='rainbow') # 绘制等高线图
ax.set_zlim(-2,2) # 设置z轴的维度
# 绘制子图的三种方法
plt.figure()
plt.subplot(2,2,1) # 2 rows 2 columns
plt.plot([0,1],[0,1])
plt.subplot(2,2,2) # 2 rows 2 columns
plt.plot([0,1],[0,2])
plt.figure()
ax1=plt.subplot2grid((3,3),(0,0),rowspan=1,colspan=3)
ax1.plot([1,2],[1,2])
ax1.set_xlabel('temp1')
ax2=plt.subplot2grid((3,3),(1,0),rowspan=1,colspan=2)
ax3=plt.subplot2grid((3,3),(1,2),rowspan=2,colspan=1)
plt.figure()
gs = gridspec.GridSpec(3, 3) # specification 规格
ax1 = plt.subplot(gs[1:,2])
# 图中图
fig = plt.figure()
x = [1, 2, 3, 4, 5, 6]
y = list(map(lambda i: i * 2 + 1, x))
left, bottom, width, height = 0.1, 0.1, 0.8, 0.8
# 设置ax1在画布中的位置 例如left意思是离左栏间隔画布10%的距离
ax1 = fig.add_axes([left, bottom, width, height])
ax1.plot(x, y, 'r')
# 图中小图 设置图的另一种方式
plt.axes([0.6, 0.2, 0.25, 0.25])
plt.plot(y[::-1],x,'g')
x = np.arange(0, 10, 0.1)
y1 = 0.05 * x ** 2
y2 = -2 * y1
fig, ax1 = plt.subplots() # 相当于fig=plt.figure() & ax=fig.subplot()
ax2 = ax1.twinx() #twinx创建共享x轴的双轴 图像有些中心对称的意思
ax1.plot(x, y1, 'g')
ax2.plot(x, y2, 'b')
ax1.set_xlabel('X')
ax1.set_ylabel('Y1', color='g')
ax2.set_ylabel('Y2', color='b')
# 绘制动画
fig, ax = plt.subplots() # 相当于fig=plt.figure() & ax=fig.subplot()
x = np.arange(0, 2 * np.pi, 0.01)
line = ax.plot(x, np.sin(x))
print(line)
def animatie(i):
line.set_ydata(np.sin(x + i / 10)) # 定期更新y值形成动画
return line,
def init():
line.set_ydata(np.sin(x))
return line,
# frame是100帧 interval间隔20毫秒刷新一次
ani = animation.FuncAnimation(fig=fig, func=animatie, frames=100, init_func=init, interval=20, blit=False)
plt.show()
简单总结:
关于Matplotlib库中的annotate 可参考:annotate详解