我试图使用plotly.express
制作一个plotly
{a1}图,如示例中所示,但是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:00.000,1970-01-01 01:00:01.300,2,ABS
3,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,3,ABU
4,1970-01-01 01:00:00.000,1970-01-01 01:00:02.000,4,ACC
5,1970-01-01 01:00:02.000,1970-01-01 01:00:03.300,4,ACC
6,1970-01-01 01:00:03.300,1970-01-01 01:00:05.300,4,ACC
7,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,5,ABS
8,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,6,ACT
9,1970-01-01 01:00:00.000,1970-01-01 01:00:02.000,7,ACC
10,1970-01-01 01:00:02.000,1970-01-01 01:00:03.300,7,ACC
11,1970-01-01 01:00:03.300,1970-01-01 01:00:05.300,7,ACC
12,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,8,ABS
13,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,9,ABU
14,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,10,ACC
15,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,11,ABS
16,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,12,ABU
17,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,13,ACC
18,1970-01-01 01:00:01.300,1970-01-01 01:00:03.300,13,ACC
19,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,14,ABS
20,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,15,ABP
21,1970-01-01 01:00:00.000,1970-01-01 01:00:01.500,16,ABZ
22,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,17,ACC
23,1970-01-01 01:00:01.300,1970-01-01 01:00:03.300,17,ACC
24,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,18,ABS
25,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,19,AAW
26,1970-01-01 01:00:00.000,1970-01-01 01:00:02.000,20,ACC
27,1970-01-01 01:00:02.000,1970-01-01 01:00:03.300,20,ACC
28,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,21,ABS
29,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,22,ABU
30,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,23,ACC
我希望所有的条都具有相同的厚度,令人惊讶的是,当我将Resource
的名称更改为某个随机的3字符值时,这会起作用:
我认为这与以AB*
或AC*
开头的资源有关。不幸的是,资源的名称依赖于真实世界的名称,因此我不能随意更改它们。当资源的名称类似于FooBar-Axx-FOO
和xx = [CC, BS, CT...]
时,条的厚度也会发生变化。有人知道为什么会发生这种情况或如何预防吗
附言:是的
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,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:00.000,1970-01-01 01:00:01.300,2,ABS
3,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,3,ABU
4,1970-01-01 01:00:00.000,1970-01-01 01:00:02.000,4,ACC
5,1970-01-01 01:00:02.000,1970-01-01 01:00:03.300,4,ACC
6,1970-01-01 01:00:03.300,1970-01-01 01:00:05.300,4,ACC
7,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,5,ABS
8,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,6,ACT
9,1970-01-01 01:00:00.000,1970-01-01 01:00:02.000,7,ACC
10,1970-01-01 01:00:02.000,1970-01-01 01:00:03.300,7,ACC
11,1970-01-01 01:00:03.300,1970-01-01 01:00:05.300,7,ACC
12,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,8,ABS
13,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,9,ABU
14,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,10,ACC
15,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,11,ABS
16,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,12,ABU
17,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,13,ACC
18,1970-01-01 01:00:01.300,1970-01-01 01:00:03.300,13,ACC
19,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,14,ABS
20,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,15,ABP
21,1970-01-01 01:00:00.000,1970-01-01 01:00:01.500,16,ABZ
22,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,17,ACC
23,1970-01-01 01:00:01.300,1970-01-01 01:00:03.300,17,ACC
24,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,18,ABS
25,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,19,AAW
26,1970-01-01 01:00:00.000,1970-01-01 01:00:02.000,20,ACC
27,1970-01-01 01:00:02.000,1970-01-01 01:00:03.300,20,ACC
28,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,21,ABS
29,1970-01-01 01:00:00.000,1970-01-01 01:00:01.000,22,ABU
30,1970-01-01 01:00:00.000,1970-01-01 01:00:01.300,23,ACC"""
df = pd.read_csv(StringIO(csv))
# 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()
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。但这些都是非常直接的安装,对于plotly来说是一个巨大的进步。至少在我看来
代码0:
绘图0:
详细信息:
我们必须一步一步地做。首先,当我运行您提供的代码时,我得到:
图1:
代码1:
为了接近您提供的屏幕截图,我必须注释掉以下几行内容。但还是和你的数字不一样
图2:
代码2(相同的数据集):
我觉得有点奇怪。而可能的解决方案则更为奇怪。如果您查看postPlotly: How to inspect and make changes to a plotly figure?,您将看到如何使用
f2 = fig.full_figure_for_development
显示大多数地物属性。您对f2
所做的任何更改也应该可以对fig
所做的任何更改。但在这种情况下不是这样。为了得到与您期望的输出类似的结果,我必须执行以下操作:代码3:
图3:
也许我们会有进展?但是现在你可能会想,“为什么不呢?”。好吧,结果如下:
图4:
代码4:
我觉得这整件事有点奇怪。但是,请尝试一下,让我知道这一切是如何为你工作的
相关问题 更多 >
编程相关推荐