如何使用数据集(nd.array)在散点图中对误差条(x 和 y)进行颜色映射?

mur*_*phy 5 python matplotlib scatter-plot color-mapping

我正在尝试创建一个带有 x 和 y 误差的散点图,它们在四个部分中具有不同的标记和误差条颜色(例如,x=0 到 x=2 的红色,x=2 到 c=5 的蓝色等)。我使用了带有标记边界的颜色图,但我无法对错误栏做类似的事情。我尝试使用this answer to a similar question将标记、错误栏和大写字母设置为散点颜色图中的相同颜色,但我无法让它为我的代码工作(出现了一个关于数据长度不匹配或无法转换为元组)。我想我无法为我用于标记的颜色图正确修改它,或者这不是获得正确结果的最佳方法。

这是一个包含一些虚构数据的示例:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors

bounds = [0,1.5,3,4.5,5]
colors = ["r", "b", "g", "y"]
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(bounds, len(colors))

x = np.array([0.0, 0.0, 1.0, 2.0, 2.0, 3.0,  4.0,  4.0, 5.0, 5.0])
y = np.array([0.0, 0.1, 0.8, 0.9, 0.7, 0.1, -0.8, -0.5, -1.0, -0.7])
x_err = np.array([0.05, 0.06, 0.04, 0.045, 0.04, 0.06, 0.05, 0.055, 0.02, 0.05])
y_err = np.array([0.04, 0.05, 0.03, 0.055, 0.145, 0.065, 0.045, 0.15, 0.015, 0.17])

plt.scatter(x, y, marker='D', c=x, cmap=cmap, norm=norm)
plt.errorbar(x, y, xerr=x_err, yerr=y_err, fmt='.', lw=2, capsize=3, alpha=0.7, zorder=0)

plt.show()
Run Code Online (Sandbox Code Playgroud)

这使

这个.

如何让误差条与散点图中使用的颜色图具有相同的颜色图?

Ste*_*tef 1

这当然不是最快的方法,但它有效:使用获取每个 x 值的颜色to_rgba,然后逐点绘制误差线(对于大数据数组可能很慢):

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
import matplotlib.cm

bounds = [0,1.5,3,4.5,5]
colors = ["r", "b", "g", "y"]
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(bounds, len(colors))

x = np.array([0.0, 0.0, 1.0, 2.0, 2.0, 3.0,  4.0,  4.0, 5.0, 5.0])
y = np.array([0.0, 0.1, 0.8, 0.9, 0.7, 0.1, -0.8, -0.5, -1.0, -0.7])
x_err = np.array([0.05, 0.06, 0.04, 0.045, 0.04, 0.06, 0.05, 0.055, 0.02, 0.05])
y_err = np.array([0.04, 0.05, 0.03, 0.055, 0.145, 0.065, 0.045, 0.15, 0.015, 0.17])

plt.scatter(x, y, marker='D', c=x, cmap=cmap, norm=norm)

colors = matplotlib.cm.ScalarMappable(norm,cmap).to_rgba(x)
for i,_ in enumerate(x):
  plt.errorbar(x[i], y[i], xerr=x_err[i], yerr=y_err[i], fmt='.', lw=2, capsize=3, alpha=0.7, zorder=0, ecolor=colors[i])  

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述