我有一个创建时间线图表的 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 轴标签进行分组有什么想法吗?
由于您的问题没有样本数据,我将通过处理参考文献中的一些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()