Python 填充打印线下的区域

Python 填充打印线下的区域,python,matplotlib,Python,Matplotlib,我拥有的数据是范围,其中一个分数分配给该范围内的所有值 我的一个数据条目如下所示: 10000 177368 0.150849441498420722141 第一个值指示此范围的开始位置,第二个值指示此范围的结束位置。最后一个值表示此范围的分数 在下面的代码中,我以指定的分数绘制了每个范围的起始位置和结束位置。 目前,这将用一条线连接每个区域,这是我想要做的部分,但是我也希望填充每条线下的区域 我还想知道如何一次性绘制这些位置,而不必循环遍历列表中的每个条目,然后分别绘制每个范围 import

我拥有的数据是范围,其中一个分数分配给该范围内的所有值

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

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

更新:

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

更新:


以下方法似乎适用于少量范围。但是,如果使用更大的范围集(~100k),则需要的时间太长。还有其他更有效的方法吗?

这里有一个快速的方法。我获取
xs
ys
的方法有点不雅观,但基本上我将其设置为
xs
包含
[range\u list[0][0]、range\u list[0][1]、range\u list[1][0]、
ys
包含
[range\u list[0][2]、range\u list[1][2]、range\u list[1][2]、[/code>

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

对于这个特定的示例,使用
条是最简单的

bar
非常适合,因为您希望给定范围内的所有x值都有一个恒定的y值。如果我们想要一个变化的y值,
fill
对于
fill\u之间的
fill将是一个更好的选择

例如:

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


此外,我目前正在绘制这些没有edgecolor的图形,因此数据中非常细的尖峰不会显示出来(类似于示例图)。但是,最好(可能?)更明显地显示“尖峰”。如果要执行此操作,请将edgecolor更改为空字符串以外的内容(例如,
edgecolor='darkgreen'
),或者不使用kwarg,将显示默认的黑色边。

这不是我想要的,我不想连接不同的范围。如果范围之间有间隙,它们应该保持可见。如果使用
fill\u-between
而不是
fill
,下面的区域将被填充。我已经添加了一个概念图,说明我想做什么。@Jakob我想我需要更深入地阅读文档。。