matplotlib¶
In [1]:
Copied!
import matplotlib.pyplot as plt
import numpy as np
# print(plt.style.available)
plt.style.use('seaborn-v0_8-whitegrid')
import matplotlib.pyplot as plt
import numpy as np
# print(plt.style.available)
plt.style.use('seaborn-v0_8-whitegrid')
基本二维图绘制 ¶
In [2]:
Copied!
# 绘制正/余弦函数
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.figure(figsize=(6, 1.5), dpi=128, frameon=True) # 设置图像大小,分辨率
plt.plot(X, C, color="r", marker=',', lw=0.5) # linewidth
plt.xticks(np.linspace(-3, 3, 7, endpoint=True))
plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])
plt.xlim(-4.0, 4.0)
plt.ylim(-1.1, 1.1)
plt.xlabel('x')
plt.ylabel('y=cos(x)')
plt.title('cosine', fontsize=16, y=-0.75)
plt.text(2, 0, r'$\cos(x)$', fontsize=10, ha='center', va='center') # 如果不设置 ha/va ,默认以(2,0)为左下角
plt.show()
# 绘制正 / 余弦函数
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.figure(figsize=(6, 1.5), dpi=128, frameon=True) # 设置图像大小,分辨率
plt.plot(X, C, color="r", marker=',', lw=0.5) # linewidth
plt.xticks(np.linspace(-3, 3, 7, endpoint=True))
plt.yticks([-1, 0, +1], [r'$-1$', r'$0$', r'$+1$'])
plt.xlim(-4.0, 4.0)
plt.ylim(-1.1, 1.1)
plt.xlabel('x')
plt.ylabel('y=cos(x)')
plt.title('cosine', fontsize=16, y=-0.75)
plt.text(2, 0, r'$\cos(x)$', fontsize=10, ha='center', va='center') # 如果不设置 ha/va ,默认以(2,0)为左下角
plt.show()
多子图绘制 ¶
In [3]:
Copied!
# 创立多张子图
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(5, 4), dpi=128)
## 统一设置子图参数
for ax in axs.flat:
# ax.set_xlim(-4.0, 4.0)
# ax.set_ylim(-1.1, 1.1)
# ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
# [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
# ax.set_yticks(np.arange(-1, 1.5, 0.5))
ax.set(xlim=(-4.0, 4.0), ylim=(-1.1, 1.1), xticks=[-np.pi, -np.pi/2, 0, np.pi/2, np.pi], xticklabels=[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'], yticks=np.arange(-1, 1.5, 0.5))
axs[0, 0].plot(X, S, color='g', linestyle="-.")
axs[0, 1].plot(X, C, color="red", marker=',', lw=0.5)
axs[1, 0].plot(X, S, color='b', linestyle="--")
axs[1, 1].plot(X, C, color="purple", marker='o', lw=0.5, markersize=3)
plt.show()
# 创立多张子图
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(5, 4), dpi=128)
## 统一设置子图参数
for ax in axs.flat:
# ax.set_xlim(-4.0, 4.0)
# ax.set_ylim(-1.1, 1.1)
# ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
# [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'])
# ax.set_yticks(np.arange(-1, 1.5, 0.5))
ax.set(xlim=(-4.0, 4.0), ylim=(-1.1, 1.1), xticks=[-np.pi, -np.pi/2, 0, np.pi/2, np.pi], xticklabels=[r'$-\pi$', r'$-\pi/2$', r'$0$', r'$+\pi/2$', r'$+\pi$'], yticks=np.arange(-1, 1.5, 0.5))
axs[0, 0].plot(X, S, color='g', linestyle="-.")
axs[0, 1].plot(X, C, color="red", marker=',', lw=0.5)
axs[1, 0].plot(X, S, color='b', linestyle="--")
axs[1, 1].plot(X, C, color="purple", marker='o', lw=0.5, markersize=3)
plt.show()
In [4]:
Copied!
fig = plt.figure(figsize=(6,6))
# print(plt.axes) # 可以默认值[0.125, 0.125, 0.775, 0.755]
# 绘制默认坐标
plt.axes()
# 在 Figure 原点绘制子坐标 1,高度和宽度分别为 20% 的 Figure 的高和宽
ax1 = plt.axes([0.0, 0.0, 0.2, 0.2])
ax1.plot([0,1], [0,1], c='r')
# 在 Figure 的 60% 处绘制子坐标 1,高度和宽度分别为 20% 的 Figure 的高和宽
ax2 = plt.axes([0.6, 0.6, 0.2, 0.2])
x = np.linspace(0, 1, 2)
y = x
ax2.plot(x, y, c='g')
plt.show()
fig = plt.figure(figsize=(6,6))
# print(plt.axes) # 可以默认值[0.125, 0.125, 0.775, 0.755]
# 绘制默认坐标
plt.axes()
# 在 Figure 原点绘制子坐标 1,高度和宽度分别为 20% 的 Figure 的高和宽
ax1 = plt.axes([0.0, 0.0, 0.2, 0.2])
ax1.plot([0,1], [0,1], c='r')
# 在 Figure 的 60% 处绘制子坐标 1,高度和宽度分别为 20% 的 Figure 的高和宽
ax2 = plt.axes([0.6, 0.6, 0.2, 0.2])
x = np.linspace(0, 1, 2)
y = x
ax2.plot(x, y, c='g')
plt.show()
In [5]:
Copied!
# 不规则子图
fig = plt.figure(figsize=(8,6))
# 创建 2 行 3 列网格对象
grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3)
# 通过类似 Python 切片的语法设置子图的位置和扩展尺寸
plt.subplot(grid[0, 0]) # 第一个子图占用 1 行 1 列空间
plt.subplot(grid[0, 1:])# 第二个子图占用 1 行 2 列空间
plt.subplot(grid[1, :2])# 第三个子图占用 1 行 2 列空间
plt.subplot(grid[1, 2]) # 第四个子图占用 1 行 1 列空间
# 在最后一个子图中绘制直线
plt.plot([0,1], [0,1])
plt.show()
# 不规则子图
fig = plt.figure(figsize=(8,6))
# 创建 2 行 3 列网格对象
grid = plt.GridSpec(2, 3, wspace=0.4, hspace=0.3)
# 通过类似 Python 切片的语法设置子图的位置和扩展尺寸
plt.subplot(grid[0, 0]) # 第一个子图占用 1 行 1 列空间
plt.subplot(grid[0, 1:])# 第二个子图占用 1 行 2 列空间
plt.subplot(grid[1, :2])# 第三个子图占用 1 行 2 列空间
plt.subplot(grid[1, 2]) # 第四个子图占用 1 行 1 列空间
# 在最后一个子图中绘制直线
plt.plot([0,1], [0,1])
plt.show()
移动脊柱 ( 坐标轴 ) ¶
坐标轴线和上面的记号连在一起就形成了脊柱(Spines
In [6]:
Copied!
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.figure(figsize=(5, 4), dpi=128, frameon=True)
plt.plot(X, C, color="g", lw=0.5)
ax = plt.gca() # Get the current Axes.If there is currently no Axes on this Figure, a new one is created using `.Figure.add_subplot`.
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('right')
ax.spines['right'].set_position(('data', 0))
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.figure(figsize=(5, 4), dpi=128, frameon=True)
plt.plot(X, C, color="g", lw=0.5)
ax = plt.gca() # Get the current Axes.If there is currently no Axes on this Figure, a new one is created using `.Figure.add_subplot`.
ax.spines['left'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('right')
ax.spines['right'].set_position(('data', 0))
添加图例 ¶
In [7]:
Copied!
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.figure(figsize=(8, 6))
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cos(x)")
plt.plot(X, S, color="orange", linewidth=2.5, linestyle="-", label="sin(x)")
plt.legend(loc='upper left')
plt.title("sin(x) and cos(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
# plt.savefig("sin_cos.png")
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.figure(figsize=(8, 6))
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-", label="cos(x)")
plt.plot(X, S, color="orange", linewidth=2.5, linestyle="-", label="sin(x)")
plt.legend(loc='upper left')
plt.title("sin(x) and cos(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
# plt.savefig("sin_cos.png")
特殊点做注释 ¶
In [8]:
Copied!
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="orange", linewidth=2.5, linestyle="-")
t = 2 * np.pi / 3
# 两个坐标点,画一条竖线
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=1.5, linestyle="--")
# 在竖线一端画一个点,颜色 blue,30个像素宽
plt.scatter([t,],[np.cos(t),], 30, color ='blue')
# 在特定点添加注释
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
xy=(t,np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.plot([t,t],[0,np.sin(t)], color ='orange', linewidth=1.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 30, color ='orange')
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
# plt.axis('off') # 关闭坐标轴
plt.show()
X = np.linspace(-np.pi, np.pi, 64, endpoint=True) # x 轴
C, S = np.cos(X), np.sin(X) # y 轴
plt.plot(X, C, color="blue", linewidth=2.5, linestyle="-")
plt.plot(X, S, color="orange", linewidth=2.5, linestyle="-")
t = 2 * np.pi / 3
# 两个坐标点,画一条竖线
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=1.5, linestyle="--")
# 在竖线一端画一个点,颜色 blue,30个像素宽
plt.scatter([t,],[np.cos(t),], 30, color ='blue')
# 在特定点添加注释
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
xy=(t,np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
plt.plot([t,t],[0,np.sin(t)], color ='orange', linewidth=1.5, linestyle="--")
plt.scatter([t,],[np.sin(t),], 30, color ='orange')
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2"))
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
# plt.axis('off') # 关闭坐标轴
plt.show()
绘制散点图 ¶
In [9]:
Copied!
fig = plt.figure(figsize=(6,3))
x = np.linspace(0, 10, 30)
y = np.sin(x)
# plot 绘制散点图时令 linestyle=''
plt.plot(x, y, linestyle='', marker='o', color='red',markersize=5, markerfacecolor='orange', markeredgecolor='black')
# 约等价于(去掉 `-`)
# plt.plot(x, y, '-or')
plt.ylim(-1.5, 1.5)
plt.show()
fig = plt.figure(figsize=(6,3))
x = np.linspace(0, 10, 30)
y = np.sin(x)
# plot 绘制散点图时令 linestyle=''
plt.plot(x, y, linestyle='', marker='o', color='red',markersize=5, markerfacecolor='orange', markeredgecolor='black')
# 约等价于(去掉 `-`)
# plt.plot(x, y, '-or')
plt.ylim(-1.5, 1.5)
plt.show()
In [10]:
Copied!
# scatter 支持对每个点设置不同的颜色和大小
def scatter_create_color_graph():
x = [i for i in range(20)]
y = [i for i in range(20)]
plt.figure(figsize=(10, 8), dpi=72)
plt.xticks(x)
plt.yticks(y)
c = np.linspace(0, 0xffffff, 20, endpoint=False)
plt.scatter(x, y, c=c, s=200, marker='o')
plt.show()
scatter_create_color_graph() # 这里受到上面设置的影响显示不当,可以放到新的文件中运行
# scatter 支持对每个点设置不同的颜色和大小
def scatter_create_color_graph():
x = [i for i in range(20)]
y = [i for i in range(20)]
plt.figure(figsize=(10, 8), dpi=72)
plt.xticks(x)
plt.yticks(y)
c = np.linspace(0, 0xffffff, 20, endpoint=False)
plt.scatter(x, y, c=c, s=200, marker='o')
plt.show()
scatter_create_color_graph() # 这里受到上面设置的影响显示不当,可以放到新的文件中运行
In [11]:
Copied!
def scatter_create_random_graph():
"""随机散点图"""
x = np.random.randn(100)
y = np.random.randn(100)
plt.scatter(x, y, c='m', marker='.', s=500, alpha=0.6)
plt.show()
scatter_create_random_graph()
def scatter_create_random_graph():
"""随机散点图"""
x = np.random.randn(100)
y = np.random.randn(100)
plt.scatter(x, y, c='m', marker='.', s=500, alpha=0.6)
plt.show()
scatter_create_random_graph()
基本三维图绘制 ¶
In [12]:
Copied!
# 对应使用 plot3D scatter3D
ax = plt.axes(projection='3d')
# 三维线的数据
zline = np.linspace(0, 15, 1000)
xline = 2 * np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'r')
plt.ylim(-2, 2)
zdata = 15 * np.random.random(100)
xdata = 2 * 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='hot')
plt.show()
# 对应使用 plot3D scatter3D
ax = plt.axes(projection='3d')
# 三维线的数据
zline = np.linspace(0, 15, 1000)
xline = 2 * np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'r')
plt.ylim(-2, 2)
zdata = 15 * np.random.random(100)
xdata = 2 * 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='hot')
plt.show()
其他图 ¶
条形图,饼图,直方图,等高线图 等等平时用的不多,就不学了,需要时再看 https://mlhowto.readthedocs.io/en/latest/matplot.html#id29 。