Python Matplotlib“;“补丁”;三维三角网格的类函数

Python Matplotlib“;“补丁”;三维三角网格的类函数,python,matplotlib,Python,Matplotlib,我想使用MATPLOTLIB绘制三维有限元网格。我在使用MAYAVI时遇到了一些问题,所以这种解决方案不适用 我需要一些类似Matlab“补丁”的函数,如下所示: x = [0.0, 1.0, 0.0]; y = [0.0, 0.0, 1.0]; z = [0.0, 1.0, 1.0]; v = 100.0; view(3) patch(x, y, z, v) hold on; x = [1.0, 1.0, 0.0]; y = [0.0, 1.0, 1.0]; z = [1.0, 0.0, 1.

我想使用MATPLOTLIB绘制三维有限元网格。我在使用MAYAVI时遇到了一些问题,所以这种解决方案不适用

我需要一些类似Matlab“补丁”的函数,如下所示:

x = [0.0, 1.0, 0.0];
y = [0.0, 0.0, 1.0];
z = [0.0, 1.0, 1.0];
v = 100.0;
view(3)
patch(x, y, z, v)
hold on;
x = [1.0, 1.0, 0.0];
y = [0.0, 1.0, 1.0];
z = [1.0, 0.0, 1.0];
v = 50.0;
patch(x, y, z, v)
在这段代码中,“v”是在每个三角形的中心计算的标量场。 它生成下面的图像

下面的代码会产生类似的结果,但您需要使用一些参数(颜色贴图、规格化范围(vmin、vmax)、视图角度、轴刻度位置)来获得您想要的结果:

import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection


def patch(ax, x, y, z, v, vmin=0, vmax=100, cmap_name='viridis'):
    cmap = mpl.cm.get_cmap(cmap_name)               # Get colormap by name
    c = cmap(mpl.colors.Normalize(vmin, vmax)(v))   # Normalize value and get color
    pc = Poly3DCollection([list(zip(x,y,z))])       # Create PolyCollection from coords
    pc.set_facecolor(c)                             # Set facecolor to mapped value
    pc.set_edgecolor('k')                           # Set edgecolor to black
    ax.add_collection3d(pc)                         # Add PolyCollection to axes
    return pc

def view(ax, code):
    if code == 2: #view(2) sets the default two-dimensional view, az = 0, el = 90.
        ax.view_init(90, 0)     # (args are reversed from MATLAB)

    if code == 3: #view(3) sets the default three-dimensional view, az = –37.5, el = 30.
        ax.view_init(30, -37.5)


fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = [0.0, 1.0, 0.0];
y = [0.0, 0.0, 1.0];
z = [0.0, 1.0, 1.0];
v = 100.0;

patch(ax, x, y, z, v)

x = [1.0, 1.0, 0.0];
y = [0.0, 1.0, 1.0];
z = [1.0, 0.0, 1.0];
v = 50.0;
patch(ax, x, y, z, v)

view(ax, 3)
plt.show()
产生:


(答案顶部的图像被旋转,以获得与你在问题中的视图相似的视图,因为有些东西似乎不对劲)。

我认为这正是你需要的,因此可能是一个重复的问题。不,不是。在post中,仅打印曲面。我需要使用颜色渐变来表示标量向量。OP在他的问题中包含了一个更新的答案,其中添加了color
tri.set\u color(colors.rgb2hex(sp.rand(3))