英文:
Add annotation between line gap in plotly
问题
我有这样的图表:
我想知道是否有办法在这些线之间添加这个注释?从一个点到另一个点。如果可能的话,我很抱歉可能会重复。
这是我期望的输出:
这是我的当前注释代码:
有关如何做到这一点的任何建议?
英文:
Instead of the days being on top of the symbol
, I was wondering if there is a way I can add this annotation between the lines? From one dot to another. I apologize if in case, this is a possible duplicate.
This is my current code for the annotation:
fig.add_annotation(
go.layout.Annotation(
x=row["order_date"],
y=row["sales"],
text=f"{row['time_diff']} days",
showarrow=False,
align='center',
yanchor='auto',
yshift=10,
textangle=-0
)
Any suggestions on how can I do this?
答案1
得分: 3
你可以创建一个新的数据框,按照order_date
对原始df
进行排序,然后计算相邻行之间的平均日期和平均销售额,以确定放置注释的位置。要获取文本,可以计算相邻订单之间的时间差。
你的注释数据框将会是这样的:
time_diff sales order_date
0 5 天 5.0 2019-08-27 12:00:00
1 11 天 5.0 2019-09-04 12:00:00
2 0 天 7.5 2019-09-10 00:00:00
3 0 天 15.0 2019-09-10 00:00:00
4 5 天 20.0 2019-09-12 12:00:00
5 0 天 17.5 2019-09-15 00:00:00
6 139 天 15.0 2019-11-23 12:00:00
7 NaT NaN NaT
以下是使用类似你的样本数据创建的图表代码:
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
## 创建类似你的样本数据和图表
df = pd.DataFrame({
'order_date': ['2019-08-25 00:00:00','2019-08-30','2019-09-10','2019-09-10','2019-09-10','2019-09-15','2019-09-15','2020-02-01'],
'sales': [5,5,5,10,20,20,15,15],
})
df['order_date'] = pd.to_datetime(df['order_date'])
fig = px.line(df, x='order_date', y='sales', markers=True, )
fig.update_traces(marker_color='blue', line_color='darkgrey')
## 计算相邻点之间的差异:
## 获取时间差异和平均销售额
df_diff = pd.DataFrame({
'time_diff': df['order_date'].diff(),
'sales': (df['sales'] + df['sales'].shift(-1)) / 2,
})
df_diff['order_date'] = df['order_date'] + (df_diff['time_diff'] / 2).shift(-1)
df_diff['time_diff'] = df_diff['time_diff'].shift(-1)
y_axis_range = 1.25*(df.sales.max() - df.sales.min())
fig.add_trace(
go.Scatter(
x=df_diff["order_date"],
y=df_diff["sales"] + 0.01*y_axis_range,
text=df_diff["time_diff"].astype(str),
mode='text',
showlegend=False,
)
)
fig.show()
英文:
What you can do is create a new dataframe for your annotations by ordering your original df
by the order_date
, then take the average datetime and average sales between consecutive rows to determine where to place the annotations. To obtain the text, you can take the difference in time between consecutive orders.
Your dataframe for annotations would look something like this:
time_diff sales order_date
0 5 days 5.0 2019-08-27 12:00:00
1 11 days 5.0 2019-09-04 12:00:00
2 0 days 7.5 2019-09-10 00:00:00
3 0 days 15.0 2019-09-10 00:00:00
4 5 days 20.0 2019-09-12 12:00:00
5 0 days 17.5 2019-09-15 00:00:00
6 139 days 15.0 2019-11-23 12:00:00
7 NaT NaN NaT
And here is a figure I made using some sample data similar to yours:
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
## create sample data and figure similar to yours
df = pd.DataFrame({
'order_date': ['2019-08-25 00:00:00','2019-08-30','2019-09-10','2019-09-10','2019-09-10','2019-09-15','2019-09-15','2020-02-01'],
'sales': [5,5,5,10,20,20,15,15],
})
df['order_date'] = pd.to_datetime(df['order_date'])
fig = px.line(df, x='order_date', y='sales', markers=True, )
fig.update_traces(marker_color='blue', line_color='darkgrey')
## between consecutive points:
## get the difference in time, and the average sales
df_diff = pd.DataFrame({
'time_diff': df['order_date'].diff(),
'sales': (df['sales'] + df['sales'].shift(-1)) / 2,
})
df_diff['order_date'] = df['order_date'] + (df_diff['time_diff'] / 2).shift(-1)
df_diff['time_diff'] = df_diff['time_diff'].shift(-1)
y_axis_range = 1.25*(df.sales.max() - df.sales.min())
fig.add_trace(
go.Scatter(
x=df_diff["order_date"],
y=df_diff["sales"] + 0.01*y_axis_range,
text=df_diff["time_diff"].astype(str),
mode='text',
showlegend=False,
)
)
fig.show()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论