如何用z值色条绘制带x、y误差的散点图?
解决方案
首先注意你的x_err和y_err长度是4,而x、y、z是5个元素,先修正数据长度一致(比如补一个误差值),然后可以通过结合plt.errorbar()和plt.scatter()实现需求:
import matplotlib.pyplot as plt # 修正后的数据 x = [1,2,3,4,5] y = [2,3,4,5,6] z = [4,5,6,7,8] x_err = [0.1,0.2,0.3,0.2,0.1] # 补全为5个元素 y_err = [0.1,0.2,0.3,0.2,0.1] # 绘制误差棒,隐藏默认点(用marker='none') plt.errorbar(x, y, xerr=x_err, yerr=y_err, fmt='none', ecolor='gray', capsize=3) # 绘制带颜色映射的散点,颜色对应z值 scatter = plt.scatter(x, y, c=z, cmap='viridis') # 添加色条 plt.colorbar(scatter, label='z 值') # 设置标签 plt.xlabel('x') plt.ylabel('y') plt.title('x-y 带误差棒与z值色图') plt.show()
原理说明
plt.errorbar()负责绘制误差棒,通过fmt='none'隐藏自带的点,避免和scatter的点重叠。plt.scatter()利用c=z参数将z值映射到颜色,生成带颜色的点。- 最后通过
plt.colorbar()为scatter的颜色映射添加色条,实现z值的可视化。
如果需要让误差棒颜色也和z值对应,可以循环遍历每个数据点,单独绘制误差棒和点:
import matplotlib.pyplot as plt import numpy as np x = [1,2,3,4,5] y = [2,3,4,5,6] z = [4,5,6,7,8] x_err = [0.1,0.2,0.3,0.2,0.1] y_err = [0.1,0.2,0.3,0.2,0.1] cmap = plt.get_cmap('viridis') norm = plt.Normalize(min(z), max(z)) for xi, yi, zi, xe, ye in zip(x, y, z, x_err, y_err): # 获取对应z值的颜色 color = cmap(norm(zi)) # 绘制单个点的误差棒 plt.errorbar(xi, yi, xerr=xe, yerr=ye, fmt='none', ecolor=color, capsize=3) # 绘制单个点 plt.scatter(xi, yi, c=[color], s=50) # 添加色条 sm = plt.cm.ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) plt.colorbar(sm, label='z 值') plt.xlabel('x') plt.ylabel('y') plt.title('x-y 带误差棒与z值色图(误差棒随z变色)') plt.show()
内容的提问来源于stack exchange,提问作者Anirudh Salgundi
相关产品推荐
相关产品推荐

