Plotly分组柱状图按LABEL升序、组内Value降序排序及底部标签移除
问题解决方案
调整思路
- 你之前的排序逻辑是正确的,但是Plotly自带的多级分类轴排序规则会覆盖你预先排序的结果,因此我们改用自定义连续x轴位置的方式,完全保留预先排好的顺序,同时在不同LABEL分组之间留空做视觉区隔
- 直接隐藏x轴的全部刻度、标签元素,满足无需重复展示的需求
完整调整后代码
from plotly import graph_objs as go import plotly.express as px import pandas as pd # 测试数据 df = pd.DataFrame({'LABEL': ['1', '1', '2', '2', '3', '3', '3', '3'], 'Cat2': ['a', 'b', 'a', 'b', 'c', 'a', 'e', 'f'], 'Value': [3, 2, 1, 4, 1, 3, 4, 1]}) # 预先按要求排序:LABEL升序,同LABEL内Value降序 df.sort_values(by=['LABEL', 'Value'], ascending=[True, False], inplace=True) # 生成自定义x轴位置,不同LABEL分组之间留1个单位的间隔做区隔 x_pos_list = [] current_x = 0 last_label = None for label in df['LABEL']: if last_label is not None and label != last_label: current_x += 1 x_pos_list.append(current_x) current_x += 1 df['x_pos'] = x_pos_list COLOR_MAP = {str(i): c for i, c in enumerate(px.colors.qualitative.Light24)} fig = go.Figure() for label in df['LABEL'].unique(): sub_df = df[df['LABEL'] == label] fig.add_trace(go.Bar( x=sub_df['x_pos'], y=sub_df['Value'], marker=dict(color=COLOR_MAP[label]), name=f'分组{label}' )) # 布局配置 fig.update_layout( legend_title='Cat1', xaxis=dict( showticklabels=False, # 隐藏x轴标签 showline=False, # 隐藏x轴线 showgrid=False, # 隐藏x轴网格线 zeroline=False ) ) fig.show()
效果说明
运行代码后会得到完全符合要求的图表:
- 分组顺序严格按LABEL升序排列,每个分组内部的柱子按Value从高到低排列
- 底部x轴没有任何标签,仅保留图例做分类说明
- 不同分组之间有自然的间隔,视觉上分组清晰
内容的提问来源于stack exchange,提问作者Mateusz Konopelski
相关产品推荐
相关产品推荐

