重点学习了子图和不规则子图的绘制
subplot()
也可用于简单的不规则子图绘制,但更推荐subplot2gird()
import random
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
if __name__ == '__main__':
data1 = pd.read_excel('data1.xlsx')
data2 = pd.read_excel('data2.xlsx')
data3 = pd.read_excel('data3.xlsx')
data1.dropna(inplace=True) # 清理数据,移除NaN行和无效数据
pd.set_option('display.max_rows', None) # None 表示显示所有行
pd.set_option('display.max_columns', None) # None 表示显示所有列
plt.rcParams['font.sans-serif'] = ['SimHei']
ax1 = plt.subplot(2, 2, 1)
plt.bar(data1.loc[2:, '年 龄'], data1.loc[2:, '人口数'])
plt.xticks(rotation=45) # 旋转角度为 45 度
ax1.set_title('分年龄段人数')
plt.ylabel('人口')
plt.xlabel('年龄段')
ax2 = plt.subplot(2, 2, 2)
plt.plot(data2['年 份'], data2['男比重'], label='男比重')
plt.plot(data2['年 份'], data2['女比重'], label='女比重')
plt.legend()
ax2.set_title('分年度男女比')
plt.xlabel('年份')
plt.ylabel('性别比重')
ax3 = plt.subplot(2, 2, 3)
plt.plot(data3['年 份'], data3['自然增长率'])
ax3.set_title('分年人口自然增长率')
plt.xlabel('年份')
plt.xlabel('人口自然增长率')
ax4 = plt.subplot(2, 2, 4)
Y = [abs((x - 2004)/3 * np.random.randint(0, 10)) for x in range(1990, 2006)]
X = list(range(1990, 2006))
Z = [y * random.randint(1, 5) for y in Y]
plt.scatter(X, Y, c=Z, cmap='cividis')
# 添加颜色条
cbar = plt.colorbar()
cbar.set_label('血压') # 颜色条标签
plt.title('随机生成的数据')
plt.xlabel('出生年份')
plt.ylabel('体重')
plt.tight_layout() # 调整子图布局,防止标题重叠
plt.show()
subplots()
使用方法与subplot()略有不同,功能相似
import matplotlib.pyplot as plt
# 创建一个包含两个子图的画布
fig, axs = plt.subplots(1, 2, figsize=(10, 5), dpi=100)
# 在第一个子图上添加绘图元素
axs[0].plot([1, 2, 3], [4, 5, 6])
axs[0].set_title("Subplot 1")
axs[0].set_xlabel("X Label")
axs[0].set_ylabel("Y Label")
# 在第二个子图上添加绘图元素
axs[1].scatter([1, 2, 3], [7, 8, 9], color='r')
axs[1].set_title("Subplot 2")
axs[1].set_xlabel("X Label")
axs[1].set_ylabel("Y Label")
# 调整子图之间的间距
plt.tight_layout()
# 显示绘图
plt.show()
subplot2grid()
Matplotlib 中的 subplot2grid() 函数可以实现对不规则多子图的绘制,即在当前画布对象上 绘制网格(grid),网格可用于在特定位置绘制布局和大小不同的子图对象。subplot2grid() 函 数的语法格式如下。
subplot2grid(shape, location, rowspan/colspan)
该函数的第 1 个参数 shape 规定了的网格的行数和列数,第 2 个参数 location 决定了子图 在网格内的行号和列号,第 3 个参数为 rowspan 或 colspan,它们分别规定了每个子图向下跨越的行数和向右跨越的列数,也就实现了大小不一的子图的绘制。示例代码如下。
1. import matplotlib.pyplot as plt
2. fifig = plt.fifigure()
3. ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=3)
4. ax2 = plt.subplot2grid((3, 3), (1, 0), colspan=2)
5. ax3 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
6. ax4 = plt.subplot2grid((3, 3), (2, 0))
7. ax5 = plt.subplot2grid((3, 3), (2, 1))

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
if __name__ == '__main__':
data1 = pd.read_excel('data1.xlsx')
data2 = pd.read_excel('data2.xlsx')
data3 = pd.read_excel('data3.xlsx')
data1.dropna(inplace=True) # 清理数据,移除NaN行和无效数据
pd.set_option('display.max_rows', None) # None 表示显示所有行
pd.set_option('display.max_columns', None) # None 表示显示所有列
plt.rcParams['font.sans-serif'] = ['SimHei']
fig = plt.figure()
ax1 = plt.subplot2grid((4, 4), (0, 0), rowspan=4, colspan=1)
ax2 = plt.subplot2grid((4, 4), (0, 1), colspan=3)
ax3 = plt.subplot2grid((4, 4), (1, 1), rowspan=2, colspan=2)
ax4 = plt.subplot2grid((4, 4), (1, 3), rowspan=2, colspan=1)
ax5 = plt.subplot2grid((4, 4), (3, 1), rowspan=1, colspan=3)
plt.show()