Plotly多面柱状图:仅显示各子图数据中存在的X轴刻度
解决Plotly分面柱状图X轴仅显示有效刻度的问题
当前代码的问题在于Plotly分面图默认开启共享X轴(sharex=True),即便你过滤掉了count=0的数据,所有子图还是会沿用原始数据集的全部X轴刻度。要让每个子图只显示自身存在的有效刻度,需要关闭轴共享并为每个子图单独配置X轴:
修改后的完整代码
import pandas as pd import plotly.express as px df = pd.DataFrame({ 'row': [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1], 'col': [0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1 ], 'x_value': [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4], 'count': [1,7,4,0,0,3,1,3,1,9,2,2,0,0,3,4] }) df = df.query('count != 0 ') # 关键改动1:关闭X轴共享 fig = px.bar(df, x='x_value', y='count', facet_col='col', facet_row='row', template='simple_white', sharex=False) # 关键改动2:为每个子图单独设置X轴刻度 for i, trace in enumerate(fig.data): # 获取当前子图对应的x_value集合(去重并排序) sub_df = df[(df['row'] == trace.facet_row) & (df['col'] == trace.facet_col)] valid_x = sorted(sub_df['x_value'].unique()) # 找到对应子图的X轴对象并更新 xaxis = fig.layout[f'xaxis{i+1}'] xaxis.update( showticklabels=True, title_font=dict(size=20), type='category', tickvals=valid_x, ticktext=valid_x, categoryorder='array', # 按valid_x的顺序显示刻度 categoryarray=valid_x ) fig.show()
核心改动说明
- 关闭轴共享:在
px.bar中添加sharex=False,让每个子图拥有独立的X轴配置权。 - 子图单独配置:遍历每个子图对应的trace,筛选出该子图下的有效
x_value,然后更新对应X轴的tickvals和ticktext,同时指定categoryorder确保刻度按数据存在的顺序显示。
这样每个子图就只会显示自身数据中实际存在的X轴刻度,彻底移除无效的空刻度。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

