Python实现boxplot箱线图的箱体在x轴指定距离位置的绘制
修改要点
- 删除重复的箱线图绘制逻辑,仅保留一次绘制并传入位置参数
- 修正x轴范围,匹配距离数值的实际区间
- 确保距离列表和采集器列的顺序一一对应,不随意排序距离列表避免数据与位置错位
- 可自定义箱体宽度,避免距离较近的位置出现箱体重叠
修改后代码
sp_boxplot = 20 # 注意:dist列表顺序需和下方采集器列顺序一一对应,不要随意排序 dist = [139, 101, 52.5, 210, 91, 45.5] logger_cols = ['Logger 7', 'Logger 4', 'Logger 6', 'Logger 3', 'Logger 2', 'Logger 5'] fig1, ax1 = plt.subplots(figsize = (12,10)) # 直接在boxplot中传入positions参数指定每个箱体的对应位置 boxplt = df_lags_from_stormevents.boxplot( column = logger_cols, showfliers=False, grid = False, positions = dist, notch=True, widths=sp_boxplot, # 可调整数值修改箱体宽度,避免重叠 ax=ax1 ) boxplt.set_xlabel('Distance from coast', fontweight = 'bold', fontsize = 10) boxplt.set_ylabel('Delay at best correlation [hours]', fontweight = 'bold', fontsize = 10) # 修改x轴范围匹配实际距离区间,可根据显示效果调整边距 boxplt.set_xlim([min(dist)-20, max(dist)+20]) boxplt.set_ylim([0,50]) # 若需要x轴刻度显示采集器名称可保留下行,不需要则删除,会直接显示距离数值 plt.xticks(dist, logger_cols, rotation=45) boxplt.legend(loc = 'lower right', fontsize = 12) boxplt.text(0.05, 0.75, lin_func_b_median + '\n' + r'( r$^{2}$ = ' + (str(round(r2_lin_b,3))) + ')', transform = boxplt.transAxes, fontsize = 12, bbox=dict(facecolor='w', edgecolor = 'k')) plt.show()
关键修改说明
- 原代码同时调用了pandas的
boxplot和matplotlib的ax1.boxplot,相当于重复绘制两次,pandas默认将箱体放在1、2、3...的整数位置,搭配原xlim([0,7])设置刚好能显示默认位置的箱体,但完全匹配不了实际距离数值 positions直接使用原始dist列表即可,不要用sorted()打乱顺序,避免采集器数据和对应距离错位- 可根据最终显示效果调整
widths参数,控制箱体宽度避免重叠
内容的提问来源于stack exchange,提问作者Henriette Hansen
相关产品推荐
相关产品推荐

