密谋:如何防止甘特图中的钢筋厚度发生变化? 可能的解决方案:代码0:图0:详细信息:情节1:代码1:图2:代码2相同的数据集:代码3:图3:图4:代码4:

问题描述

我正在尝试使用plotly来制作plotly.express Gantt图,如示例所示,但是plotly会根据给定的名称以某种方式改变钢筋的厚度(看到图片,红色>绿色>蓝色):

enter image description here

代码如下:

import pandas as pd
import plotly.express as px

df = pd.read_csv('stackoverflow.csv')
fig = px.timeline(df,x_start="Start",x_end="Finish",y="Task",color="Resource",text="Task",width=1600,height=800)
fig.update_yaxes(autorange="reversed")
fig.update_xaxes(
    dtick="1000",tickformat="%M:%s",ticklabelmode="instant")
fig.update_layout(xaxis_range=[df.Start.min(),df.Finish.max()])
fig.show()

stackoverflow.csv为:

Task,Start,Finish,Workstation,Resource
1,1970-01-01 01:00:00.000,1970-01-01 01:00:05.400,1,ABL
2,1970-01-01 01:00:01.300,2,ABS
3,1970-01-01 01:00:01.000,3,ABU
4,1970-01-01 01:00:02.000,4,ACC
5,1970-01-01 01:00:03.300,ACC
6,1970-01-01 01:00:05.300,ACC
7,5,ABS
8,6,ACT
9,7,ACC
10,ACC
11,ACC
12,8,ABS
13,9,ABU
14,10,ACC
15,11,ABS
16,12,ABU
17,13,ACC
18,ACC
19,14,ABS
20,15,ABP
21,1970-01-01 01:00:01.500,16,ABZ
22,17,ACC
23,ACC
24,18,ABS
25,19,AAW
26,20,ACC
27,ACC
28,21,ABS
29,22,ABU
30,23,ACC

我希望所有的条都具有相同的厚度,令人惊讶的是,当我将Resource名称更改为某个随机的3个字符的值时,这种方法有效:

enter image description here

我认为这与以AB*AC*开头的资源有关。不幸的是,资源的名称取决于实际的名称,因此我不能随意更改它们。当资源名称类似于FooBar-Axx-FOOxx = [CC,BS,CT...]时,条形粗细也会发生变化。有谁知道这是为什么发生或如何预防?

P.S .: The

fig.update_xaxes(
    dtick="1000",tickformat="%M:%s")

是否有必要在甘特图中显示秒数而不是天数...是否有更好的方法来实现这一点?


更新: 我正在使用的conda环境yaml文件来创建问题:

name: stack
channels:
  - conda-forge
  - pytorch
  - plotly
dependencies:
    - python>=3.5,<3.8
    - pandas
    - pip
    - pip:
      - plotly

稍作修改代码仍然会产生与上述相同的问题:

import pandas as pd
import plotly.express as px
from io import StringIO


csv = """Task,ACC"""

df = pd.read_csv(StringIO(csv))
# df = pd.read_csv("stackoverflow.csv")
fig = px.timeline(df,df.Finish.max()])
fig.show()

conda list输出

pip                       20.2.4                     py_0    conda-forge
plotly                    4.12.0                   pypi_0    pypi
python                    3.7.8           h6f2ec95_1_cpython    conda-forge

解决方法

(这是一个正在进行的答案,容易更改)


可能的解决方案:

但是只有一个可能解决方案,因为我仍然无法复制您的代码段和相应的图100%。但是,我们将在细节中仔细研究一下。而且您将需要最新的Plotly版本以及Kaleido。但是,这些安装非常简单明了,并且在情节上迈出了巨大的一步。至少以我的拙见...

代码0:

df = pd.read_csv(StringIO(csv))
fig = px.timeline(df,x_start="Start",x_end="Finish",y="Task",color="Resource",text="Task",width=1600,height=800)
f2 = fig.full_figure_for_development(warn=False)
f2.layout.barmode = 'group'
f2.show()

图0:

enter image description here


详细信息:


我们将必须逐步进行此操作。首先,当我运行您提供的代码时,我得到了:

情节1:

enter image description here

代码1:

import pandas as pd
import plotly.express as px
from io import StringIO


csv = """Task,Start,Finish,Workstation,Resource
1,1970-01-01 01:00:00.000,1970-01-01 01:00:05.400,1,ABL
2,1970-01-01 01:00:01.300,2,ABS
3,1970-01-01 01:00:01.000,3,ABU
4,1970-01-01 01:00:02.000,4,ACC
5,1970-01-01 01:00:03.300,ACC
6,1970-01-01 01:00:05.300,ACC
7,5,ABS
8,6,ACT
9,7,ACC
10,ACC
11,ACC
12,8,ABS
13,9,ABU
14,10,ACC
15,11,ABS
16,12,ABU
17,13,ACC
18,ACC
19,14,ABS
20,15,ABP
21,1970-01-01 01:00:01.500,16,ABZ
22,17,ACC
23,ACC
24,18,ABS
25,19,AAW
26,20,ACC
27,ACC
28,21,ABS
29,22,ABU
30,23,ACC"""

df = pd.read_csv(StringIO(csv))
# df = pd.read_csv("stackoverflow.csv")
fig = px.timeline(df,height=800)
fig.update_yaxes(autorange="reversed")
fig.update_xaxes(
    dtick="1000",tickformat="%M:%S",ticklabelmode="instant")
fig.update_layout(xaxis_range=[df.Start.min(),df.Finish.max()])
fig.show()

为了接近您提供的屏幕截图,我必须注释掉几行,如下所示。但这仍然不是你的数字。

图2:

enter image description here

代码2(相同的数据集):

df = pd.read_csv(StringIO(csv))
# df = pd.read_csv("stackoverflow.csv")
fig = px.timeline(df,height=800)
# fig.update_yaxes(autorange="reversed")
# fig.update_xaxes(
#     dtick="1000",#     tickformat="%M:%S",#     ticklabelmode="instant")
# fig.update_layout(xaxis_range=[df.Start.min(),df.Finish.max()])
fig.show()

我觉得有点奇怪。可能的解决方案甚至更奇怪。如果您查看帖子Plotly: How to inspect and make changes to a plotly figure?,您将看到如何使用f2 = fig.full_figure_for_development来揭示大多数地物属性。您对f2所做的任何更改也应该可以对fig进行。但在这种情况下不是。为了获得类似于您期望的输出的结果,我必须执行以下操作:

代码3:

df = pd.read_csv(StringIO(csv))
fig = px.timeline(df,height=800)
f2 = fig.full_figure_for_development(warn=False)
f2.layout.barmode = 'group'
f2.show()

图3:

enter image description here

也许我们到了这里?但是现在您可能会想“为什么不fig.layout.barmode = 'group'?”。好吧,这是结果:

图4:

enter image description here

代码4:

df = pd.read_csv(StringIO(csv))
fig = px.timeline(df,height=800)
f2 = fig.full_figure_for_development(warn=False)
# f2.layout.barmode = 'group'
# f2.show()
fig.layout.barmode = 'group'
fig.show()

我觉得整个事情有点奇怪。但是请尝试一下,让我知道一切对您有帮助!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...