2014-04-24 16 views
6

mam 3d powierzchnia, wraz z kolorowym pasku, generowane przezJak zignorować NaN na pasku kolorów?

surf = ax.plot_surface(xv, yv, zv, ...) 
cb = fig.colorbar(surf) 

Kiedy to działa, wygląda to tak:

enter image description here

Problemem jest to, że niektóre wartości może być NaN, w którym to przypadku colorbar nie generują, tak:

Example

C:\Users\Sam\Anaconda\lib\site-packages\matplotlib\colorbar.py:581: RuntimeWarning: invalid value encountered in greater 
    inrange = (ticks > -0.001) & (ticks < 1.001) 
C:\Users\Sam\Anaconda\lib\site-packages\matplotlib\colorbar.py:581: RuntimeWarning: invalid value encountered in less 
    inrange = (ticks > -0.001) & (ticks < 1.001) 
C:\Users\Sam\Anaconda\lib\site-packages\matplotlib\colors.py:576: RuntimeWarning: invalid value encountered in less 
    cbook._putmask(xa, xa < 0.0, -1) 

Mogę spróbować zastąpić wartości NaN z z 0 (zv[isnan(zv)] = 0), ale wynikowy wykres ma pionowe klify, które są mylące i zaciemniają niektóre funkcje, a także pochylają pasek kolorów.

enter image description here

Co chcę jest sposobem na pasku kolorów do ignorowania wartości Nan. Aby to zrobić, mogłem ręcznie ustawić pasek koloru (na amin(zv[~isnan(zv)]) i amax(zv[~isnan(zv)])) po jego utworzeniu, ale nie wiem jak to zrobić.

Jakieś sugestie dotyczące ignorowania NaN podczas obliczania paska koloru i kolorowania powierzchni 3d?

Odpowiedz

8

Ustawianie parametrów vmin i vmax w wywołaniu na plot_surface. Wartości te mają wpływ na wartości minimalne i maksymalne odwzorowane przez pasek kolorów.

import numpy as np 
import matplotlib.pyplot as plt 
import mpl_toolkits.mplot3d.axes3d as axes3d 

def peaks(x, y): 
    return x*np.sin(y) 

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
X, Y = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100)) 

Z = peaks(X, Y) 
Z[X+Y>3] = np.nan 

surf = ax.plot_surface(X, Y, Z, alpha=0.3, cmap=plt.cm.jet, 
         vmin=np.nanmin(Z), vmax=np.nanmax(Z)) 
cbar = plt.colorbar(surf) 

plt.show() 

enter image description here

-1

powinien być w stanie wykluczyć NaN z ZV przed surfowania, tak:

surf = ax.plot_surface(xv, yv, zv[~isnan(zv)], ...) 
cb = fig.colorbar(surf) 

ten powinien bok-Step problemu całkowicie, jeśli rozumiem go poprawnie. Oczywiście mogę być zdezorientowany. Powodzenia.

+2

To będzie spłaszczyć Zv. Zv musi być tablicą 2D. – charmoniumQ