如何在matplotlib中以“廉价”的方式绘制中断的水平线(线段),而不使用NaN?

5

我需要使用matplotlib库绘制由水平线段(甚至点)组成的几条“曲线”。

A random example of plot. Marker points can be omitted

我通过使用NaNs来分隔线段,以达到此目的。以下是我的示例(有效)代码:

from pylab import arange, randint, hold, plot, show, nan, ylim, legend

n = 6
L = 25
hold(True)
for i in range(n):
    x = arange(L, dtype=float)  # generates a 1xL array of floats
    m = randint(1, L)
    x[randint(1, L, m)] = nan  # set m values as NaN
    y = [n - i] * len(x)  #  constant y value
    plot(x, y, '.-')

leg = ['data_{}'.format(j+1) for j in range(n)]
legend(leg)
ylim(0, i + 2)
show()

(actually, 我从一组整数开始: NaNs会被添加在整数缺失的位置之后) 问题: 由于每行需要一个长度为L的数组,如果L很大,则此解决方案在内存方面可能很昂贵,而必要和充分的信息是段的限制。
例如,对于由限制为(0,500)和(915,62000)的2个段组成的一行,做类似这样的事情会很好:
niceplot([(0, 500), (915, 62000)], [(1, 1), (1, 1)])

(注:这个-用plot代替niceplot...-是一个工作代码,但它会产生其他问题...)
而不是62000*2,使用4*2的值... 有什么建议吗?
(这是我的第一个问题,请多多包涵^^)

4
看一下 hlines 函数。 - Warren Weckesser
@WarrenWeckesser:我认为你的回答是最好的。 - iacopo
1个回答

7

这是否类似于您想要实现的内容?

import matplotlib.pyplot as plt

segments = {1: [(0, 500),
                (915, 1000)],
            2: [(0, 250),
                (500, 1000)]}

colors = {1: 'b', 2: 'r'}

for y in segments:
    col = colors.get(y, 'k')
    for seg in segments[y]:
        plt.plot(seg, [y, y], color=col)

我只是将y值定义为键,并且在每个y值处绘制一个线段列表(xlo,xhi)。


不错。每个图表只需要一种颜色(我已经做出了更改)。 - iacopo
@iacopo,我不喜欢你对我的代码片段所做的更改,因为当定义的段超过你定义的固定颜色数量时,它会出现错误。我进行了编辑,以便在这些情况下不会出错。 - Taro Sato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接