matplotlab 和 numpy 可能是python 数据处理工作中用的最多的库了, 官网的文档十分详细,但是就是因为数量庞大,很多时候常用的功能和生僻冷门的功能混在一起,找不到重点。按照二八原则,掌握20%的功能就已经能应付绝大多数的场景了,这里我展示了一些自己常用的一些功能。
一、matplotlab
- 用 axis 对象画一张图,axis 这个对象可以对途中的坐标轴、刻度、图例、标题进行操作,建议长期使用这个对象,尽量挖掘它的功能,习惯了之后很有用,不要直接用plt.plot()。
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
fig, axis = plt.subplots()
axis.plot(x, y)
axis.set_title("aplitude")
axis.set_xlabel("time/s")
axis.set_ylabel("amplitude")
plt.show()
2. 一幅图中画两条曲线,并加上图例
fig, axis = plt.subplots()
axis.plot(x, y, label='this will be legend?')
axis.plot(x, y **2, label='this will be legend2?')
axis.legend()
axis.set_title("Sine Wave")
axis.set_xlabel("time/s")
axis.set_ylabel("amplitude")
plt.show()
3. 在一个 figure中使用多个子图,这个在深度学习很有用,比如可视化数据集中的一些小图
fig, axs = plt.subplots(2,3)
axs[0,0].plot(x, y, label='aa')
axs[0,0].plot(x, y*2, label='bb')
axs[0,0].set_title('linear')
axs[0,0].legend()
axs[0,1].plot(x, y**2)
axs[0,2].plot(x, y**3)
axs[1,0].plot(x, y**4)
axs[1,1].plot(x, y**5)
axs[1,2].plot(x, y**6)
plt.show()
二、Numpy 和 Matplotlab
- 半透明透明度的rbga 图片
# construct a rgba red image with numpy
import numpy as np
import matplotlib.pyplot as plt
# set alpha to 0.8
fig, axis = plt.subplots(1, 5)
for i in range(0, 5):
im = np.zeros((100,100,4), dtype=np.uint8)
im[:,:,0] = 255
im[:,:,3] = (i+1)*255/5
axis[i].imshow(im)
axis[i].axis('off')
plt.show()
- 各种功能混和展示
import numpy as np
import random
import matplotlib.pyplot as plt
from math import sqrt
pi = 3.14159
h,w = 60,80
# 生成一个白布背景
white_blackground = np.full((h,w,3), 100, dtype=np.uint8)
fig, axis = plt.subplots(2,3)
axis[0][0].imshow(white_blackground)
# 生成像素颜色随机的rgb图片
random_color = np.random.randint(255, size=(h,w,3), dtype=np.uint8)
axis[0][1].imshow(random_color)
# 生成一张rgba图片
rgb_pic = np.zeros(shape=(h,w,4), dtype=np.uint8)
rgb_pic[:] = (255, 0, 0, int(0.7 * 255))
axis[0][2].imshow(rgb_pic)
# 生成像素颜色随机的灰度图片
random_gray = np.random.randint(255, size=(h,w, 1), dtype=np.uint8)
axis[1][0].imshow(random_gray, cmap="gray")
# 生成一个左白右黑的渐变图片
half_black = np.zeros((h,w),dtype=np.uint8)
half_black[:, :w//2] = 255
axis[1][1].imshow(half_black, cmap='gray')
# 生成一个强度满足高斯分布的灰度图片
raw = np.zeros((h,w), dtype=np.float32)
center = (h/2, w/2)
for i in range(h):
for j in range(w):
raw[i][j] = sqrt((i-center[0]) ** 2 + (j - center[1]) ** 2)
def normal(X, scale=1.0):
Y = -1 * (X ** 2 )/ (2 * scale ** 2)
Y = np.exp(Y) / (sqrt(2* pi * scale))
return Y
Y = normal(raw, scale=10.0)
axis[1][2].imshow(Y)
plt.show()
plt 绘制视频
if __name__ == '__main__':
# 创建video writer, 设置好相应参数,fps
metadata = dict(title='01', artist='Matplotlib', comment='depth prediiton')
writer = FFMpegWriter(fps=10, metadata=metadata)
# 读出自己的所有图片
figure = plt.figure(figsize=(10.8, 7.2))
plt.ion() # 为了可以动态显示
plt.tight_layout() # 尽量减少窗口的留白
with writer.saving(figure, 'out.mp4', 100):
# traverse_imgs(writer, images)
x = np.linspace(0, 10, 100)
for i in range(100):
x = np.linspace(0, 10, 100)
y = np.sin(x + i / 10.0 * np.pi)
plt.plot(x, y)
writer.grab_frame()
plt.pause(0.01)
plt.clf()