2013-11-21 132 views
1

我擁有的數據是範圍,其中分數被分配給該範圍內的所有值。我的數據填寫繪製線下的區域

一個條目是這樣的:

10000 177368 0.150849441498420722141 

的第一個值指示起始位置,並在此範圍內的第二結束位置。最後一個值是這個範圍的分數。

在下面的代碼中,我繪製了每個範圍的開始位置和結束位置。 目前這將每個範圍連接到一條線,這是我想要做的一部分,但是我也想填充每條線下的區域。

我還想知道如何一次性繪製這些位置,而不必循環瀏覽列表中的每個條目,然後單獨繪製每個範圍。

import matplotlib.pyplot as plt 

range_list = [(10000, 177368, 0.150849441498420722141), 
      (227417, 267627, 0.148806758534977628949), 
      (267628, 267633, 1), 
      (267642, 267660, 1), 
      (267661, 267670, 1), 
      (317719, 471319, 0.125380779728419072816), 
      (521368, 2634121, 0.292530330836878571521), 
      (2634131, 2634171, 1), 
      (2684220, 3845219, 0.332501576911355845034), 
      (3995268, 13052949, 0.8), 
      (13102998, 13219863, 0.304339098079899339488), 
      (13319912, 13557063, 0.19949610114016369522), 
      (13557092, 13557095, 1), 
      (13607162, 17125609, 0.300713750216281716643), 
      (17175658, 29878033, 0.306781992901534461549), 
      (30028082, 103863857, 0.415235012665315250668), 
      (203863857, 233863857, 0.415235012665315250668)] 

plt.figure(figsize=(10, 5), facecolor='w') 
plt.xlim([0, 250000000]) 
plt.ylim([0, 1]) 

for i in range(0, len(range_list)): 
    plt.fill((range_list[i][0], range_list[i][1]), 
      (range_list[i][2],range_list[i][2]), color='g') 

plt.show() 

enter image description here

UPDATE:

我能得到什麼,如果我按照雅各布的方向這是我想要的東西。

enter image description here

UPDATE:

下面的方法似乎與範圍的少量很好地工作。但是,如果我使用更大的範圍(〜100k),則需要很長時間。有沒有另一種方法可以更有效地完成?

+2

如果使用'fill_between'而不是'fill',則下面的區域將被填充 – Jakob

+0

我已經添加了我想要做的概念圖。 – Mvsm

+0

@Jakob嗯,我想我需要更深入地閱讀文檔.. – Mvsm

回答

2

這是最容易使用bar這個具體的例子。

bar是一個很好的選擇,因爲您希望給定範圍內的所有x值都有一個恆定的y值。如果我們想要改變y值,fill對於fill_between會更合適。

例如:

import matplotlib.pyplot as plt 
import numpy as np 

range_list = [(10000, 177368, 0.150849441498420722141), 
       (227417, 267627, 0.148806758534977628949), 
       (267628, 267633, 1), 
       (267642, 267660, 1), 
       (267661, 267670, 1), 
       (317719, 471319, 0.125380779728419072816), 
       (521368, 2634121, 0.292530330836878571521), 
       (2634131, 2634171, 1), 
       (2684220, 3845219, 0.332501576911355845034), 
       (3995268, 13052949, 0.8), 
       (13102998, 13219863, 0.304339098079899339488), 
       (13319912, 13557063, 0.19949610114016369522), 
       (13557092, 13557095, 1), 
       (13607162, 17125609, 0.300713750216281716643), 
       (17175658, 29878033, 0.306781992901534461549), 
       (30028082, 103863857, 0.415235012665315250668), 
       (203863857, 233863857, 0.415235012665315250668)] 

fig, ax = plt.subplots() 
left, right, top = np.array(range_list).T 

ax.bar(left, top, right - left, edgecolor='', facecolor='green') 

plt.show() 

enter image description here

而且,我目前沒有edgecolor繪製這些,所以在您的數據非常薄的尖峯沒有顯示出來(類似於你的榜樣人物)。但是,它會(可能?)更好地顯示「尖峯」更明顯。如果你想這樣做,改變edgecolor爲非空字符串(例如edgecolor='darkgreen'),或保留kwarg,並顯示默認的黑色邊緣。

1

這裏有一個快速的方法。我越來越xsys的方法是有點不雅,但基本上我把它使xs包含[range_list[0][0], range_list[0][1], range_list[1][0]...]ys包含[range_list[0][2], range_list[0][2], range_list[1][2], range_list[1][2], ...]

import matplotlib.pyplot as plt 
import numpy as np 

range_list = [(10000, 177368, 0.150849441498420722141), 
      (227417, 267627, 0.148806758534977628949), 
      (267628, 267633, 1), 
      (267642, 267660, 1), 
      (267661, 267670, 1), 
      (317719, 471319, 0.125380779728419072816), 
      (521368, 2634121, 0.292530330836878571521), 
      (2634131, 2634171, 1), 
      (2684220, 3845219, 0.332501576911355845034), 
      (3995268, 13052949, 0.8), 
      (13102998, 13219863, 0.304339098079899339488), 
      (13319912, 13557063, 0.19949610114016369522), 
      (13557092, 13557095, 1), 
      (13607162, 17125609, 0.300713750216281716643), 
      (17175658, 29878033, 0.306781992901534461549), 
      (30028082, 103863857, 0.415235012665315250668)] 

xs = sorted([x[0] for x in range_list] + [x[1] for x in range_list]) 
ys = np.repeat([x[2] for x in range_list], 2) 

plt.figure(figsize=(10, 5), facecolor='w') 
plt.xlim([0, 250000000]) 
plt.ylim([0, 1]) 

plt.fill_between(xs, ys, y2=0.0) 

plt.show() 

enter image description here

+0

這不完全是我想要的,我不想連接不同的範圍。如果範圍之間存在差距,則應保持可見。 – Mvsm