在绘制的线条下填充区域

时间:2013-11-21 11:23:38

标签: python matplotlib

我拥有的数据是范围,其中分数被分配给此范围内的所有值。

我的数据的一个条目如下所示:

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

更新:

如果我遵循雅各布的指示,我得到的就是我想要的。

enter image description here

更新:

以下方法似乎适用于少量范围。但是,如果我使用更大范围(~100k),则需要太长时间。还有另一种可以更有效地完成工作的方法吗?

2 个答案:

答案 0 :(得分:2)

对于此特定示例,最简单的方法是使用bar

bar非常适合,因为您希望给定范围内的所有x值具有恒定的y值。如果我们想要更改y值,fill的{​​{1}}会更合适。

例如:

fill_between

enter image description here

另外,我目前正在绘制没有edgecolor的图片,因此数据中非常薄的峰值没有显示出来(类似于您的示例图)。然而,更明显地显示“尖峰”会更好(可能?)。如果您想这样做,请将edgecolor更改为空字符串以外的其他内容(例如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() ),或将kwarg保留,并显示默认的黑色边缘。

答案 1 :(得分: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