2011-05-17 9 views
5

Jak mogę boxplot tylko niezamaskowane wartości MaskedArray? Pomyślałem, że stanie się to automatycznie przez boxplot(ma), ale wydaje się, że to jest boxplot z niezamaskowaną tablicą.Boxplotting Masked Arrays

Odpowiedz

6

Myślę, że masz rację - plt.boxplot ignoruje maskę, jeśli wysłana jest zamaskowana tablica. Wygląda więc na to, że musisz dać boxplot dodatkową pomoc, wysyłając tylko te wartości, które nie są maskowane. Ponieważ każdy wiersz tablicy może mieć inną liczbę niezamaskowanych wartości, nie będzie można użyć tablicy numpy. Musisz utworzyć sekwencję Pythona wektorów:

z = [[y for y in row if y] for row in x.T] 

na przykład:

import matplotlib.pyplot as plt 
import numpy as np 

fig=plt.figure() 

N=20 
M=10 

x = np.random.random((M,N)) 
mask=np.random.random_integers(0,1,N*M).reshape((M,N)) 
x = np.ma.array(x,mask=mask) 
ax1=fig.add_subplot(2,1,1) 
ax1.boxplot(x) 

z = [[y for y in row if y] for row in x.T] 
ax2=fig.add_subplot(2,1,2) 
ax2.boxplot(z) 
plt.show() 

enter image description here

Powyżej, pierwszy subplot pokazuje wykres typu boxplot wszystkich danych w x (pomijając maska), a drugi wątek pokazuje planszę zawierającą tylko te wartości, które nie są maskowane.

+0

mm, co jeśli nie maskuję kolumn w tablicy, ale np. 'ma.masked_equal (0)', co czyni sugerowany sposób nieco bardziej skomplikowanym ... –

+0

@rubae: Więc nie wszystkie wiersze mają taką samą liczbę wartości? – unutbu

+0

Mam 6 'np.ma's (N, M) -size, więc chcę mieć 6 doxplot tych tablic, w których wszystkie wartości równe zero są zamaskowane przez' np.nan' i whih są losowo w każdym miejscu w tablicach ... (i których nie chcę w moim pudełku) –

Powiązane problemy