Matplotlib中误差棒沿X轴向右偏移1个单位的解决咨询
问题描述
绘制带虚线连接的散点图并添加误差棒时,误差棒沿X轴向右偏移1个单位,无法与虚线重合。尝试给x1加1时出现整数与字符串类型不兼容问题,调整xlim至0也未解决。相关代码如下:
import matplotlib.pyplot as plt import numpy as np #House A x1=[1, 2, 3] y1=[44.23777993, 1.412909458, 0.07779971243] #House B x2=[1, 2, 3] y2=[6.19927899,1.00263735,0.09018145733] #House C x3=[1, 2, 3] y3=[5.631459288,3.198409548,2.141106453] #House D x4=[1, 2, 3] y4=[1.545221235,0.065499083,0] #error bar values #HouseA y1error=[0.07781274738, 0.394854516, 1.040530416] #HouseB y2error=[0.1445699413, 0.4590436542, 1.303785259] #HouseC y3error=[0.08168626561, 0.1449873167, 0.1714882825] #HouseD y4error=[0.1737233193, 1.1360461, 0] plt.plot([str(i) for i in x1], y1, linestyle='dashed', marker='s') plt.plot([str(i) for i in x2], y2, linestyle='dashed', marker='s') plt.plot([str(i) for i in x3], y3, linestyle='dashed', marker='s') plt.plot([str(i) for i in x4], y4, linestyle='dashed', marker='s') #error bars plt.errorbar(x1, y1, yerr=y1error, color='cornflowerblue', ecolor='k', capsize=8, capthick=0.8) plt.errorbar(x2,y2,yerr=y2error,color='darkmagenta', ecolor='k', capsize=8, capthick=0.8) plt.errorbar(x3, y3,yerr=y3error, color='olivedrab', ecolor='k', capsize=8, capthick=0.8) plt.errorbar(x4,y4,yerr=y4error, color='goldenrod', ecolor='k', capsize=8, capthick=0.8) axis_x= range(1,3) axis_y=range(0,70) plt.ylim((0,70)) plt.rcParams['figure.figsize'] = [8, 6] plt.show()
解决方法
偏移问题的核心原因是X轴数据类型不统一:plt.plot使用了字符串类型的X值,而plt.errorbar使用了整数类型的X值,Matplotlib对两种类型的刻度定位逻辑不同,导致错位。
关键修正步骤
- 统一所有绘图函数的X轴数据类型,全部使用整数类型的原始X值,不要将X值转换为字符串
- 若需要自定义X轴刻度显示为字符串,单独通过
plt.xticks()设置,而非修改原始X数据
修正后的完整代码
import matplotlib.pyplot as plt import numpy as np # House A x1 = [1, 2, 3] y1 = [44.23777993, 1.412909458, 0.07779971243] # House B x2 = [1, 2, 3] y2 = [6.19927899, 1.00263735, 0.09018145733] # House C x3 = [1, 2, 3] y3 = [5.631459288, 3.198409548, 2.141106453] # House D x4 = [1, 2, 3] y4 = [1.545221235, 0.065499083, 0] # error bar values # House A y1error = [0.07781274738, 0.394854516, 1.040530416] # House B y2error = [0.1445699413, 0.4590436542, 1.303785259] # House C y3error = [0.08168626561, 0.1449873167, 0.1714882825] # House D y4error = [0.1737233193, 1.1360461, 0] # 统一使用整数类型X值绘图,移除字符串转换 plt.plot(x1, y1, linestyle='dashed', marker='s', color='cornflowerblue') plt.plot(x2, y2, linestyle='dashed', marker='s', color='darkmagenta') plt.plot(x3, y3, linestyle='dashed', marker='s', color='olivedrab') plt.plot(x4, y4, linestyle='dashed', marker='s', color='goldenrod') # 误差棒使用相同的X值,确保与折线对齐 plt.errorbar(x1, y1, yerr=y1error, color='cornflowerblue', ecolor='k', capsize=8, capthick=0.8) plt.errorbar(x2, y2, yerr=y2error, color='darkmagenta', ecolor='k', capsize=8, capthick=0.8) plt.errorbar(x3, y3, yerr=y3error, color='olivedrab', ecolor='k', capsize=8, capthick=0.8) plt.errorbar(x4, y4, yerr=y4error, color='goldenrod', ecolor='k', capsize=8, capthick=0.8) # 设置Y轴范围与图形大小 plt.ylim((0, 70)) plt.rcParams['figure.figsize'] = [8, 6] # 若需要将X轴刻度显示为字符串,取消下方注释 # plt.xticks(x1, [str(i) for i in x1]) plt.show()
内容的提问来源于Stack Exchange,提问作者Hoskin
相关产品推荐
相关产品推荐

