问题描述
我正在尝试使用plotly
来制作plotly.express
Gantt图,如示例所示,但是plotly
会根据给定的名称以某种方式改变钢筋的厚度(看到图片,红色>绿色>蓝色):
代码如下:
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个字符的值时,这种方法有效:
我认为这与以AB*
或AC*
开头的资源有关。不幸的是,资源的名称取决于实际的名称,因此我不能随意更改它们。当资源名称类似于FooBar-Axx-FOO
和xx = [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:
详细信息:
我们将必须逐步进行此操作。首先,当我运行您提供的代码时,我得到了:
情节1:
代码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:
代码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:
也许我们到了这里?但是现在您可能会想“为什么不fig.layout.barmode = 'group'
?”。好吧,这是结果:
图4:
代码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()
我觉得整个事情有点奇怪。但是请尝试一下,让我知道一切对您有帮助!