乍一看这是一个相当简单的问题,但我找不到解决方案。有一个类似的(旧)问题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
我是否使用ecolor
或color
参数。
有什么方法吗?
答案 0 :(得分:0)
execle
生成三个单独的对象:点之间的线,每个错误栏上限(如果有)的行,以及包含错误栏行本身的plt.errorbar()
。 matplotlib.collections.LineCollection
参数最终传递给ecolor
,它接受:
Matplotlib颜色参数(所有补丁都有相同的颜色)或一系列rgba元组;如果是序列,则补丁将在序列中循环。
您的阵列matplotlib.collections.LineCollection.set_color()
不属于这些。该方法接收一个序列,因此它尝试将集合中每一行的颜色设置为序列的每个元素。但这些元素只是单个浮点数,它们不是有效的matplotlib颜色。
要解决此问题,请生成元组列表,每个元组指定每个errrorbar的线段的RGB [A]颜色。例如,使用您在问题中指定的其他数据,颜色可以设置为:
cc
这会产生如下情节:
答案 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()