如何在Plotly(Python)中自定义日期时间刻度

时间:2020-04-17 07:24:24

标签: python plotly-dash gantt-chart xticks

所以我用Plotly的Dash创建了一个甘特图,如果不是x轴刻度线的话,我会很高兴。

这是我的图表:

enter image description here

很好,但x轴刻度线。我想根据自己的需要对其进行自定义:

  1. 我希望他们从星期一(1月4日)开始,而不是星期日(1月10日),并像他们一样每周继续进行

  2. 而不是“ Jan 04”,刻度标签应该是这样的:“ KW:01('21)”。在这里,KW应该表示日历周。

  3. 我不想显示每个刻度标签。如果图表仅显示一年的前KW和五分之一

因此,我在寻找一种方法来执行此操作,并在Plotly Layout References (xaxis-tickvals)中发现应该有一种流畅的方法。我只需要为图表中的位置提供一个tickvals列表,为标签提供一个tickmarktext列表,就需要将tickmode设置为“ array”。

由于我的代码太长,我只提供一个例子。假设这是我的代码:

import plotly.figure_factory as ff
import datetime

df = [dict(Task="Job A", Start='2021-01-08', Finish='2021-01-29'),
  dict(Task="Job B", Start='2021-01-15', Finish='2021-02-12'),
  dict(Task="Job C", Start='2021-01-29', Finish='2021-02-19'),
  dict(Task="Job D", Start='2021-02-05', Finish='2021-02-26')]

my_figure = ff.create_gantt(df, showgrid_x=True, showgrid_y=True)
weeks_ticktext = ['KW: 01 (\'21)', '', '', '', 'KW: 05 (\'21)', '', '', '', '']
weeks_tickvals = [datetime.datetime(2021, 1, 4, 0, 0), datetime.datetime(2021, 1, 11, 0, 0),
          datetime.datetime(2021, 1, 18, 0, 0), datetime.datetime(2021, 1, 25, 0, 0),
          datetime.datetime(2021, 2, 1, 0, 0), datetime.datetime(2021, 2, 8, 0, 0),
          datetime.datetime(2021, 2, 15, 0, 0), datetime.datetime(2021, 2, 22, 0, 0),
          datetime.datetime(2021, 3, 1, 0, 0)]
my_figure.layout.xaxis['tickmode'] = 'array'
my_figure.layout.xaxis['tickvals'] = weeks_tickvals
my_figure.layout.xaxis['ticktext'] = weeks_ticktext
my_figure.show()

然后,此代码将产生以下图形:

enter image description here

现在,我不明白为什么x轴没有启动并且没有按照我希望的方式显示。

我在Dash Community中也问了同样的问题,但到目前为止没有得到任何帮助。

感谢您的任何评论!

1 个答案:

答案 0 :(得分:1)

1)要设置开始日期,您可以使用类似的方法调整轴范围

my_figure.layout['xaxis'].update(range=[min, max])

您必须弄清楚如何找到标签的最小和最大。

2)如here所述,实现所需内容的最简单方法是在布局中设置xaxis_tickformat。尝试添加行

my_figure.layout['xaxis_tickformat'] = '%d %B whatever <br>%Y'

恰好在最后一行之前,按照here

中的说明操作并使用格式字符串

3)可能所有这些自定义操作都会使您编写一个简单的函数,该函数返回用作滴答声的字符串列表。如果您想使用datetime对象,可以选中this帖子(没有解决方案)作为搜索的入口点。

良好的编码!