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

熊猫根据列[duplicate]中的值更改线条的颜色

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

    我有一个y值数组,形成一条直线。此外,我有一个数组,它的元素数与y数组的元素数相同,数组的值从0到1不等。我们将此数组称为“z”。我想绘制y值的数组,这样每个点的颜色都与z值对应。

    在gnuplot中,可以使用“lc变量”来实现这一点:

    plot ’data’ using 1:2:3 with points lc variable  
    

    使用下面的建议: Matplotlib scatterplot; colour as a function of a third variable ,我能够使用散点图,它确实有效:

    import matplotlib as mpl  
    import matplotlib.pyplot as plt  
    
    plt.scatter(x, y, c=z, s=1, edgecolors='none', cmap=mpl.cm.jet)  
    plt.colorbar()  
    plt.show()  
    

    matplotlib中的plot方法有类似的方法吗?

    plt.plot(x, y, c=z)
    

    当我尝试上面的代码时,所有的行都显示为黑色。

    0 回复  |  直到 7 年前
        1
  •  19
  •   carla    11 年前

    我也有同样的问题:我想用不均匀的颜色绘制线条,我想依赖于第三个变量(z)。

    但我确实想用一条线,而不是记号笔(如@joaquin的回答)。 我找到了一个解决办法 matplotlib gallery example ,使用该类 matplotlib.collections.LineCollection (链接 here ).

    以下是我的示例,它在底图中绘制轨迹,并根据其高度为其着色:

    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    from matplotlib.collections import LineCollection
    import numpy as np
    
    m = Basemap(llcrnrlon=-42,llcrnrlat=0,urcrnrlon=5,urcrnrlat=50, resolution='h')
    fig = plt.figure()
    m.drawcoastlines()
    m.drawcountries()
    
    for i in trajectorias:
        # for each i, the x (longitude), y (latitude) and z (height)
        # are read from a file and stored as numpy arrays
    
        points = np.array([x, y]).T.reshape(-1, 1, 2)
        segments = np.concatenate([points[:-1], points[1:]], axis=1)
    
        lc = LineCollection(segments, cmap=plt.get_cmap('Spectral'),
                            norm=plt.Normalize(250, 1500))
        lc.set_array(z)
        lc.set_linewidth(2)
    
        plt.gca().add_collection(lc)
    
    axcb = fig.colorbar(lc)
    axcb.set_label('cota (m)')
    
    plt.show()
    

    height dependent trajectories

        2
  •  2
  •   joaquin    12 年前

    你可以使用散射:

    plt.scatter(range(len(y)), y, c=z, cmap=cm.hot)
    

    这里是ipython-pylab课程:

    In [27]: z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9]
    
    In [28]: y = [3, 7, 5, 6, 4, 8, 3, 4, 5, 2, 9]
    
    In [29]: plt.scatter(range(len(y)), y, s=60, c=z, cmap=cm.hot)
    Out[29]: <matplotlib.collections.PathCollection at 0x9ec8400>
    

    enter image description here

    如果要使用plot,可以使用(PyCastle session)获得如上所示的等效图:

    >>> from matplotlib import pyplot as plt
    >>> from matplotlib import cm
    >>> y = [3,7,5,6,4,8,3,4,5,2,9]
    >>> z = [0.3,0.4,0.5,0.6,0.7,0.2,0.3,0.4,0.5,0.8,0.9]
    >>> for x, (v, c) in enumerate(zip(y,z)):
    ...      plt.plot(x,v,marker='o', color=cm.hot(c))
    ...      
    [<matplotlib.lines.Line2D object at 0x0000000008C42518>]
    [<matplotlib.lines.Line2D object at 0x0000000008C426D8>]
    [<matplotlib.lines.Line2D object at 0x0000000008C42B38>]
    [<matplotlib.lines.Line2D object at 0x0000000008C452B0>]
    [<matplotlib.lines.Line2D object at 0x0000000008C45438>]
    [<matplotlib.lines.Line2D object at 0x0000000008C45898>]
    [<matplotlib.lines.Line2D object at 0x0000000008C45CF8>]
    [<matplotlib.lines.Line2D object at 0x0000000008C48198>]
    [<matplotlib.lines.Line2D object at 0x0000000008C485F8>]
    [<matplotlib.lines.Line2D object at 0x0000000008C48A58>]
    [<matplotlib.lines.Line2D object at 0x0000000008C4B1D0>]
    >>> plt.show()
    >>>