Python 根据colormap在2D中显示颜色错误条

Python 根据colormap在2D中显示颜色错误条,python,matplotlib,color-mapping,Python,Matplotlib,Color Mapping,乍一看,这是一个相当简单的问题,但我还没有找到解决方案。有一个类似的(旧的)问题,但似乎不适用于两个维度的误差条 我需要生成一个“errorbar”图,其中两个错误条(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.

乍一看,这是一个相当简单的问题,但我还没有找到解决方案。有一个类似的(旧的)问题,但似乎不适用于两个维度的误差条

我需要生成一个“errorbar”图,其中两个错误条(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
是否使用
ecolor
color
参数

有什么办法吗?

plt.errorbar()
生成三个独立的对象:点之间的线、每个errorbar cap的线(如果有)以及包含errorbar线本身的
matplotlib.collections.LineCollection
ecolor
参数最终被传递到
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)
这将生成如下图:


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

谢谢,但是,尽管你的解释很清楚,但它并不能真正解决问题。@Gabriel这怎么不能解决问题呢?您希望将errorbar线的颜色指定为浮动,这正是它的作用。这会指定随机颜色,这不是我需要的。当然,它会指定随机颜色,因为我不知道您实际需要什么颜色。只需输入您想要的RGB值,而不是调用
np.random.rand
。重点是向您展示如何使用
ecolor
参数,实际颜色是不相关的。但是看起来你有自己的解决方案,所以一切都很好。我想要的颜色是那些由
cc
数组中的浮点数编码的颜色。您的解决方案重新写入此数组。