2015-09-05 114 views
3

三維曲面圖我用下面這行繪製的三維曲面:色蟒蛇

surf = ax3.plot_surface(X, Y, Z, rstride=1, cstride=1, alpha=0.5, linewidth=0, cmap=cm.jet,antialiased=True) 

現在的顏色來自非常漂亮,雖然有點鱗片狀的外觀,雖然罰款。
但我想改變表面顏色w.r.t.另一個數據,存儲在list爲:

m = [104.48, 111.73,109.93,139.95,95.05,150.49,136.96,157.75] 

我與努力:

norm = cls.Normalize() # Norm to map the 'm' values to [0,1] 
norm.autoscale(m) 
cmap = cm.ScalarMappable(norm, 'jet') 
surf = ax3.plot_surface(X, Y, Z, rstride=5, cstride=5, alpha=0.5, linewidth=0, color=cmap.to_rgba(m), antialiased=True) 

但作爲cmap.to_rgba只需要一維數組,這是引發錯誤。 關於如何能夠更改表面colormap的任何建議將受到高度讚賞。

回答

3

很好,看起來可怕,但我覺得你能適應它:

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
my_col = cm.jet(np.random.rand(Z.shape[0],Z.shape[1])) 

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors = my_col, 
     linewidth=0, antialiased=False) 
ax.set_zlim(-1.01, 1.01) 

我不會用噴氣但像cubehelix一些線性顏色表。你就可以欺騙眼睛容易用錯了顏色表(one of many posts關於該主題)

+0

如果我正確地得到它,那麼你正在繪製'X,Y,Z'並給出一個按照'Z-array'定製的顏色。但是我已經有了('X,Y,Z')的白色表面,現在我想要做的就是按照「m-array」的值對錶面着色。如果我誤解了,請糾正我。 – diffracteD

+0

爲了得到一個2D數組,你必須在縮放的m數組上使用'meshgrid'。 – Moritz

+0

是的,我在'x,y,z'擬合的情況下使用'np.meshgrid',但它給了我一個矩陣數據(等級3)傳遞給'plot_surface(X,Y,Z ,...)'來生成曲面。現在我怎麼能夠在繪圖中處理矩陣等級4(如果我包含'm')?關於你的想法的一點點代碼會很好。 – diffracteD

1

要得到正確的顏色,使用Z值從彩色地圖挑值:

my_col = cm.jet(Z/np.amax(Z)) 

結果:

surface plot

使用與@Moritz相同的代碼。

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
X = np.arange(-5, 5, 0.25) 
Y = np.arange(-5, 5, 0.25) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
my_col = cm.jet(Z/np.amax(Z)) 

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors = my_col, 
     linewidth=0, antialiased=False) 
ax.set_zlim(-1.01, 1.01) 

plt.show() 
+0

是否有任何方法去除劇情的鱗片外觀並獲得光亮外觀? – diffracteD

+0

您必須將數據內插到更細的網格上。 – Moritz

+0

@diffracteD @Moritz說的究竟是什麼。將'np.arange(-5,5,0.25)'中的0.25更改爲較低的值。 – pingul

0

我用python中的一些行使用PANDAS來做到這一點,情節是美麗的!

from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 
from matplotlib import cm 
import numpy as np 
import pandas as pd 
from sys import argv 

file = argv[1] 

x,y,z = np.loadtxt(file, unpack=True) 
df = pd.DataFrame({'x': x, 'y': y, 'z': z}) 

fig = plt.figure() 
ax = Axes3D(fig) 
surf = ax.plot_trisurf(df.x, df.y, df.z, cmap=cm.jet, linewidth=0.1) 
fig.colorbar(surf, shrink=0.5, aspect=5) 
plt.savefig('teste.pdf') 
plt.show() 

Collapsing wave equations

更美一點!在我的例子中,我使用了顏色映射JET Colormaps Matplotlib,但還有其他種類的顏色和質量映射。看看之前的鏈接。