如何用Plotly/Python制作交替分段堆叠条形图(非日期X轴)
实现Plotly/Python交替分段的浮点数X轴堆叠条形图
问题说明
我想用Plotly/Python制作包含两类交替分段的堆叠条形图。最初使用graph_objects的stacked模式时,同类型分段会被自动归为一组(如我的场景中所有Resource A段呈AABB排列),但我需要ABAB的交替排列。尝试用Plotly Express的timeline函数做出了接近预期的效果,但该函数仅支持日期型X轴,我需要保留一位小数的浮点数X轴,请问如何实现?
原参考示例(使用日期轴,仅作效果参考):
import pandas as pd import plotly.express as px df = pd.DataFrame([ dict(Task="", Start='2009-01-01', Finish='2009-02-28', Resource='A'), dict(Task="", Start='2009-02-28', Finish='2009-04-15', Resource='B'), dict(Task="", Start='2009-04-15', Finish='2009-05-30', Resource='A'), dict(Task="", Start='2009-05-30', Finish='2009-06-15', Resource='B'), ]) fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color = "Resource") fig.show()
解决方案:手动构建Graph Objects条形图
直接使用plotly.graph_objects.Bar,通过设置每个分段的起始位置(base)和宽度(x),实现浮点数X轴的交替分段效果,无需依赖日期类型。
完整代码示例
import pandas as pd import plotly.graph_objects as go # 构造浮点数数据的DataFrame df = pd.DataFrame([ dict(Task="", Start=0.0, Finish=1.5, Resource='A'), dict(Task="", Start=1.5, Finish=3.2, Resource='B'), dict(Task="", Start=3.2, Finish=4.7, Resource='A'), dict(Task="", Start=4.7, Finish=5.3, Resource='B'), ]) fig = go.Figure() # 遍历数据,逐个添加分段条形 for idx, row in df.iterrows(): fig.add_trace(go.Bar( y=[row['Task']], # 固定y轴值,确保所有分段在同一行 x=[row['Finish'] - row['Start']], # 条形宽度为结束值减起始值 base=[row['Start']], # 设置条形的起始位置 marker_color='#1f77b4' if row['Resource'] == 'A' else '#ff7f0e', # 对应资源的颜色 name=row['Resource'], showlegend=(idx == 0 or idx == 1) # 仅在首次出现时显示图例,避免重复 )) # 配置图表布局 fig.update_layout( barmode='overlay', # 使用叠加模式,配合base参数精准控制位置 xaxis=dict( tickformat='.1f', # 设置X轴显示一位小数 title='数值轴' ), yaxis=dict( showticklabels=False # 隐藏y轴标签,因Task字段为空 ), title='交替分段的浮点数X轴条形图' ) fig.show()
关键说明
- 放弃
stacked模式,改用overlay模式,每个分段作为独立的Bar trace,通过base参数指定起始位置,x参数指定宽度,完全控制每个分段的位置,实现ABAB交替排列。 - 通过
tickformat='.1f'强制X轴显示一位小数,满足浮点数格式需求。 - 手动设置资源对应的颜色,并控制图例仅显示一次,保持图表简洁。
内容的提问来源于stack exchange,提问作者Caity
相关产品推荐
相关产品推荐

