2012-04-26 9 views
5

Nowy użytkownik matplotlib tutaj. Próbuję wykreślić linię danych zakodowaną w kolorze lub, lepiej, w zakodowanym w kolorze zakresie danych. Odstępy kodowania kolorami wzdłuż osi Y. Poniżej przedstawiono prosty skrypt demonstracyjny:Matplotlib - siatki i kreślące kolorowe wartości y/zakresy danych

import matplotlib.pyplot as plt 

# dummy test data 
datapoints = 25 
maxtemps = [ 25, 24, 24, 25, 26, 27, 22, 21, 22, 19, 17, 14, 13, 12, 11, 12, 11, 10, 9, 9, 9, 8, 9, 9, 8 ] 
mintemps = [ 21, 22, 22, 22, 23, 24, 18, 17, 16, 14, 10, 8, 8, 7, 7, 6, 5, 5, 5, 4, 4, 4, 3, 4, 3 ] 
times = list(xrange(datapoints)) 

# cap a filled plot at a given level 
def capped(indata, cap): 
    outdata = [0] * datapoints 
    lcount = 0 

    while lcount < datapoints: 
     if indata[lcount] > cap: 
      outdata[lcount] = cap 
     else: 
      outdata[lcount] = indata[lcount] 
     lcount += 1 
    return outdata 

fig = plt.figure() 

ax1 = fig.add_subplot(111) 
ax1.fill_between(times, 0, maxtemps, color='#FF69B4', zorder=1, linewidth=0.1) 
ax1.fill_between(times, 0, capped(maxtemps,25), color='#F08228', zorder=2, linewidth=0.1) 
ax1.fill_between(times, 0, capped(maxtemps,20), color='#E6AF2D', zorder=3, linewidth=0.1) 
ax1.fill_between(times, 0, capped(maxtemps,15), color='#E6DC32', zorder=4, linewidth=0.1) 
ax1.fill_between(times, 0, capped(maxtemps,10), color='#A0E632', zorder=5, linewidth=0.1) 
ax1.fill_between(times, 0, capped(maxtemps,5), color='#00DC00', zorder=6, linewidth=0.1) 
ax1.fill_between(times, 0, mintemps, color='#FFFFFF', zorder=7, linewidth=0.1) 
plt.setp(ax1.get_xticklabels(), visible=False) 
ax1.grid(True, zorder=8) 
ylim(0) 
plt.draw() 
plt.show() 

Wykonuje większość zadań, ale wymaga dwóch pytań.

  1. Czy jest bardziej bezpośredni, elegancki sposób, aby osiągnąć ten sam efekt z funkcją matplotlib jestem nieświadomy? Oznacza to albo wykreślić tablicę 1D (powiedzmy) szeregów czasowych danych, albo zilustrować zakres pomiędzy dwoma zestawami takich danych (na przykład maksymalną, minimalną temperaturą)?

  2. Spróbuj tak, jak mogę, nie mogę przekonać linii siatki do spiskowania na szczycie figury. Wydaje się, że zawsze znajdują się na pierwszym zestawie wykreślonych danych, a następnie zostają zakopane przez kolejne spiskowane dane, pozostawiając dolną połowę wykresu pustą. Używanie zordu wydaje się być ignorowane.

Wielkie dzięki.

Odpowiedz

9

Aby odpowiedzieć na drugie pytanie:

można ustawić wszystkie fill_between zorder do 0,1, 0,2, 0,3 ...

linie siatki należą do OśX i yAxis, a zorder z Xaxis i yAxis jest 2.5. Tak więc każdy zorder mniejszy niż 2.5 będzie wyświetlany pod liniami siatki.

napisać trochę kodu podobnego z Ciebie, ale użyć pętli for i numpy.interp, numpy.clip zrobić fabułę Filmu:

import pylab as pl 
import numpy as np 
maxtemps = [ 25, 24, 24, 25, 26, 27, 22, 21, 22, 19, 17, 14, 13, 12, 11, 12, 11, 10, 9, 9, 9, 8, 9, 9, 8 ] 
mintemps = [ 21, 22, 22, 22, 23, 24, 18, 17, 16, 14, 10, 8, 8, 7, 7, 6, 5, 5, 5, 4, 4, 4, 3, 4, 3 ] 
times = list(xrange(len(mintemps))) 

colors = [ 
    (25, '#FF69B4'), 
    (20, '#F08228'), 
    (15, '#E6AF2D'), 
    (10, '#E6DC32'), 
    (5, '#A0E632'), 
    (0, '#00DC00') 
] 

# change 300 to larger number if you need more accuracy. 
x = np.linspace(times[0], times[-1], 300) 
maxt = np.interp(x, times, maxtemps) 
mint = np.interp(x, times, mintemps) 

last_level = np.inf 
for level, color in colors:  
    tmp_min = np.clip(mint, level, last_level) 
    tmp_max = np.clip(maxt, level, last_level) 
    pl.fill_between(x, tmp_min, tmp_max, lw=0, color=color) 
    last_level = level 

pl.grid(True) 
pl.show() 

enter image description here

Powiązane problemy