簡體   English   中英

matplotlib 3D plot 中的平面

[英]Flat surfaces in matplotlib 3D plot

我正在嘗試使用 matplotlib 創建一個 3D plot,它代表特定域的外邊界。 該邊界由上表面和下表面組成,使用plot_surface方法很容易將其可視化。 我的問題是可視化平行於 xz 和 yz 平面的四個平面(見下圖)。 由於這些表面也限制了域,我希望它們的顏色稍微透明。 我的問題是,我怎樣才能做到這一點? 上下邊界的最小工作示例以及說明所需結果的圖像附在下面。 提前感謝您的幫助!

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

# Values for g11up and g11dw
x = np.linspace(-1, 1, 50)

# Meshgrid
X, Y = np.meshgrid(x, x)
Z = 2 - (X**2 + Y**2)

# Create figure and axes
fig = plt.figure(figsize=(4, 4.5))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_zlabel(r'$z$')

# Plot the upper surface
ax.plot_surface(X, Y, -Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot the lower surface
ax.plot_surface(X, Y, Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot edges
z = 1-x**2
for sign in [1, -1]:
    ax.plot(x, np.ones(len(x)), sign*z, color='k', lw=1, zorder=3)
    ax.plot(x, -np.ones(len(x)), sign*z, color='k', lw=1, zorder=4)
    ax.plot(np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=4)
    ax.plot(-np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=3)

ax.set_aspect('equal')
plt.show()
plt.close()

在此處輸入圖像描述

這里是 go:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Poly3DCollection # New import

# Values for g11up and g11dw
x = np.linspace(-1, 1, 50)

# Meshgrid
X, Y = np.meshgrid(x, x)
Z = 2 - (X**2 + Y**2)

# Create figure and axes
fig = plt.figure(figsize=(4, 4.5))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel(r'$x$')
ax.set_ylabel(r'$y$')
ax.set_zlabel(r'$z$')

# Plot the upper surface
ax.plot_surface(X, Y, -Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot the lower surface
ax.plot_surface(X, Y, Z, cmap=cm.Blues, vmin=-2*Z.max(), vmax=Z.max(),
                alpha=0.9, linewidth=0)

# Plot edges
z = 1-x**2
for sign in [1, -1]:
    ax.plot(x, np.ones(len(x)), sign*z, color='k', lw=1, zorder=3)
    ax.plot(x, -np.ones(len(x)), sign*z, color='k', lw=1, zorder=4)
    ax.plot(np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=4)
    ax.plot(-np.ones(len(x)), x, sign*z, color='k', lw=1, zorder=3)

# Plot faces
for sign in [1,-1]:
    xyz_upper = np.stack((x,sign*np.ones(x.shape), z)).T
    xyz_lower = np.stack((x,sign*np.ones(x.shape),-z)).T[::-1]
    xyz = np.concatenate((xyz_upper,xyz_lower))
    verts = [ ( xyz[i,0], xyz[i,1], xyz[i,2] ) for i in range(xyz.shape[0])  ]
    ax.add_collection3d(Poly3DCollection([verts], alpha=0.5, facecolor='orange'))

ax.set_aspect('equal')
plt.show()

必須有一種將 numpy 數組直接傳遞給Poly3DCollection而不將其轉換為元組列表的方法,但我沒有尋找它。

這是結果:

在此處輸入圖像描述

顯然我選擇了橙色,我只畫了兩個垂直於 y 軸的面,但將它延伸到另一邊是筆直的。

我的回答受到了這個答案的啟發。 更改顏色時,您可能會遇到此錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM