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

如何在Matplotlib的笛卡尔坐标系中生成离散极坐标曲面图?

在Matplotlib的2D笛卡尔坐标系中绘制带离散弧形单元的曲面图

你可以通过两种方式实现需求,核心是利用极坐标转笛卡尔坐标的网格数据,结合Matplotlib的2D绘图函数完成:

方法一:直接使用pcolormesh绘制(简洁高效)

这是最直接的方案,你已经通过meshgrid生成了笛卡尔坐标系下的X、Y网格,只需调用pcolormesh并设置shading="nearest",就能得到和极坐标版本一致的离散弧形单元效果,同时保持笛卡尔坐标系。

注意修正原代码中Y轴计算的错误(原代码误用了一维数组r而非网格数组R):

import numpy as np
import matplotlib.pyplot as plt

r = np.linspace(2, 5, 25)
theta = np.linspace(0, np.pi, 25)
R, Theta = np.meshgrid(r, theta)

# 修正Y的计算,确保使用网格数组R而非一维数组r
X = R * np.cos(Theta)
Y = R * np.sin(Theta)
U = R * np.cos(Theta) * np.exp(R * Theta / 500)

fig, ax = plt.subplots(figsize=(8, 6))
# 用pcolormesh绘制笛卡尔坐标系下的离散单元
pc = ax.pcolormesh(X, Y, U, cmap="viridis", shading="nearest")
ax.set_aspect("equal")  # 保持坐标轴比例一致,避免图形变形
fig.colorbar(pc, shrink=0.5, aspect=5)
fig.tight_layout()
plt.show()

方法二:手动绘制弧形多边形单元(高度定制化)

如果需要对每个弧形单元的样式(比如边框、透明度等)进行精细控制,可以遍历每个网格单元,将极坐标顶点转换为笛卡尔坐标后,用Polygon补丁逐个绘制:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

r = np.linspace(2, 5, 25)
theta = np.linspace(0, np.pi, 25)
R, Theta = np.meshgrid(r, theta)
U = R * np.cos(Theta) * np.exp(R * Theta / 500)

fig, ax = plt.subplots(figsize=(8, 6))
ax.set_aspect("equal")

# 遍历所有网格单元(排除最后一行/列的边界)
for i in range(len(r) - 1):
    for j in range(len(theta) - 1):
        # 获取当前单元的极坐标范围
        r_inner, r_outer = r[i], r[i+1]
        th_start, th_end = theta[j], theta[j+1]
        # 将四个顶点转换为笛卡尔坐标
        vertices = [
            (r_inner * np.cos(th_start), r_inner * np.sin(th_start)),
            (r_outer * np.cos(th_start), r_outer * np.sin(th_start)),
            (r_outer * np.cos(th_end), r_outer * np.sin(th_end)),
            (r_inner * np.cos(th_end), r_inner * np.sin(th_end)),
        ]
        # 根据U值获取对应颜色
        color = plt.cm.viridis(U[j, i] / U.max())
        # 创建多边形并添加到坐标轴
        poly = Polygon(vertices, facecolor=color, edgecolor='none')
        ax.add_patch(poly)

# 设置坐标轴范围,确保图形完整显示
x_min, x_max = X.min(), X.max()
y_min, y_max = Y.min(), Y.max()
ax.set_xlim(x_min - 0.1, x_max + 0.1)
ax.set_ylim(y_min - 0.1, y_max + 0.1)

# 添加颜色条
sm = plt.cm.ScalarMappable(cmap="viridis", norm=plt.Normalize(vmin=U.min(), vmax=U.max()))
sm.set_array([])
fig.colorbar(sm, shrink=0.5, aspect=5)

fig.tight_layout()
plt.show()

两种方案对比

  • 方法一:代码简洁,执行效率高,适合快速生成符合需求的图形;
  • 方法二:可以对每个单元进行单独定制,适合需要特殊样式(如添加单元边框、调整局部透明度等)的场景。

内容的提问来源于stack exchange,提问作者jared

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:05:22