2014-04-24 14 views
6

Ho una superficie 3D, accompagnata da una barra di colore, generato daCome ignorare NaN in colorbar?

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

Quando funziona, sembra che questo:

enter image description here

Il problema è che alcuni dei valori può essere NaN, nel qual caso il colorbar non riesce a generare, in questo modo:

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) 

Potrei provare a sostituire i valori NaN di zv con 0 (zv[isnan(zv)] = 0), ma il grafico risultante ha dirupi verticali, che confondono e oscurano alcune delle caratteristiche e distorce la barra dei colori.

enter image description here

Quello che voglio è un modo per la barra dei colori di ignorare i valori NaN. Per fare ciò, ho potuto impostare manualmente la barra dei colori (su amin(zv[~isnan(zv)]) e amax(zv[~isnan(zv)])) dopo che è stata creata, ma non so come farlo.

Qualche suggerimento su come ignorare i NaN quando si calcola la barra dei colori e quando si colora una superficie 3D?

risposta

8

Impostare i parametri vmin e vmax nella chiamata a plot_surface. Questi valori influenzano i valori minimi e massimi mappati dalla barra di colore.

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

Dovreste essere in grado di escludere dal NaN ZV prima di surf, in questo modo:

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

Questo dovrebbe eludere il problema del tutto, se ho capito bene. Certo, potrei essere confuso. In bocca al lupo.

+2

Che vi appiattire ZV. zv deve essere un array 2D. – charmoniumQ

Problemi correlati