首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >固定钢筋宽度/厚度( plotly.express.timeline )

固定钢筋宽度/厚度( plotly.express.timeline )
EN

Stack Overflow用户
提问于 2021-10-01 15:58:06
回答 1查看 591关注 0票数 1

我正在使用Plotly Express绘制甘特图。

我事先不知道水平线的数量(“任务”的数量)。

我希望条子的粗细总是一样的。(我认为属性是width,但因为条形是水平的,所以"width“可能不明确。)

当直接绘制图形时,它占用页面上的整个空间,当调整页面大小时,条形图的大小也会相应地改变。

代码语言:javascript
复制
import datetime as dt
import plotly.express as px


data = [
    {'Task': '1-2', 'Start': '2021-09-26', 'Finish': '2021-09-27', 'Resource': 'R1'},
    {'Task': '2-1', 'Start': '2021-09-23', 'Finish': '2021-09-24', 'Resource': 'R2'},
    {'Task': '2-2', 'Start': '2021-09-26', 'Finish': '2021-09-27', 'Resource': 'R2'},
    {'Task': '3-1', 'Start': '2021-09-30', 'Finish': '2021-10-01', 'Resource': 'R3'},
    {'Task': '3-2', 'Start': '2021-11-26', 'Finish': '2021-11-27', 'Resource': 'R3'},
]

fig = px.timeline(
    data,
    x_start="Start",
    x_end="Finish",
    y="Resource",
)

fig.show()

每个条形图上都有一个width属性,但它控制条形图使用的允许空间的大小,因此它实际上并不固定宽度。

一个简单的技巧是根据线条的数量设置图形高度,但必须考虑到周围环境(图例、标题等)。所以它不是真正的线性。无论如何,这充其量只是一个令人遗憾的变通办法。

当我将图形集成到像这样的页面时

Python代码

代码语言:javascript
复制
return plotly.io.to_json(fig)

HTML页面

代码语言:javascript
复制
<script src="https://cdn.plot.ly/plotly-2.0.0.min.js"></script>
<script type="text/javascript">

let graph = {{ gantt_json|safe }};
Plotly.newPlot('gantt_graph', graph, {});

</script>

该图不会占据整个页面,但当条形图的数量发生变化时,条形图的宽度仍然会发生变化。

因此,我可以控制总的图形大小,以及每个条相对于它允许的空间的宽度,但我似乎找不到一种方法来获得固定的像素宽度。

(我以为this issueclosing PR会帮上忙,但他们没有。)

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-10-03 09:40:06

横向考虑这可以通过控制yaxis

  • have模拟数据的最小值域来实现,这将在多个时间线上生成随机数量的timelines

  • based设置

代码语言:javascript
复制
import pandas as pd
import numpy as np
import plotly.express as px
T = 8
data = pd.DataFrame(
    {
        "Start": pd.date_range("1-jan-2021", freq="2D", periods=T),
        "Finish": pd.date_range("14-jan-2021", freq="2D", periods=T),
        "Resource": np.random.choice(
            [chr(i) for i in range(ord("A"), ord("A") + T)], T
        ),
    }
)
color_map = {chr(ord("A") + i): px.colors.qualitative.Alphabet[i%len(px.colors.qualitative.Alphabet)] for i in range(T)}
fig = px.timeline(
    data,
    x_start="Start",
    x_end="Finish",
    y="Resource",
    color="Resource",
    color_discrete_map=color_map,
    #    height=10 * len(data)  # This sucks
)
fig.update_xaxes(
    side="top",
    dtick="D1",
    tickformat="%e\n%b\n%Y",
    ticklabelmode="period",
    tickangle=0,
    fixedrange=True,
)
fig.update_yaxes(
    title="",
    tickson="boundaries",
    fixedrange=True,
)
BARHEIGHT = .1
fig.update_layout(
    yaxis={"domain": [max(1 - (BARHEIGHT * len(fig.data)), 0), 1]}, margin={"t": 0, "b": 0}
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69408798

复制
相关文章

相似问题

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