如何绘制从某个非零值开始的 x 轴值的线图

问题描述 投票:0回答:1

我正在尝试生成一个季节性图,其中每条线对应于一年(即 2018 年、2019 年的线,...) x 轴值是一年中的周数(范围从 1 - 52)。 但是,我想以某个偏移量开始绘图,例如x 轴值 = 30, 31, ... 52, 1, 2, ..., 29

我尝试将 x 轴转换为分类轴,但第 52 周到第 1 周之间的线图始终存在间隙。

import pandas as pd
import numpy as np
def generate_sample_values(param1, param2, startendpoint):
    if startendpoint < 1 or startendpoint > 53:
        raise ValueError
    lst = [(x/param1)+np.random.randint(param2) for x in range(1,startendpoint)]
    lst2 = lst[:53-startendpoint][::-1]
    return lst + lst2

ls = generate_sample_values(1, 10, 30)

df = pd.DataFrame({"week":[x for x in range(1,53)], 
              "2019":generate_sample_values(1,10,30),
              "2020":generate_sample_values(0.5,10,30), 
              "2021":generate_sample_values(2,15,30),
              "2022":generate_sample_values(3,17,30)
             }).set_index("week")
px.line(df, x =df.index, y= df.columns)

在上面,我希望 x 轴从 30, 31, ... 52, 1, 2, ..., 29 开始

python-3.x time-series plotly visualization plotly-python
1个回答
0
投票

为此,首先根据您的需要重新排列数据...从索引 30 开始直到结束,然后在数据帧的末尾连接前 29 个。然后,您需要将索引(周数)转换为字符串并绘制它。更新后的代码如下所示...

def generate_sample_values(param1, param2, startendpoint):
    if startendpoint < 1 or startendpoint > 53:
        raise ValueError
    lst = [(x/param1)+np.random.randint(param2) for x in range(1,startendpoint)]
    lst2 = lst[:53-startendpoint][::-1]
    return lst + lst2

ls = generate_sample_values(1, 10, 30)

df = pd.DataFrame({"week":[x for x in range(1,53)], 
              "2019":generate_sample_values(1,10,30),
              "2020":generate_sample_values(0.5,10,30), 
              "2021":generate_sample_values(2,15,30),
              "2022":generate_sample_values(3,17,30)
             }).set_index("week")

df=pd.concat([df.iloc[29:], df.iloc[:29]])
df.index = df.index.map(str)

fig=px.line(df, x =df.index, y= df.columns)
fig.update_xaxes(tickangle=0)

这将为您提供以下情节...

现在,如果您不喜欢这些标签并发现它们太多,您可以通过在底部添加代码来调整您想要的标签...

fig.update_layout(
    xaxis = dict(tickmode = 'linear', tick0 = 30, dtick = 5)
)

...这将为您提供下面的图 - 从 30 开始并显示每 5 个刻度标签。

© www.soinside.com 2019 - 2024. All rights reserved.