我正在尝试生成一个季节性图,其中每条线对应于一年(即 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 开始
为此,首先根据您的需要重新排列数据...从索引 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 个刻度标签。