gpt4 book ai didi

python - Plotly:如何使用日期时间索引在中心绘制一条线的范围?

转载 作者:行者123 更新时间:2023-12-05 06:10:43 26 4
gpt4 key购买 nike

我想绘制一条围绕它的范围的线,就像在这张照片上一样:

enter image description here

我发布了一个原始问题,但没有指定索引是日期时间索引。我以为这不重要,但我错了。

有一个用数字索引覆盖它的答案:

Plotly: How to make a figure with multiple lines and shaded area for standard deviations?

和这里的文档:

https://plotly.com/python/continuous-error-bars/

但是没有涉及日期时间索引的问题。

这里是一些测试数据:

timestamp      price   min  mean   max  
1596267946298 100.0 100 100.5 101
1596267946299 101.0 100 100.5 101
1596267946300 102.0 98 99.5 102
1596267948301 99.0 98 99.5 102
1596267948302 98.0 98 99.5 102
1596267949303 99.0 98 995. 102

我希望波段覆盖从最小值到最大值的位置,并在中心绘制平均值。

另一种选择是从上面发布的问题的第一个答案 (Plotly: How to make a figure with multiple lines and shaded area for standard deviations?) 中获取代码并将数据生成更改为:

index = pd.date_range('1/1/2000', periods=25, freq='T')
df = pd.DataFrame(dict(A=np.random.uniform(low=-1, high=2, size=25).tolist(),
B=np.random.uniform(low=-4, high=3, size=25).tolist(),
C=np.random.uniform(low=-1, high=3, size=25).tolist()),
index=index)

这将以相同的方式工作,但会创建一个日期时间索引。

最佳答案

linked question 中的设置相比,导致麻烦的是 x+x[::-1] 不能很好地处理日期时间索引。但是如果你设置 x=df.index 在:

# add line and shaded area for each series and standards deviation
for i, col in enumerate(df):
new_col = next(line_color)
# x = list(df.index.values+1)
x = df.index

然后将x+x[::-1]替换为x=x.append(x[::-1]):

# standard deviation area
fig.add_traces(go.Scatter(
#x+x[::-1],
x=x.append(x[::-1]),

那么事情应该会很顺利。

plotly :

enter image description here

完整代码:

# imports
import plotly.graph_objs as go
import plotly.express as px
import pandas as pd
import numpy as np

# sample data in a pandas dataframe
np.random.seed(1)
df=pd.DataFrame(dict(A=np.random.uniform(low=-1, high=2, size=25).tolist(),
B=np.random.uniform(low=-4, high=3, size=25).tolist(),
C=np.random.uniform(low=-1, high=3, size=25).tolist(),
))
df = df.cumsum()

# set daterange as index
df['dates'] = pd.date_range('2020', freq='D', periods=len(df))
df.set_index('dates', inplace=True)

# ---

# define colors as a list
colors = px.colors.qualitative.Plotly

# convert plotly hex colors to rgba to enable transparency adjustments
def hex_rgba(hex, transparency):
col_hex = hex.lstrip('#')
col_rgb = list(int(col_hex[i:i+2], 16) for i in (0, 2, 4))
col_rgb.extend([transparency])
areacol = tuple(col_rgb)
return areacol

rgba = [hex_rgba(c, transparency=0.2) for c in colors]
colCycle = ['rgba'+str(elem) for elem in rgba]

# Make sure the colors run in cycles if there are more lines than colors
def next_col(cols):
while True:
for col in cols:
yield col
line_color=next_col(cols=colCycle)

# plotly figure
fig = go.Figure()

# add line and shaded area for each series and standards deviation
for i, col in enumerate(df):
new_col = next(line_color)
x = df.index
y1 = df[col]
y1_upper = [(y + np.std(df[col])) for y in df[col]]
y1_lower = [(y - np.std(df[col])) for y in df[col]]
y1_lower = y1_lower[::-1]

# standard deviation area
fig.add_traces(go.Scatter(
#x+x[::-1],
x=x.append(x[::-1]),
y=y1_upper+y1_lower,
fill='tozerox',
fillcolor=new_col,
line=dict(color='rgba(255,255,255,0)'),
showlegend=False,
name=col))

# line trace
fig.add_traces(go.Scatter(x=df.index,
y=y1,
line=dict(color=new_col, width=2.5),
mode='lines',
name=col)
)
fig.update_layout(xaxis=dict(range=[df.index[1],df.index[-1]]))
fig.show()

关于python - Plotly:如何使用日期时间索引在中心绘制一条线的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64307402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com