首页 > 解决方案 > 如何在 Plotly (Python) 中自定义日期时间刻度

问题描述

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

这是我的图表:

在此处输入图像描述

不错,但对于 x 轴刻度。我想定制它们以满足我的需求:

  1. 我希望他们从周一(1 月 4 日)开始,而不是周日(1 月 10 日),并像他们已经做的那样每周继续

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

  3. 我不想显示每个刻度标签。如果图表只显示一年的第一个 KW 和每五分之一,那就太好了

所以,我一直在寻找一种方法来做到这一点,并在Plotly Layout References (xaxis-tickvals)中发现应该有一种平滑的方法来做到这一点。我只需要图表中位置的刻度值列表和标签的刻度文本列表,并且需要将刻度模式设置为“数组”。

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

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()

然后,此代码将生成以下图表:

在此处输入图像描述

现在,我不明白为什么 x 轴没有启动,也没有按照我想要的方式显示。

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

我很感谢任何评论!

标签: pythonplotly-dashgantt-chartxticks

解决方案


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

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

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

2)如记录here,实现您正在寻找的最简单的方法是在布局中设置xaxis_tickformat。尝试添加行

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

就在最后一行之前并使用此处解释和记录的格式字符串

3) 可能所有这些自定义都会导致您编写一个简单的函数,该函数返回用作刻度的字符串列表。如果您想坚持使用 datetime 对象,您可以查看这篇文章(没有解决方案)作为搜索的入口点。

好编码!


推荐阅读