2012-04-26 16 views
5

नया matplotlib उपयोगकर्ता यहां। मैं डेटा की एक रंग कोडित लाइन, या बेहतर, डेटा की एक रंग कोडित रेंज प्लॉट करने की कोशिश कर रहा हूं। वाई-अक्ष के साथ रंग कोडिंग अंतराल। एक कच्चे प्रदर्शन स्क्रिप्ट इस प्रकार है:Matplotlib - ग्रिड और साजिश रंग कोडित y मान/डेटा श्रेणी

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() 

काम का सबसे करता है, लेकिन यह दो सवाल भीख माँगता।

  1. क्या मैटलप्लिब सुविधा के साथ इस प्रभाव को प्राप्त करने के लिए एक और अधिक प्रत्यक्ष, सुरुचिपूर्ण तरीका है, मुझे अनजान है? यह या तो समय सारणी डेटा (1) सरणी डेटा (या) इस डेटा के दो सेट (उदाहरण के लिए, अधिकतम, न्यूनतम तापमान) के बीच एक सीमा को चित्रित करने के लिए है?

  2. जितना मैं कर सकता हूं, कोशिश करें, मैं आंकड़े के शीर्ष पर प्लॉट करने के लिए ग्रिड लाइनों को मनाने के लिए राजी नहीं कर सकता। वे हमेशा प्लॉट किए गए डेटा के पहले सेट के शीर्ष पर बैठते हैं और फिर प्लॉट के निचले हिस्से को छोड़कर, बाद में प्लॉट किए गए डेटा द्वारा दफन हो जाते हैं। ज़ॉर्डर का उपयोग अनदेखा प्रतीत होता है।

बहुत धन्यवाद।

उत्तर

9

अपने दूसरे सवाल का जवाब करने के लिए:

आप सेट कर सकते हैं सभी fill_between zorder 0.1, 0.2, 0.3 ...

ग्रिड लाइन yaxis xaxis और के हैं, और xaxis की zorder और yaxis है 2.5। तो ग्रिड लाइनों के तहत 2.5 से कम कोई भी ज़ॉर्डर दिखाया जाएगा।

मैं कुछ तुम्हारा साथ इसी तरह के कोड लिखने, लेकिन, numpy.clip पाश और numpy.interp के लिए उपयोग क्लिप साजिश करने के लिए:

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

संबंधित मुद्दे