5

以下のコードを使用して、matplotlib を使用してサーフェスをプロットしようとしています。

from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d, Axes3D
import pylab as p

vima=0.5

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 16.67, vima)
Y = np.arange(0, 12.5, vima)
X, Y = np.meshgrid(X, Y)

Z = np.sqrt(((1.2*Y+0.6*X)**2+(0.2*Y+1.6*X)**2)/(0.64*Y**2+0.36*X**2))

surf = ax.plot_surface(X, Y, Z,rstride=1, cstride=1, alpha=1,cmap=cm.jet,  linewidth=0)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

実行すると青い表面が表示されますが、ジェットの色範囲全体を使用したい...「matplotlib.colors.Normalize」というクラスがあることは知っていますが、使用方法がわかりません。そのために必要なコードを追加していただけますか?

4

3 に答える 3

18

ポスターの問題はすでに解決されていると思いますが、色を正規化するという問題は解決されていません。私はそれを必要とするかもしれない他の人のためにこれをここにドロップするだろうと私がどのように思ったかを理解したので。

まず、ノルムを作成してそれをプロット関数に渡します。これをOPのコードに追加しようとしました。

from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d, Axes3D
import pylab as p
import matplotlib

vima=0.5

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 16.67, vima)
Y = np.arange(0, 12.5, vima)
X, Y = np.meshgrid(X, Y)

Z = np.sqrt(((1.2*Y+0.6*X)**2+(0.2*Y+1.6*X)**2)/(0.64*Y**2+0.36*X**2))
Z = np.nan_to_num(Z)

# Make the norm
norm = matplotlib.colors.Normalize(vmin = np.min(Z), vmax = np.max(Z), clip = False)

# Plot with the norm
surf = ax.plot_surface(X, Y, Z,rstride=1, cstride=1, norm=norm, alpha=1,cmap=cm.jet,     linewidth=0)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

このノルムは、「imshow」コマンドでも同じように機能します。

于 2012-09-18T15:15:33.453 に答える
5

JoshAdelがコメントで指摘したように(クレジットは彼のものです)、aNaNがZ配列にある場合、サーフェスプロットがカラーマップの範囲を不適切に設定しているように見えます。簡単な回避策は、NaNをゼロまたは非常に大きいまたは非常に小さい数値に変換して、カラーマップをz軸の範囲に正規化できるようにすることです。

from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d, Axes3D
import pylab as p

vima=0.5

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(0, 16.67, vima)
Y = np.arange(0, 12.5, vima)
X, Y = np.meshgrid(X, Y)

Z = np.sqrt(((1.2*Y+0.6*X)**2+(0.2*Y+1.6*X)**2)/(0.64*Y**2+0.36*X**2))
Z = np.nan_to_num(Z) # added this line

surf = ax.plot_surface(X, Y, Z,rstride=1, cstride=1, alpha=1,cmap=cm.jet,  linewidth=0)
fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()
于 2011-03-07T02:32:53.413 に答える