6

簡単な解決策が必要な簡単なタスクがありますが、私は何日も試しています。具体的にしようと思います。

  • matplotlibのmplot3dとplot_surfaceを使用してサーフェスをプロットしようとしています。データセット「z」の表面をプロットし、カラーマップを特定の最大値にスケーリングしようとすると、「vmax」プロパティをこの値に変更します。それはうまくいきます。

  • 1つのデータセット(z)の表面をプロットし、2番目のデータセット(fc)の面色を使用しようとすると、これも正常に機能します。

  • フェイスカラーのカラーマップを拡大縮小したい場合、vmaxプロパティはフェイスカラー値によって無効にされます。したがって、Vmaxは効果がありません(試行1)。線も消えましたが、それは別の問題です。

  • また、facecolorデータセット(fc)の値を変更しようとしても、目的の効果が得られませんでした(attempt2)。

スケーリングされたカラーマップ(下の「スケーリングされた」の図のように)を使用して、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

1つの-汚い-解決策は、最大値が高さマップの最大値と等しくなるように、クリップされた顔の色を再スケーリングすることです(基本的に試み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 に答える