6

我有一个简单的任务,应该有一个简单的解决方案,但我已经尝试了好几天了。我试着具体一点。

  • 我尝试使用 matplotlib 的 mplot3d 和 plot_surface 绘制曲面。当我绘制数据集“z”的表面并尝试将颜色图缩放到某个最大值时,我将“vmax”属性更改为该值。这很好用。

  • 当我尝试绘制一个数据集 (z) 的表面并使用第二个数据集 (fc) 的 facecolors 时,这也可以正常工作。

  • 当我想缩放 facecolors 的颜色图时,facecolors 值会覆盖 vmax 属性。因此 Vmax 无效(尝试 1)。线条也消失了,但这是另一个问题。

  • 同样尝试更改 facecolor 数据集 (fc) 的值也没有达到预期的效果 (attempt2)。

我尝试得到一个带有缩放颜色图的图形(如下图“缩放”),但缩放到 facecolors,而不是 z 值。

下面的代码就是我现在所拥有的,结果如下所示:

在此处输入图像描述

有谁知道我在这里想念什么?任何想法表示赞赏!

import pylab as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

plt.ion()

# creating dataset
profile = np.arange(20)**2
z = profile.repeat(20).reshape(20,20)
fc= np.rot90(z.copy())

x = np.arange(z.shape[0])
y = np.arange(z.shape[1])
X, Y = np.meshgrid(x,y)

# plotting
vmax = 100
fig = plt.figure()
ax = fig.add_subplot(1,4,1, projection='3d', azim=210)
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1)
ax.set_title('normal')

ax = fig.add_subplot(1,4,2, projection='3d', azim=210)
ax.plot_surface(X,Y,z, cmap=plt.cm.jet, cstride=1, rstride=1, vmax=vmax)
ax.set_title('scaled')

ax = fig.add_subplot(1,4,3, projection='3d', azim=210)
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1, vmax=vmax)
ax.set_title('rotated (attempt1)')

ax = fig.add_subplot(1,4,4, projection='3d', azim=210)
fc[fc> vmax] = vmax
ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(fc), cstride=1, rstride=1)
ax.set_title('rotated (attempt2)')
4

1 回答 1

3

一个 - 肮脏的 - 解决方案是重新调整剪裁的面部颜色,使最大值等于您的高度图的最大值(除了您建议的尝试 2 之外):

ax.plot_surface(X,Y,z, facecolors=plt.cm.jet(np.clip(fc,0,vmax)*np.max(z)/vmax), cstride=1, rstride=1, vmax=vmax)

这是否给出了您正在寻找的结果?

于 2012-07-13T12:00:25.793 回答