Matplotlib 在 3d 表面绘制 contourf
Matplotlib plot contourf on 3d surface
我正在尝试使用 matplotlib 中 3d 表面图的颜色图功能,根据另一个数组的值而不是 z 值为表面着色。
曲面图创建并显示如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def gauss(x, y, w_0):
r = np.sqrt(x**2 + y**2)
return np.exp(-2*r**2 / w_0**2)
x = np.linspace(-100, 100, 100)
y = np.linspace(-100, 100, 100)
X, Y = np.meshgrid(x, y)
Z = gauss(X, Y, 50)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, cmap='jet')
现在我不再根据 3d 表面的高度着色,而是希望以另一个数组的形式为表面提供颜色数据,这里以随机数组为例:
color_data = np.random.uniform(0, 1, size=(Z.shape))
但是,我没有找到根据这些值对 3d 表面着色的解决方案。理想情况下,它看起来像 3d 中的 contourf 图,只是在 3d 表面上。
您可以使用 matplotlib.colors.from_levels_and_colors
获取颜色图和标准化,然后将它们应用于要进行颜色映射的值。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.colors
x = np.linspace(-100, 100, 101)
y = np.linspace(-100, 100, 101)
X, Y = np.meshgrid(x, y)
Z = np.exp(-2*np.sqrt(X**2 + Y**2)**2 / 50**2)
c = X+50*np.cos(Y/20) # values to be colormapped
N = 11 # Number of level (edges)
levels = np.linspace(-150,150,N)
colors = plt.cm.get_cmap("RdYlGn", N-1)(np.arange(N-1))
cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors)
color_vals = cmap(norm(c))
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, facecolors=color_vals, rstride=1, cstride=1)
plt.show()
我正在尝试使用 matplotlib 中 3d 表面图的颜色图功能,根据另一个数组的值而不是 z 值为表面着色。 曲面图创建并显示如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def gauss(x, y, w_0):
r = np.sqrt(x**2 + y**2)
return np.exp(-2*r**2 / w_0**2)
x = np.linspace(-100, 100, 100)
y = np.linspace(-100, 100, 100)
X, Y = np.meshgrid(x, y)
Z = gauss(X, Y, 50)
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, cmap='jet')
现在我不再根据 3d 表面的高度着色,而是希望以另一个数组的形式为表面提供颜色数据,这里以随机数组为例:
color_data = np.random.uniform(0, 1, size=(Z.shape))
但是,我没有找到根据这些值对 3d 表面着色的解决方案。理想情况下,它看起来像 3d 中的 contourf 图,只是在 3d 表面上。
您可以使用 matplotlib.colors.from_levels_and_colors
获取颜色图和标准化,然后将它们应用于要进行颜色映射的值。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.colors
x = np.linspace(-100, 100, 101)
y = np.linspace(-100, 100, 101)
X, Y = np.meshgrid(x, y)
Z = np.exp(-2*np.sqrt(X**2 + Y**2)**2 / 50**2)
c = X+50*np.cos(Y/20) # values to be colormapped
N = 11 # Number of level (edges)
levels = np.linspace(-150,150,N)
colors = plt.cm.get_cmap("RdYlGn", N-1)(np.arange(N-1))
cmap, norm = matplotlib.colors.from_levels_and_colors(levels, colors)
color_vals = cmap(norm(c))
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
ax.plot_surface(X, Y, Z, facecolors=color_vals, rstride=1, cstride=1)
plt.show()