基于第二列以固定顺序在 Plotly 中绘制堆积条形图

Plot stacked barchar in Plotly with fixed order based on second column

我有一个如下所示的数据框:

index, start, end, bar_len,name,color, gr
1,2300000.0,5300000.0,3000000.0,p36.32,#949494, g1
2, 5300000.0,7100000.0,1800000.0,p36.31,#FFFFFF,  g1
3, 7100000.0,9100000.0,2000000.0,p36.23,#949494, g1
4, 9100000.0,12500000.0,3400000.0,p36.22,#FFFFFF, g1

我想创建一个具有以下输出的水平堆叠 barchar:

| - indx[1] [len=bar_len] | - indx[2] [len=bar_len] | - indx[3] [len=bar_len] | - indx[4] [len=bar_len]

我尝试按以下方式执行此操作:

import plotly.express as px
import pandas as pd

input_path = r"example.csv"
df = pd.read_csv(input_path)
df.set_index('start')
fig = px.bar(
    df, x='bar_len', y='gr', color="DS_COLOR", orientation='h',
)

fig.update_layout(barmode='stack', xaxis={'categoryorder':'category ascending'})

问题是绘制在 barchar 上的值没有按开始列排序,这正是我想要做的。因此,我的问题是:有没有办法绘制一个堆叠的 bachar,它根据其中一列 (bar_len) 绘制每个元素的长度,并根据另一列 ([=13] 对这些绘制的元素进行排序=])?

更新:我发现包含颜色标签时会出现问题。此标签根据颜色对条形图进行排序,而不是保留基于索引列的原始顺序。有什么办法可以避免这种情况吗?

您可以使用 plotly graph_objects 构建它。下面的代码来做必要的。 注意: 在数据框中,我将颜色更改为 HEX CODE,红色为 #FF0000,蓝色为 #0000FF。我只使用了 bar_lencolorgr 列。取自此df 看起来像这样

    start   end bar_len name    color   gr
0   2300000.0   5300000.0   3000000.0   p36.32  #FF0000 g1
1   5300000.0   7100000.0   1800000.0   p36.31  #0000FF g1
2   7100000.0   9100000.0   2000000.0   p36.23  #FF0000 g1
3   9100000.0   12500000.0  3400000.0   p36.22  #0000FF g1

代码在这里:

import pandas as pd
import plotly.graph_objects as go

input_path = r"example.csv"
df = pd.read_csv(input_path)

data = []
for i in range(len(df)):
    data.append(go.Bar(x=[df['bar_len'][i]], y=[df['gr'][i]], marker=dict(color=df['color'][i]), orientation = 'h'))
layout = dict(barmode='stack', yaxis={'title': 'gr'}, xaxis={'title': 'Length'})
fig = go.Figure(data=data, layout=layout)
fig.update_layout(showlegend=False, autosize=False, width=800, height=300)
fig.show()

输出图表

注意:如果 x-axis 可以表示为时间线,并且您能够将 x 值作为日期时间,建议您还查看 plotly.express.timeline 图表,它给出了甘特图形式图。示例 - 检查第一个图表...