简体   繁体   English

Plotly:如何在甘特图上标记条形图?

[英]Plotly: How to label bars on a gantt chart?

Is there any way to create in Plotly Gantt chart with Task labels on bars and Resource labels on y-axis?有没有办法在 Plotly Gantt 图表中创建条形图上的任务标签和 y 轴上的资源标签?

There is no such example in documentation of plotly.figure_factory.create_gantt . plotly.figure_factory.create_gantt文档中没有这样的例子。 An abstract example of desirable chart is presented below:理想图表的抽象示例如下所示:

在此处输入图片说明

You can add annotations structured as a list of dictionaries in fig['layout']['annotations'] based on a setup like the first example from your link .您可以根据链接中第一个示例的设置,在fig['layout']['annotations']添加结构化为字典列表的fig['layout']['annotations']

Plot:阴谋:

在此处输入图片说明

Code:代码:

The structure of the plot is similar to the source above, but I've set it up to work with iplot() in an off-line Jupyter Notebook.该图的结构类似于上面的源代码,但我已将其设置为在离线 Jupyter Notebook 中与iplot()一起使用。

# imports
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
from IPython.core.display import display, HTML
import plotly.figure_factory as ff
import plotly.graph_objs as go

# setup
display(HTML("<style>.container { width:50% !important; } .widget-select > select {background-color: gainsboro;}</style>"))
init_notebook_mode(connected=True)

#%qtconsole --style vim

# dates
StartA = '2009-01-01'
StartB = '2009-03-05'
StartC = '2009-02-20'

FinishA='2009-02-28'
FinishB='2009-04-15'
FinishC='2009-05-30'

LabelDateA='2009-01-25'
LabelDateB='2009-03-20'
LabelDateC='2009-04-01'

# sample data
df = [dict(Task="Task A", Start=StartA, Finish=FinishA),
      dict(Task="Task B", Start=StartB, Finish=FinishB),
      dict(Task="Task C", Start=StartC, Finish=FinishC)]

# figure
fig = ff.create_gantt(df)

# add annotations
annots =  [dict(x=LabelDateA,y=0,text="Task label A", showarrow=False, font=dict(color='white')),
           dict(x=LabelDateB,y=1,text="Task label B", showarrow=False, font=dict(color='White')),
           dict(x=LabelDateC,y=2,text="Task label C", showarrow=False, font=dict(color='White'))]

# plot figure
fig['layout']['annotations'] = annots
iplot(fig)

Possible improvements:可能的改进:

As you can see, I've hard-coded the dates where the labels are positioned.如您所见,我对标签所在的日期进行了硬编码。 You could just as easily calculate the middle date between the start and end dates.您可以轻松计算开始日期和结束日期之间的中间日期。 But why not simply adjust the labels using align=center in (x=LabelDateC,y=2,align="center",text="Task label C", showarrow=False, font=dict(color='White')) ?但为什么不简单地使用align=center in (x=LabelDateC,y=2,align="center",text="Task label C", showarrow=False, font=dict(color='White')) ? That won't work because the label seems to be attached to the dates itself and not the structure or size of the bar.这是行不通的,因为标签似乎附加到日期本身,而不是条的结构或大小。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM