首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用整数X轴绘制甘特图的Plotly Express时间线?

使用整数X轴绘制甘特图的Plotly Express时间线?
EN

Stack Overflow用户
提问于 2021-02-07 00:03:29
回答 4查看 3K关注 0票数 3

我正在使用plotly express timeline生成一个甘特图,如下所示:https://medium.com/dev-genius/gantt-charts-in-python-with-plotly-e7213f932f1e

它会自动将x轴设置为使用日期,但我实际上只想使用整数(即Project Kick-Off +1,Project Kick-Off +6等)。

有没有一种方法可以使时间线图不使用X轴的日期?

如果我尝试使用整数,它会将它们视为毫秒。

EN

回答 4

Stack Overflow用户

发布于 2021-02-07 01:20:07

答案是:

是的,这是可能的!只需提供整数作为开始和结束“日期”,计算它们之间的差异(delta),然后对fig进行这些更改

代码语言:javascript
运行
复制
fig.layout.xaxis.type = 'linear'
fig.data[0].x = df.delta.tolist()

绘图

详细信息:

实际上有一种方法可以实现这一点,尽管docs声明:

默认情况下,px.timeline函数将X轴设置为type=date,因此可以像任何时间序列图一样对其进行配置。

因此,px.timeline()中的所有其他功能似乎都围绕着这一事实。但是如果忽略这一点,并使用整数作为StartFinish的值,那么您可以调整一些属性来获得您想要的结果。您只需要计算每个StartStop之间的差异。例如:

代码语言:javascript
运行
复制
df = pd.DataFrame([
    dict(Task="Job A", Start=1, Finish=4),
    dict(Task="Job B", Start=2, Finish=6),
    dict(Task="Job C", Start=3, Finish=10)
])
df['delta'] = df['Finish'] - df['Start']

然后再进一步调整:

代码语言:javascript
运行
复制
fig.layout.xaxis.type = 'linear'
fig.data[0].x = df.delta.tolist()

完整代码:

代码语言:javascript
运行
复制
import plotly.express as px
import pandas as pd

df = pd.DataFrame([
    dict(Task="Job A", Start=1, Finish=4),
    dict(Task="Job B", Start=2, Finish=6),
    dict(Task="Job C", Start=3, Finish=10)
])
df['delta'] = df['Finish'] - df['Start']

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task")
fig.update_yaxes(autorange="reversed") 

fig.layout.xaxis.type = 'linear'
fig.data[0].x = df.delta.tolist()
f = fig.full_figure_for_development(warn=False)
fig.show()
票数 7
EN

Stack Overflow用户

发布于 2021-08-19 05:10:36

我认为当我们必须指定color时,这比上面的解决方案简单得多

代码语言:javascript
运行
复制
for d in fig.data:
  filt = df['color'] == d.name
  d.x = df[filt]['Delta'].tolist()
票数 4
EN

Stack Overflow用户

发布于 2021-04-10 04:27:09

我尝试了这里列出的另一个答案,但如果我指定了一个color,它就不起作用了。如果我尝试一下,我会发现data fig.data有多个Bar对象,我认为它不包含分配所有增量所需的数据。然而,我确实发现我可以修改plotly code而不将其转换为time对象,并且我得到了正确的结果:

代码语言:javascript
运行
复制
import plotly.express as px
import pandas as pd

def my_process_dataframe_timeline(args):
    """
    Massage input for bar traces for px.timeline()
    """
    print("my method")
    args["is_timeline"] = True
    if args["x_start"] is None or args["x_end"] is None:
        raise ValueError("Both x_start and x_end are required")

    x_start = args["data_frame"][args["x_start"]]
    x_end = args["data_frame"][args["x_end"]]

    # note that we are not adding any columns to the data frame here, so no risk of overwrite
    args["data_frame"][args["x_end"]] = (x_end - x_start)
    args["x"] = args["x_end"]
    del args["x_end"]
    args["base"] = args["x_start"]
    del args["x_start"]
    return args
px._core.process_dataframe_timeline = my_process_dataframe_timeline

df = pd.DataFrame([
    dict(Task="Job A", Start=1, Finish=4, color="1"),
    dict(Task="Job B", Start=2, Finish=6, color="2"),
    dict(Task="Job C", Start=3, Finish=10, color="1")
])
df['delta'] = df['Finish'] - df['Start']

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color="color")
fig.update_yaxes(autorange="reversed") 

fig.layout.xaxis.type = 'linear'
fig.show()

显然这样做是不可取的。如果能得到正式的支持就太好了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66078893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档