您可以通过调用matplotlib.cm
库中的对象将标量值映射到色图上。这些值应该在0和1之间。因此,为了获取卡方分布数据的RBGA值(我将随机生成),可以执行以下操作:
chisq = np.random.chisquare(4, 8)
chisq -= chisq.min()
chisq /= chisq.max()
errorbar_colors = cm.winter(chisq)
可以不将颜色比例尺的起始值和结束值设定为最小和最大实际值,而是将最小值减去并除以所需的最大值。
现在,errorbar_colors
将是一个 (8, 4)
的 RGBA 值数组,取自 winter
颜色映射表:
array([[ 0. , 0.7372549 , 0.63137255, 1. ],
[ 0. , 0.7372549 , 0.63137255, 1. ],
[ 0. , 0.4745098 , 0.7627451 , 1. ],
[ 0. , 1. , 0.5 , 1. ],
[ 0. , 0.36078431, 0.81960784, 1. ],
[ 0. , 0.47843137, 0.76078431, 1. ],
[ 0. , 0. , 1. , 1. ],
[ 0. , 0.48627451, 0.75686275, 1. ]])
要绘制这个图形,您只需迭代颜色和数据点并绘制误差线:
heights = np.random.randn(8)
sem = .4
for i, (height, color) in enumerate(zip(heights, errorbar_colors)):
plt.plot([i, i], [height - sem, height + sem], c=color, lw=3)
plt.plot(heights, marker="o", ms=12, color=".3")
![在此输入图片描述](https://istack.dev59.com/44DN3.webp)
然而,内置的matplotlib调色板并不是非常适合这项任务。为了改进,您可以使用seaborn生成一个顺序调色板,可用于着色线条:
import numpy as np
import seaborn
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
chisq = np.random.chisquare(4, 8)
chisq -= chisq.min()
chisq /= chisq.max()
cmap = ListedColormap(seaborn.color_palette("GnBu_d"))
errorbar_colors = cmap(chisq)
heights = np.random.randn(8)
sem = .4
for i, (height, color) in enumerate(zip(heights, errorbar_colors)):
plt.plot([i, i], [height - sem, height + sem], c=color, lw=3)
plt.plot(heights, marker="o", ms=12, color=".3")
![输入图像描述](https://istack.dev59.com/H24Wn.webp)
但即使在这里,我也怀疑这是否是最好的传达观点的方式。我不知道您的数据长什么样,但我建议制作两个图表,一个图表显示您将在此绘制的因变量,另一个图表显示卡方统计量作为因变量。或者,如果您对误差线的大小与卡方值之间的关系感兴趣,可以直接用散点图来绘制。