代码之家  ›  专栏  ›  技术社区  ›  roberto.sannazzaro

基于外部变量的Matplolib行颜色[duplicate]

  •  0
  • roberto.sannazzaro  · 技术社区  · 7 年前

    我用我发现的一些类似的例子进行了尝试,但是我从来没有能够将它们转换为在轴上使用plot()的方法。只是想知道怎么做。

    以下是我到目前为止提出的一些代码:

    #create x,y coordinates
    x = numpy.random.choice(10,10)
    y = numpy.random.choice(10,10)
    
    #create an array of colors based on direction of line (0=r, 1=g, 2=b)
    colors = []
    #create an array that is one position away from original 
    #to determine direction of line 
    yCopy = list(y[1:])
    for y1,y2 in zip(y,yCopy):
        if y1 > y2:
            colors.append(0)
        elif y1 < y2:
            colors.append(1)
        else:
            colors.append(2)
    #add tenth spot to array as loop only does nine
    colors.append(2)
    
    #create a numpy array of colors
    categories = numpy.array(colors)
    
    #create a color map with the three colors
    colormap = numpy.array([matplotlib.colors.colorConverter.to_rgb('r'),matplotlib.colors.colorConverter.to_rgb('g'),matplotlib.colors.colorConverter.to_rgb('b')])
    
    #plot line
    matplotlib.axes.plot(x,y,color=colormap[categories])
    

    谢谢

    0 回复  |  直到 9 年前
        1
  •  3
  •   Julien Spronck    9 年前

    我不认为你可以在 plot (文档中说颜色可以是任何matlab颜色,而 scatter 医生说你可以使用数组)。

    但是,可以通过分别绘制每一行来伪造:

    import numpy
    from matplotlib import pyplot as plt
    
    x = range(10)
    y = numpy.random.choice(10,10)
    for x1, x2, y1,y2 in zip(x, x[1:], y, y[1:]):
        if y1 > y2:
            plt.plot([x1, x2], [y1, y2], 'r')
        elif y1 < y2:
            plt.plot([x1, x2], [y1, y2], 'g')
        else:
            plt.plot([x1, x2], [y1, y2], 'b')
    
    plt.show()
    

    enter image description here

        2
  •  3
  •   bandito40    9 年前

    好 啊。所以我想出了如何用LineCollecion在轴上画线。

    import numpy as np
    import pylab as pl
    from matplotlib import collections  as mc
    
    segments = []
    colors = np.zeros(shape=(10,4))
    x = range(10)
    y = np.random.choice(10,10)
    i = 0
    
    for x1, x2, y1,y2 in zip(x, x[1:], y, y[1:]):
        if y1 > y2:
            colors[i] = tuple([1,0,0,1])
        elif y1 < y2:
            colors[i] = tuple([0,1,0,1])
        else:
            colors[i] = tuple([0,0,1,1])
        segments.append([(x1, y1), (x2, y2)])
        i += 1     
    
    lc = mc.LineCollection(segments, colors=colors, linewidths=2)
    fig, ax = pl.subplots()
    ax.add_collection(lc)
    ax.autoscale()
    ax.margins(0.1)
    pl.show()
    

    enter image description here

        3
  •  0
  •   ImportanceOfBeingErnest    7 年前

    有一个 example on the matplotlib page LineCollection 画一条五彩线。

    剩下的问题是获取行集合的颜色。所以如果 y

    cm = dict(zip(range(-1,2,1),list("gbr")))
    colors = list( map( cm.get , np.sign(np.diff(y))  ))
    

    完整代码:

    import numpy as np; np.random.seed(5)
    import matplotlib.pyplot as plt
    from matplotlib.collections import LineCollection
    
    x = np.arange(10)
    y = np.random.choice(10,10)
    
    points = np.array([x, y]).T.reshape(-1, 1, 2)
    segments = np.concatenate([points[:-1], points[1:]], axis=1)
    
    cm = dict(zip(range(-1,2,1),list("rbg")))
    colors = list( map( cm.get , np.sign(np.diff(y))  ))
    
    lc = LineCollection(segments, colors=colors, linewidths=2)
    fig, ax = plt.subplots()
    ax.add_collection(lc)
    
    ax.autoscale()
    ax.margins(0.1)
    plt.show()
    

    enter image description here