【问题标题】:Color errorbars in 2D according to colormap根据颜色图在 2D 中颜色误差条
【发布时间】:2018-10-24 10:08:02
【问题描述】:

乍一看这是一个相当简单的问题,但我一直无法找到解决方案。有一个类似的(旧)问题here,但closest answer given 似乎不适用于两个维度的误差线。

我需要生成一个“误差线”图,其中两个误差线(在 x 和 y 维度上)根据 cc 数组中的值进行着色。

代码:

import numpy as np
import matplotlib.pyplot as plt

# Some random data
aa = np.array([3.581, -0.721, 0.137, 0.645, 0.12, 0., -3.236, 0.248, -5.687, 0.816])
e_aa = np.array([0.111, 0.991, 0.446, 0.07, 0.814, 0., 0.088, 0.805, 0.178, 0.552])
bb = np.array([6.671, 1.219, 0.119, -1.972, 1.834, 0., 4.93, 1.833, -11.542, -0.439])
e_bb = np.array([0.143, 1.316, 0.609, 0.094, 1.127, 0., 0.116, 1.227, 0.216, 0.726])

# The color array
cc = np.array([0.50344083, 0.49961867, 0.5055576, 0.48970365, 0.5078516, 0.49643923, 0.50089907, 0.50129157, 0.49627974, 0.5052376])

plt.errorbar(aa, bb, yerr=e_bb, xerr=e_aa, fmt='none', ecolor=cc)
plt.show()

失败并显示:

ValueError: Invalid RGBA argument: 0.50344083

我是否使用ecolorcolor 参数。

有没有办法解决这个问题?

【问题讨论】:

    标签: python matplotlib color-mapping


    【解决方案1】:

    我找到了解决方案。诀窍是使用matplotlib.cm 将浮点数映射到有效的颜色图。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    from matplotlib.colors import Normalize
    
    # Some random data
    aa = np.array([3.581, -0.721, 0.137, 0.645, 0.12, 0., -3.236, 0.248, -5.687, 0.816])
    e_aa = np.array([0.111, 0.991, 0.446, 0.07, 0.814, 0., 0.088, 0.805, 0.178, 0.552])
    bb = np.array([6.671, 1.219, 0.119, -1.972, 1.834, 0., 4.93, 1.833, -11.542, -0.439])
    e_bb = np.array([0.143, 1.316, 0.609, 0.094, 1.127, 0., 0.116, 1.227, 0.216, 0.726])
    
    # The color array
    cc = np.array([0.50344083, 0.49961867, 0.5055576, 0.48970365, 0.5078516, 0.49643923, 0.50089907, 0.50129157, 0.49627974, 0.5052376])
    
    # Define function to map (normalized) values in `cc` to a colormap
    cmap = cm.viridis
    norm = Normalize(vmin=cc.min(), vmax=cc.max())
    
    plt.errorbar(aa, bb, yerr=e_bb, xerr=e_aa, fmt='none', ecolor=cmap(norm(cc)))
    plt.show()
    

    【讨论】:

      【解决方案2】:

      plt.errorbar() 生成三个单独的对象:点之间的线、每个误差线上限的线(如果有)以及包含误差线本身的matplotlib.collections.LineCollectionecolor 参数最终传递给matplotlib.collections.LineCollection.set_color(),它接受:

      Matplotlib 颜色参数(所有补丁具有相同的颜色)或 rgba 元组序列;如果它是一个序列,补丁将在序列中循环。

      您的数组cc 不是这些。该方法接收一个序列,因此它尝试将集合中每一行的颜色设置为序列的每个元素。但这些元素只是单个浮点数,它们不是有效的 matplotlib 颜色。

      要解决此问题,请生成一个元组列表,每个元组指定每个错误栏的线段的 RGB[A] 颜色。例如,使用您在问题中指定的其他数据,颜色可以设置为:

      cc = np.random.rand(aa.size, 3) # Random colors, RGB tuples uniform on (0, 1)
      collections = plt.errorbar(aa, bb, yerr=e_bb, xerr=e_aa, fmt='none', ecolor=cc)
      

      这会生成如下图:

      【讨论】:

      • 谢谢,虽然你的解释很清楚,但并不能真正解决问题。
      • @Gabriel 这怎么不能解决问题?您想将错误栏线的颜色指定为浮点数,这正是它的作用。
      • 这会分配随机颜色,这不是我需要的。
      • 当然它会分配随机颜色,因为我不知道你真正想要什么颜色。只需输入您确实想要的 RGB 值,而不是调用np.random.rand。重点是向您展示如何使用 ecolor 参数,实际颜色无关紧要。但似乎你有自己的解决方案,所以一切都很好。
      • 我想要的颜色是由 cc 数组中的浮点数编码的颜色。您的解决方案会重写此数组。
      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2018-01-25
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多