如何使用matplotlib基于pandas数据绘制不同颜色的非对称误差棒
问题原因
你遇到的报错是两个原因共同导致的:
- matplotlib的
errorbar方法的yerr参数接收的是误差的相对偏移量,而非y轴的绝对上下限数值。你代码里的MinY_values是y值的下限,MaxY_values是y值的上限,需要先换算为相对y的偏移:向下误差为y_val - min_val,向上误差为max_val - y_val。 - 你是在循环中逐个绘制单个数据点,此时传入非对称误差时,需要将两个偏移量包装为形状为
(2,1)的二维数组,直接传入[向下误差, 向上误差]会被识别为给2个数据点的对称误差,才会触发“数据长度1和误差长度2不匹配”的报错。
修改后的完整代码
仅需要调整循环内的yerr参数即可实现需求:
import pandas as pd from matplotlib.pyplot import plot, show, subplots import numpy as np # 定义数据框 df = pd.DataFrame({'Colors': {0: 'Red', 1: 'Blue', 2: 'Green', 3: 'Blue'}, 'X_values': {0: 1, 1: 2, 2: 3, 3: 4}, 'Y_values': {0: 2, 1: 4, 2: 8, 3: 10}, 'MinY_values': {0: 1.5, 1: 3, 2: 7.5, 3: 8}, 'MaxY_values': {0: 2.5, 1: 5, 2: 9.5, 3: 11}}) # 定义颜色映射 color = [] for i in df['Colors']: if i == 'Red': color.append('red') if i == 'Blue': color.append('blue') if i == 'Green': color.append('green') # 绘图 fig,axes = subplots(2,1,sharex = True) for x_val,y_val,min_val,max_val,colors in zip(df['X_values'],df['Y_values'],df['MinY_values'],df['MaxY_values'],color): axes[0].errorbar(x_val,y_val,yerr = [[y_val - min_val], [max_val - y_val]], color = colors,barsabove='True',fmt = '+') for x_val,y_val,min_val,max_val,colors in zip(df['X_values'],df['Y_values'],df['MinY_values'],df['MaxY_values'],color): axes[1].errorbar(x_val,y_val,yerr = [[y_val - min_val], [max_val - y_val]], color = colors,barsabove='True',fmt = '+') show()
内容的提问来源于stack exchange,提问作者Julien
相关产品推荐
相关产品推荐

