You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Matplotlib pcolormesh阻止各行绘制块上下连接?

解决竖直色块绘制问题

要实现每个y层的色块保持竖直(仅x方向相连,y方向无斜向连接),可以通过手动绘制矩形补丁的方式,避免pcolormesh默认的斜向单元格连接。具体步骤如下:

  1. 定义y轴的上下边界,确定每个y层的高度范围;
  2. 为每个y层的x坐标计算色块的左右边界(若x是色块中心,则用相邻中心的中点作为边界);
  3. 遍历每个色块,创建竖直矩形并添加到坐标轴;
  4. 配置颜色映射和颜色条。

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:42:06