对 y 轴标签进行分组,但保留单独的数据线

问题描述 投票:0回答:1

我有一个创建时间线图表的 flask 函数。我想对 y 轴标签进行分组,但保留单独的数据行。我怎样才能做到这一点?

这是我的功能:

def drawpipelinechart(ta='All'):
    table = pipeline_table().pipe(calc_fpfv_countdown)
    cols = [
        'ID',
        'PROTOCOL',
        'Quarter_Year',
        'Supplier_Selected',
        'TA',
        'PRODUCT'
    ]
    table = table[cols]
    table['End'] = pd.to_datetime(table['Quarter_Year'].str.split(
        ',').str[-1] + '-' + table['Quarter_Year'].str.split(',').str[0].str[-1] + '-01')
    table['Start'] = table['End'] - pd.offsets.MonthBegin(3)
    table['link'] = table.apply(lambda x: f'<a href="/vo/editpipelinerecord/{x["ID"]}" target="_blank" class="nav-link" style="cursor: pointer;" target="_blank"></a>', axis=1)

    now = pd.Timestamp.now()
    end_date = now + pd.offsets.MonthEnd(1) + pd.offsets.DateOffset(months=18)
    table = table[(table['End'] > now) & (table['End'] <= end_date)]
    table = table[table['TA']==ta] if ta != 'All' else table
    table.loc[:, 'Supplier_Selected'] = table['Supplier_Selected'].fillna('Open')
    fig = px.timeline(table, x_start="Start", x_end="End", y="PROTOCOL", text='PROTOCOL',
                      color="Supplier_Selected", hover_name="PROTOCOL", template="simple_white",
                      labels={"Supplier_Selected": "Supplier"}, custom_data=['link'],
                      )
    
    fig.update_yaxes(autorange="reversed")\
        .update_xaxes(
            showgrid=True,
            gridwidth=.5,
            gridcolor='lightgray',
            tickformat='%Y-Q%q',
            dtick='M3'
        )\
        .update_layout(
            margin=dict(t=100),
            xaxis=dict(side='top'),
            height=200+len(table['PROTOCOL'].unique())*40,
            autosize=True,
            yaxis_title=None,
        )\
        .update_traces(textposition='inside',
                       )

    # Add a horizontal line at each y-coordinate
    for y in table['PROTOCOL'].unique():
        fig.add_hline(y=y, line_dash="dot", line_width=1, line_color="gray")

    graphJSON = json.dumps(fig, cls=plotly.utils.PlotlyJSONEncoder)
    
    return graphJSON

目前给出这个:

我想按“产品”数据列对 y 轴标签进行分组

这是我想要的结果:

更新:

我添加了一个映射以将 y 轴上的“协议”转换为“产品”。现在我只需要弄清楚如何对它们进行分组。

我添加了这个:

yaxis=dict(
            title=None,
            tickmode='array',
            ticktext=table['PRODUCT'],
            tickvals=table['PROTOCOL'].unique()
        )

代码现在产生这个:

关于如何从这里对 y 轴标签进行分组有什么想法吗?

python plotly
1个回答
1
投票

由于您的问题没有样本数据,我将通过处理参考文献中的一些examples来回答我评论的方法。这个方法是在你想显示的索引位置设置你要显示的文本列表,用空文本作为y轴的索引。分组的索引个数为偶数时不能居中。 plotly 没有能力处理这个,所以这只是一个解决方法。

import plotly.express as px
import pandas as pd

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Resource="Alex"),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Resource="Alex"),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Resource="Bob"),
    dict(Task="Job D", Start='2009-01-01', Finish='2009-02-28', Resource="Bob"),
    dict(Task="Job E", Start='2009-03-05', Finish='2009-04-15', Resource="Bob"),
    dict(Task="Job F", Start='2009-03-05', Finish='2009-04-15', Resource="Bob"),
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color='Resource')
fig.update_yaxes(autorange="reversed")
fig.update_yaxes(tickvals=[0,1,2,3,4,5],ticktext=['','group1','','','group2',''])
fig.show()

© www.soinside.com 2019 - 2024. All rights reserved.