我拥有的数据是范围,其中分数被分配给该范围内的所有值。
我的数据的一项如下所示:
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()
更新:
如果遵循Jakob的指示,我将得到什么,这正是我想要的。
更新:
以下方法似乎适用于少量范围。但是,如果我使用较大的范围(〜100k),它将花费太长时间。还有另一种方法可以更有效地完成它吗?
最佳答案
对于此特定示例,最容易使用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()
另外,我目前正在绘制这些没有边缘颜色的图形,因此不会出现数据中非常细小的尖峰(类似于示例图)。但是,(可能?)更清楚地显示“峰值”会更好。如果要这样做,请将edgecolor更改为空字符串以外的其他颜色(例如
edgecolor='darkgreen'
),或者将kwarg保留为空白,然后将显示默认的黑色边缘。关于python - 填充标绘线下的区域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20119638/