6

新しい 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()

ほとんどの作業を行いますが、2 つの質問があります。

  1. 私が気付いていないmatplotlib機能を使用して、これと同じ効果を達成するための、より直接的でエレガントな方法はありますか? それは、(たとえば)時系列データの1D配列をプロットするか、そのようなデータの2つのセット間の範囲(たとえば、最高気温、最低気温)を示すことですか?

  2. 試してみてください、図の上にグリッド線をプロットするように説得することはできません。それらは常に、最初にプロットされたデータ セットの上に位置し、その後にプロットされたデータによって埋もれてしまい、プロットの下半分が空白のままになっているように見えます。zorder の使用は無視されているようです。

どうもありがとう。

4

1 に答える 1

9

2 番目の質問に答えるには:

fill_betweenすべてのzorder を 0.1、0.2、0.3 ... に設定できます。

グリッド線は xaxis と yaxis に属し、xaxis と yaxis の zorder は 2.5 です。したがって、2.5 未満の zorder はグリッド線の下に表示されます。

私はあなたと同様のコードをいくつか書きますが、 for loop と を使用numpy.interpnumpy.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()

ここに画像の説明を入力

于 2012-04-27T01:34:39.653 に答える