2012-07-13 16 views
6

Mam proste zadanie, które powinno mieć proste rozwiązanie, ale próbuję od wielu dni. Staram się być konkretny.Skalowana colormap facecolors z mplot3d

  • próbuję działki powierzchnię używając mplot3d matplotlib i plot_surface. Kiedy wykreślam powierzchnię zestawu danych "z" i próbuję skalować mapę kolorów do określonej wartości maksymalnej, zmieniam właściwość "vmax" na tę wartość. To działa świetnie.

  • Kiedy próbuję wykreślić powierzchnię jednego zestawu danych (z) i użyć kolorów drugiego zestawu danych (fc), działa to również poprawnie.

  • Kiedy chcę przeskalować mapę kolorów elementów opcjonalnych, właściwość vmax jest nadpisywana wartościami kolorów. Vmax nie ma zatem żadnego efektu (próba1). Linie również zniknęły, ale to kolejna kwestia.

  • Również próby zmiany wartości zestawu danych facecolor (fc) nie przyniosły pożądanego efektu (próba2).

staram się uzyskać postać z skalowany colormap (jak na rysunku „przeskalowany” poniżej), ale skalowany do facecolors, a nie z-wartości.

Poniższy kod jest co mam teraz, a wyniki wyglądają następująco:

enter image description here

Czy ktoś wie, co ja tu brakuje? Wszelkie przemyślenia są doceniane!

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)') 
+0

Czy dowiedziałeś się, jak odzyskać czarne linie? Myślę, że mam ten sam problem: http://stackoverflow.com/questions/12355410/fine-tuning-a-surf-plot-using-mplot3d i staram się pokazać linie. – Dan

+1

Widzę, że twój problem został rozwiązany, świetnie :-) – Niels

Odpowiedz

3

One - brudny - rozwiązaniem byłoby przeskalować obcięte facecolors taki sposób, że maksymalna jest równa maksimum swojej wysokości mapie (oprócz w zasadzie to, co zaproponował jako próba 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) 

Czy daje to wynik, którego szukasz?

+0

tak, to dokładnie to, czego potrzebuję. Wielkie dzięki! – Niels

+0

Po prostu zrobiłem :-), dzięki znowu .. – Niels

+0

@Niels upvoting użytecznych odpowiedzi sprawia, że ​​niektórzy ludzie chętniej pomogą w przyszłości. Przyjmowanie odpowiedzi jest miłe, akceptowanie odpowiedzi, która nie została uznana za "użyteczną", wydaje się dziwne. – msw