如何在Matplotlib单图多子图中为每个子图添加均值标题?
实现方案
要给每个子图添加对应的均值标题,核心是在筛选符合条件的网格单元时,同时保存该单元的均值,之后在绘制子图时调用set_title()方法设置标题。以下是修改后的完整代码:
import matplotlib.pyplot as plt import numpy as np x=np.array([11,12,12,13,21,14]) y=np.array([28,5,15,16,12,4]) v=np.array([10,5,2,10,6,7]) x = x // 4 y = y // 4 k=10 cells = [[[] for _ in range(k)] for _ in range(k)] # 创建x-y平面的网格单元 # 将v值分配到对应网格单元 for ycell in range(k): for xcell in range(k): cells[ycell][xcell] = v[(y == ycell) & (x == xcell)] # 计算每个网格单元的均值,并筛选均值>2的单元(同时保存数据和均值) mean_v = [[0.0 for _ in range(k)] for _ in range(k)] to_plot = [] for ycell in range(k): for xcell in range(k): cell_data = cells[ycell][xcell] mean_val = np.mean(cell_data) mean_v[ycell][xcell] = mean_val if mean_val > 2: # 存储数据和对应的均值,用元组打包 to_plot.append( (cell_data, mean_val) ) plt.rcParams["figure.figsize"] = (20, 10) SIZE = 5 f, ax = plt.subplots(SIZE,SIZE) for idx, (data, mean_val) in enumerate(to_plot): x_pos = idx % SIZE y_pos = idx // SIZE ax[y_pos, x_pos].hist(data) # 设置子图标题,格式化均值显示(保留2位小数) ax[y_pos, x_pos].set_title(f"Mean: {mean_val:.2f}") # 调整子图间距,避免标题和图形重叠 plt.tight_layout() plt.show()
关键改动说明:
- 修改
to_plot的存储结构:把原来只存网格数据的列表,改成存储(数据, 均值)的元组列表,这样绘制时能直接获取当前子图对应的均值。 - 添加标题设置:在循环绘制每个子图时,调用
ax[y_pos, x_pos].set_title(),用格式化字符串把均值作为标题内容,:.2f是为了让均值显示更整洁(保留2位小数)。 - 优化冗余代码:删除了原代码中重复填充
cells的循环,同时把mean_v的初始化改成了更合理的浮点数类型。 - 添加
tight_layout():自动调整子图间距,避免标题和相邻子图的图形重叠,提升可视化效果。
内容的提问来源于stack exchange,提问作者Jerome
相关产品推荐
相关产品推荐

