补充几个不常用的图像绘制的示例代码。

直方图

函数原型为

1
2
def ax.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs):
...

其中的主要选项包括:

  • x,要统计的数据,array or sequence of arrays
  • bins,决定数据 x 如何被分割
    • 如果 bins 是整数 n,则数据 x 分割为 n 个等宽部分
    • 如果 bins 是一个序列,则定义 bin 的边缘,包括第一个 bin 的左边缘和最后一个 bin 的右边缘,这样 bin 可能不等距
    • 如果 bins 是字符串,则支持分割策略,'auto', 'fd', 'doane', 'scott', 'stone', 'rice', 'sturges', or 'sqrt'
  • density,是否绘制概率密度,bool,default: False
  • weights,与 x 形状相同的权重数组,array or sequence of arrays,default: None
  • cumulative,是否累计,bool,default: False
  • bottom,每个条形的基底部高度,必须与 bin 相匹配,default: None
  • histtype,直方图的类型,{'bar', 'barstacked', 'step', 'stepfilled'},default: 'bar'
  • align,对齐方式,{'left', 'mid', 'right'}, default: 'mid'
  • orientation,直方图的方向,{'vertical', 'horizontal'}, default: 'vertical'
  • rwidthfloat,条的相对宽度,float,default: None

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
np.random.seed(0)
x = 4 + np.random.normal(0, 1, 2000)

fig, axes = plt.subplots(2, 2, figsize=(9, 6))

axes[0, 0].hist(x, bins=8, linewidth=0.5, edgecolor="white")
axes[0, 0].set_title("bins=8")

axes[0, 1].hist(x, bins=np.arange(0, 8, 0.5), linewidth=0.5, edgecolor="white")
axes[0, 1].set_title("bins=np.arange(0,8,0.5)")

axes[1, 0].hist(
x, bins=np.arange(0, 8, 0.5), linewidth=0.5, edgecolor="white", density=True
)
axes[1, 0].set_title("density=True")

axes[1, 1].hist(
x, bins=np.arange(0, 8, 0.5), linewidth=0.5, edgecolor="white", cumulative=True
)
axes[1, 1].set_title("cumulative=True")

for i in np.arange(2):
for j in np.arange(2):
axes[i, j].set(xlim=[0, 8])

饼图

直接用例子吧,很少用饼图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
fig, axes = plt.subplots(2, 2, figsize=(8, 8))

labels = ["大型", "中型", "小型", "微型"] # 定义标签
sizes = [46, 253, 321, 66] # 每块值

axes[0, 0].pie(
sizes, # 数据
explode=(0, 0, 0, 0), # 将某一块分割出来,值越大分割出的间隙越大
labels=labels, # 标签
colors=["red", "yellowgreen", "lightskyblue", "yellow"], # 每块颜色定义
autopct="%3.2f%%", # 数值保留固定小数位
shadow=False, # 无阴影设置
startangle=90, # 逆时针起始角度设置
pctdistance=0.6, # 数值距圆心半径倍数距离
)

axes[0, 0].legend()

axes[0, 1].pie(
sizes, # 数据
explode=(0.1, 0.05, 0.05, 0.05), # 将某一块分割出来,值越大分割出的间隙越大
labels=labels, # 标签
colors=["red", "yellowgreen", "lightskyblue", "yellow"], # 每块颜色定义
autopct="%3.2f%%", # 数值保留固定小数位
shadow=False, # 无阴影设置
startangle=90, # 逆时针起始角度设置
pctdistance=0.6, # 数值距圆心半径倍数距离
)

axes[1, 0].pie(
sizes, # 数据
explode=(0.1, 0.05, 0.05, 0.05), # 将某一块分割出来,值越大分割出的间隙越大
labels=labels, # 标签
colors=["red", "yellowgreen", "lightskyblue", "yellow"], # 每块颜色定义
autopct="%3.2f%%", # 数值保留固定小数位
shadow=True, # 无阴影设置
startangle=90, # 逆时针起始角度设置
pctdistance=0.6, # 数值距圆心半径倍数距离
)

axes[1, 1].pie(
sizes, # 数据
explode=(0.1, 0.05, 0.05, 0.05), # 将某一块分割出来,值越大分割出的间隙越大
labels=labels, # 标签
colors=["red", "yellowgreen", "lightskyblue", "yellow"], # 每块颜色定义
autopct="%3.2f%%", # 数值保留固定小数位
shadow=True, # 无阴影设置
startangle=90, # 逆时针起始角度设置
pctdistance=0.7, # 数值距圆心半径倍数距离
)

等值线图

最简单的例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 生成(X,Y)网格数据
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(xlist, ylist)

# 生成Z
Z = np.sqrt(X**2 + 2*Y**2)

# 绘制等值线图,添加colorbar
fig,ax=plt.subplots()
cp = ax.contourf(X, Y, Z)
fig.colorbar(cp)

# 补充细节
ax.set_title('Filled Contours Plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_aspect('equal')

包括如下几个部分:

  • 生成 (X,Y,Z) 网格数据
  • 绘制等值线图并添加 colorbar
  • 补充细节