【问题标题】:Colormap for errorbars in x-y scatter plot using matplotlib使用 matplotlib 的 x-y 散点图中误差线的颜色图
【发布时间】:2012-04-29 19:55:59
【问题描述】:

我有一个时间序列的数据,我有数量 y 及其误差 yerr。我现在想创建一个图,显示 y 与相位(即时间/周期 % 1)和垂直误差条(yerr)。为此,我通常使用 pyplot.errorbar(time, y, yerr=yerr, ...)

但是,我想使用颜色条/地图来指示同一图中的时间值。

我因此做的事情如下:

pylab.errorbar( phase, y, yerr=err, fmt=None, marker=None, mew=0 )
pylab.scatter( phase, y, c=time, cmap=cm )

不幸的是,这将绘制单色误差线(默认为蓝色)。由于我每个图有约 1600 个点,这使得散点图的颜色图消失在误差线后面。这是一张图片说明我的意思:

有没有一种方法可以使用与散点图中使用的颜色图相同的颜色图来绘制误差线?我不想调用 errorbar 1600 次...

【问题讨论】:

    标签: python matplotlib scatter-plot color-mapping


    【解决方案1】:

    您可以在pylab.errorbar 中使用ecolor 可选参数,就像在pylab.scatter 中使用color 参数一样:

    pylab.errorbar( phase, y, yerr=err, fmt=None, marker=None, mew=0, ecolor=time )
    

    【讨论】:

    • @Hooked,我认为 Random 希望他/她的误差线与他/她的数据点具有相同的颜色。您的解决方案很好,因为它将误差条置于数据点下方并提高了图表的清晰度,但它不能解决误差条颜色问题。
    • @Moi Jaiunvelo:我已经尝试过了,不幸的是它对我不起作用。您能否解释一下如何将时间数组(类型 float 并且通常从 [0, 2000.] 运行)获取有效的 ecolor 数组?
    【解决方案2】:

    除了更改颜色之外,另一个建议是更改误差线与散点图的zorder。这会将用户的注意力集中在数据上并绘制出错误的大致形状(我认为这是您的意图)。

    from pylab import *
    
    # Generate some random data that looks like yours
    N = 1000
    X = random(N)
    Y = sin(X*5) + X*random(N)*.8
    Z = random(N)
    ERR = X*random(N)
    
    # These are the new arguments that I used
    scatter_kwargs = {"zorder":100}
    error_kwargs = {"lw":.5, "zorder":0}
    
    scatter(X,Y,c=Z,**scatter_kwargs)
    errorbar(X,Y,yerr=ERR,fmt=None, marker=None, mew=0,**error_kwargs )
    xlim(0,1)
    show()
    

    【讨论】:

    • 谢谢,上钩了!我不知道zorder kwarg。虽然这不是我所希望的答案,但暂时可以。 MoiJaiunvelo 是对的,理想情况下,我希望误差条以与数据点相同的颜色绘制。
    【解决方案3】:

    我一直在寻找解决方案,我终于找到了解决办法:

    from pylab import *
    
    #data
    time = arange(100.)
    signal = time**2
    error = ones(len(time))*1000
    
    figure(1)
    #create a scatter plot
    sc = scatter(time,signal,s=20,c=time)
    
    #create colorbar according to the scatter plot
    clb = colorbar(sc)
    
    #create errorbar plot and return the outputs to a,b,c
    a,b,c = errorbar(time,signal,yerr=error,marker='',ls='',zorder=0)
    
    #convert time to a color tuple using the colormap used for scatter
    time_color = clb.to_rgba(time)
    
    #adjust the color of c[0], which is a LineCollection, to the colormap
    c[0].set_color(time_color)
    
    fig = gcf()
    fig.show()
    xlabel('time')
    ylabel('signal')
    

    【讨论】:

    • 很好的解决方案,但是帽子的颜色怎么样?有没有办法使用颜色图更新大写的颜色?
    【解决方案4】:

    很抱歉重新挖掘这个问题,但我自己也遇到了类似的问题,这是我根据之前回复的解决方案。

    这会将标记、误差线和大写字母设置为颜色图中的相同颜色:

    import matplotlib.pyplot as plt
    import numpy as np
    
    #data
    time = np.arange(100.)
    signal = time**2
    error = np.ones(len(time))*1000
    
    #create a scatter plot
    sc = plt.scatter(time,signal,s=20,c=time)
    
    #create colorbar according to the scatter plot
    clb = plt.colorbar(sc)
    
    #convert time to a color tuple using the colormap used for scatter
    time_color = clb.to_rgba(time)
    
    #loop over each data point to plot
    for x, y, e, color in zip(time, signal, error, time_color):
        plt.errorbar(x, y, e, lw=1, capsize=3, color=color)
    

    编辑: 更改为 matplotlib v3.1.1 后,上述停止工作,但这里有一个解决方法:

    import matplotlib.pyplot as plt
    import numpy as np
    
    #data
    time = np.arange(100.)
    signal = time**2
    error = np.ones(len(time))*1000
    
    #create a scatter plot
    sc = plt.scatter(time,signal,s=0,c=time)
    
    #create colorbar according to the scatter plot
    clb = plt.colorbar(sc)
    
    #convert time to a color tuple using the colormap used for scatter
    import matplotlib
    import matplotlib.cm as cm
    norm = matplotlib.colors.Normalize(vmin=min(signal), vmax=max(signal), clip=True)
    mapper = cm.ScalarMappable(norm=norm, cmap='viridis')
    time_color = np.array([(mapper.to_rgba(v)) for v in signal])
    
    #loop over each data point to plot
    for x, y, e, color in zip(time, signal, error, time_color):
        plt.plot(x, y, 'o', color=color)
        plt.errorbar(x, y, e, lw=1, capsize=3, color=color)
    

    最后,为了完整起见,下面是它应该产生的图表:

    【讨论】:

      猜你喜欢
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 1970-01-01
      • 2011-08-29
      • 2015-09-28
      • 2014-09-10
      相关资源
      最近更新 更多