如何使用Matplotlib pcolormesh阻止各行绘制块上下连接?
解决竖直色块绘制问题
要实现每个y层的色块保持竖直(仅x方向相连,y方向无斜向连接),可以通过手动绘制矩形补丁的方式,避免pcolormesh默认的斜向单元格连接。具体步骤如下:
- 定义y轴的上下边界,确定每个y层的高度范围;
- 为每个y层的x坐标计算色块的左右边界(若x是色块中心,则用相邻中心的中点作为边界);
- 遍历每个色块,创建竖直矩形并添加到坐标轴;
- 配置颜色映射和颜色条。
修改后的完整代码:
import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Rectangle y_values = np.array([0, 1, 2, 3, 4, 5], dtype=float) x_list = range(50, 70) x_values_list = [] z_values_list = [] for i in range(len(y_values)): x_value_single_list = [np.array(0.01*x**2 + 0.1*x*i + 0.3 * i, dtype= float) for x in x_list] x_values_list.append(np.array(x_value_single_list)) z_values_list.append(np.random.rand(20)) # 计算y轴边界,确定每个y层的上下范围 y_edges = np.append(y_values, y_values[-1] + (y_values[1] - y_values[0])) y_height = y_edges[1] - y_edges[0] # 配置颜色映射和归一化(统一Z值的颜色范围) z_min = np.min(z_values_list) z_max = np.max(z_values_list) norm = plt.Normalize(z_min, z_max) cmap = plt.get_cmap('viridis') fig, ax = plt.subplots() # 遍历每个y层,绘制竖直色块 for i in range(len(y_values)): y_bottom = y_values[i] x = x_values_list[i] z = z_values_list[i] # 计算x方向的色块边界(用相邻x的中点作为边界,首尾补全) x_midpoints = (x[:-1] + x[1:]) / 2 x_edges = np.concatenate([ [x[0] - (x_midpoints[0] - x[0])], x_midpoints, [x[-1] + (x[-1] - x_midpoints[-1])] ]) # 绘制每个色块 for j in range(len(z)): x_left = x_edges[j] x_right = x_edges[j+1] color = cmap(norm(z[j])) rect = Rectangle((x_left, y_bottom), x_right - x_left, y_height, color=color) ax.add_patch(rect) # 设置坐标轴范围 x_min = np.min([np.min(x_arr) for x_arr in x_values_list]) x_max = np.max([np.max(x_arr) for x_arr in x_values_list]) ax.set_xlim(x_min, x_max) ax.set_ylim(y_values[0], y_edges[-1]) # 添加颜色条 sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) plt.colorbar(sm, ax=ax) plt.show()
代码说明
- 手动计算每个色块的
x_edges:通过相邻x坐标的中点确定色块左右边界,首尾位置通过外推补全,确保每个Z值对应一个独立的水平区间; - 用
Rectangle绘制竖直矩形:每个色块的高度固定为y层的间隔,宽度为x区间的长度,颜色由Z值通过统一的颜色映射生成; - 统一颜色范围:通过
Normalize确保所有Z值使用相同的颜色刻度,颜色条与色块匹配。
内容的提问来源于stack exchange,提问作者introlol
相关产品推荐
相关产品推荐

