2012-04-26 39 views
5

Người dùng matplotlib mới tại đây. Tôi đang cố vẽ một dòng dữ liệu được mã hóa màu hoặc tốt hơn, một dải dữ liệu được mã hóa màu. Khoảng mã hóa màu dọc theo trục y. Tập lệnh trình diễn thô sau:Matplotlib - lưới và vẽ đồ thị các giá trị y/giá trị mã hóa màu

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

Có hầu hết công việc nhưng nó đặt ra hai câu hỏi.

  1. Có cách nào khác, trực tiếp, thanh lịch để đạt được hiệu ứng tương tự này với tính năng matplotlib mà tôi không biết? Đó là hoặc vẽ một mảng 1D dữ liệu chuỗi thời gian (nói) hoặc để minh họa một phạm vi giữa hai bộ dữ liệu đó (ví dụ, nhiệt độ tối đa, tối thiểu)?

  2. Hãy thử làm như tôi có thể, tôi không thể thuyết phục các đường lưới được vẽ trên đầu hình. Họ luôn luôn dường như ngồi trên đầu trang của bộ đầu tiên của dữ liệu được vẽ và sau đó được chôn cất bởi dữ liệu được vẽ theo sau, để lại nửa dưới của ô trống. Sử dụng zorder dường như bị bỏ qua.

Rất cám ơn.

Trả lời

9

Để trả lời câu hỏi của bạn thứ hai:

bạn có thể đặt tất cả các fill_between zorder đến 0,1, 0,2, 0,3 ...

đường lưới thuộc về Xaxis và yaxis, và zorder của Xaxis và yaxis là 2.5. Vì vậy, bất kỳ thứ tự nhỏ hơn 2,5 sẽ được hiển thị dưới các đường lưới.

tôi viết một số mã tương tự với bạn, nhưng sử dụng vòng lặp for và numpy.interp, numpy.clip để làm cốt truyện clip:

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

Các vấn đề liên quan