根据色彩映射在2D中的颜色错误

时间:2018-05-14 17:03:35

标签: python matplotlib color-mapping

乍一看这是一个相当简单的问题,但我找不到解决方案。有一个类似的(旧)问题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参数。

有什么方法吗?

2 个答案:

答案 0 :(得分:0)

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

  

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

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

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

cc

这会产生如下情节:

enter image description here

答案 1 :(得分:0)

我找到了解决方案。诀窍是使用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()

enter image description here