2011-12-30 22 views
7

Chciałbym wykreślić EPSgram (patrz poniżej) za pomocą Python i Matplotlib.Python-Matplotlib boxplot. Jak wyświetlić percentyle 0,10, 25, 50, 75, 90 i 100?

Funkcja boxplot wyświetla tylko kwartyle (0, 25, 50, 75, 100). Jak mogę dodać dwa kolejne pola?

EPSGram boxplot

+2

Nie sądzę, istnieje łatwy sposób to zrobić, ale prawdopodobnie można by było zrobić go samodzielnie za pomocą kilku 'broken_barh' . – aganders3

+5

Jako ekspresywną alternatywę rozważ [wykres skrzypiec] (http://pyinsci.blogspot.com/2009/09/violin-plot-with-matplotlib.html). –

Odpowiedz

2

I zebrała próbki, jeśli nadal jesteś ciekawy. Wykorzystuje scipy.stats.scoreatpercentile, ale może być coraz te numery z zewnątrz:

from random import random 
import numpy as np 
import matplotlib.pyplot as plt 
from scipy.stats import scoreatpercentile 

x = np.array([random() for x in xrange(100)]) 

# percentiles of interest 
perc = [min(x), scoreatpercentile(x,10), scoreatpercentile(x,25), 
       scoreatpercentile(x,50), scoreatpercentile(x,75), 
       scoreatpercentile(x,90), max(x)] 
midpoint = 0 # time-series time 

fig = plt.figure() 
ax = fig.add_subplot(111) 
# min/max 
ax.broken_barh([(midpoint-.01,.02)], (perc[0], perc[1]-perc[0])) 
ax.broken_barh([(midpoint-.01,.02)], (perc[5], perc[6]-perc[5])) 
# 10/90 
ax.broken_barh([(midpoint-.1,.2)], (perc[1], perc[2]-perc[1])) 
ax.broken_barh([(midpoint-.1,.2)], (perc[4], perc[5]-perc[4])) 
# 25/75 
ax.broken_barh([(midpoint-.4,.8)], (perc[2], perc[3]-perc[2])) 
ax.broken_barh([(midpoint-.4,.8)], (perc[3], perc[4]-perc[3])) 

ax.set_ylim(-0.5,1.5) 
ax.set_xlim(-10,10) 
ax.set_yticks([0,0.5,1]) 
ax.grid(True) 
plt.show() 

Output of the code above