Plotly绘制条形图Y轴数值乱序显示异常如何修复
问题根源
你遇到的Y轴价格排序混乱问题,由两个核心错误导致:
- 两个数据集的
BARCODE字段格式不统一,筛选逻辑存在隐式错误:仅对df_bar的条码做了字符串截断处理,df_markets中的条码仍为数值类型,isin()匹配时会出现类型转换偏差,筛出的数据集混入无关数据;同时原有str(x)[:-2]的条码处理写法存在浮点数精度问题,容易生成错误的条码值。 - 价格列数据类型异常:从你贴的
df_markets_rm样例可以看到部分行存在列值错位粘连的问题,导致AB价格列混入非数值内容,Plotly会自动将Y轴识别为分类轴而非连续数值轴,数值就会按出现顺序排布而非按大小排序,最终出现混乱效果。
修复代码
按以下步骤调整代码即可正常展示价格波动:
import plotly.express as px import pandas as pd # -------------------------- # 第一步:统一两个表的BARCODE格式,从根源解决匹配错误 # -------------------------- # 处理df_bar:浮点数条码先转整数(规避科学计数法、.0后缀问题),再转为13位标准字符串 df_bar['BARCODE'] = df_bar['BARCODE'].apply(lambda x: str(int(x)).zfill(13)) # 处理df_markets:数值型条码统一转为和df_bar一致的13位字符串 df_markets['BARCODE'] = df_markets['BARCODE'].astype(str).str.zfill(13) # -------------------------- # 第二步:筛选目标数据+清洗价格列 # -------------------------- # 提取category_id=61对应的目标条码集合 target_barcodes = df_bar.loc[df_bar['category_id'] == 61.0, 'BARCODE'].unique() # 筛选出超市数据中对应条码的记录 df_markets_rm = df_markets[df_markets['BARCODE'].isin(target_barcodes)].copy() # 强制将所有价格列转为数值类型,无法解析的脏数据转为空值,保证Y轴被识别为连续轴 price_columns = ['AB', 'BFRESH', 'LIDL', 'SUPERM'] for col in price_columns: df_markets_rm[col] = pd.to_numeric(df_markets_rm[col], errors='coerce') # 将日期索引转为普通列,避免Plotly解析索引时出现异常 df_markets_rm = df_markets_rm.reset_index() # 如果你发现列错位问题仍然存在,说明最开始读取df_markets时分隔符识别错误 # 重新读取文件时指定分隔符即可,比如多空格分隔的文件用以下写法读取: # df_markets = pd.read_csv('markets_data.csv', sep='\s+', parse_dates=['Date'], index_col='Date') # -------------------------- # 第三步:调整绘图参数 # -------------------------- fig = px.bar( df_markets_rm, x='Date', y='AB', hover_data=['BARCODE', 'AB'], color='BARCODE', labels={'AB': 'AB超市商品售价'}, height=800, width=1000, facet_row='BARCODE', facet_row_spacing=0.05 # 调整分面间距,避免条码标签重叠 ) # 可选:放开分面Y轴的统一范围限制,每个商品单独适配价格区间,波动展示更清晰 fig.update_yaxes(matches=None, showticklabels=True) fig.show()
内容的提问来源于stack exchange,提问作者Zoi K.
相关产品推荐
相关产品推荐

