如何将数据点添加到时间序列线图中以突出显示事件?

How to add datapoints to a time series line plot to highlight events?

我正在尝试通过 plotly 将 dot/scatter 图添加到现有图上。

目前我的代码如下:

fig = px.line(total_data, 
              x = 'date', y = ['doge_close','btc_close','eth_close','shib_close'], 
              color = 'has_tweet', hover_data = ['content', 'of_interest']
              )
fig.show()

在此处生成附件图像:

我要做的是在折线图上绘制推文,但作为散点图而不是 has_tweet = 1 线。 (通过 photoshop 添加的点)

我在 plotly python 文档中找不到任何内容,但不幸的是发现了一些与 R 相关的内容,并且 fig.add_trace 在输入中可以处理的内容相当有限,因此添加多个轴无济于事。

感谢您的帮助!

编辑:

感谢一位非常友善的评论者,我快到了。

我已经更新了代码:

fig = px.line(total_data, x = total_data.date,
              y = total_data.doge_close)
fig.add_trace(
             go.Scatter(
                        x=total_data[total_data.has_tweet==1].date,
                        y=total_data[total_data.has_tweet == 1['doge_close'],
                         mode = 'markers',
                         name = 'Tweet',
                         hovertext = ['content', 'of_interest']))
fig.show()

但是,当我试图让它显示推文内容时,除了 doge_price 和日期之外,hovertext 没有显示任何内容。提供悬停图像。

编辑 #2

fig = px.line(total_data, x = total_data.date,
                          y = total_data.doge_close)
fig.add_trace(
              go.Scatter(
                         x=total_data[total_data.has_tweet==1].date,
                         y=total_data[total_data.has_tweet == 1['doge_close'],
                         mode = 'markers',
                         hovertemplate = 
                                    '<i>tweet:</i>'+ '<br>' +
                                    
                                    '<i>%{text}</i>',
                                    
                                    text = [t for t in total_data['content'] != 'NaN'],
                                    name = 'has_tweets'))
fig.show()

麻烦的地方在这里:text = [t for t in total_data['content'] != 'NaN'] content 列有 7113 行长,但只有 139 行包含任何内容(推文)。我尝试确定它 != 'NaN' 的位置,它似乎有效,除了逻辑上,它将所有内容都设置为 true(事后看来这很有意义),我不知道如何绕过它。

见下文:

我可能在这里遗漏了一些东西,但这应该就像添加带有 fig.add_trace(go.Scatter()) 的跟踪一样简单,其值对应于满足某些条件的原始值,如下所示:

fig.add_trace(go.Scatter(x=df[df.has_tweet==1].index,
                         y = df[df.has_tweet==1]['values'],
                         mode = 'markers',
                        name = 'has_tweets'))

情节 1 - 突出显示的事件

如果您想向突出显示的事件添加更多信息,可以通过 go.Scatter

hovertemplatetext 属性来实现

情节 2 - 在 hovertemplate 中突出显示带有额外信息的事件

情节 1 的完整代码:

import plotly.express as px
import plotly.graph_objects as go
import random

df = px.data.stocks().set_index('date')[['GOOG']].rename(columns={'GOOG':'values'})
df['has_tweet'] = random.choices([0,1], weights=(90,10), k=len(df))

fig = px.line(df, x=df.index, y = 'values')
fig.add_trace(go.Scatter(x=df[df.has_tweet==1].index,
                         y = df[df.has_tweet==1]['values'],
                         mode = 'markers',
                        name = 'has_tweets'))
fig.show()

情节 2 的完整代码:

import plotly.express as px
import plotly.graph_objects as go
import random

df = px.data.stocks().set_index('date')[['GOOG']].rename(columns={'GOOG':'values'})
df['has_tweet'] = random.choices([0,1], weights=(90,10), k=len(df))
df['tweet'] = random.choices(['A','B', 'C'], weights=(50,25,25), k=len(df))
df['tweet'].iloc[4] = "All the other tweets are short, <br> but this one is long"

fig = px.line(df, x=df.index, y = 'values')
fig.add_trace(go.Scatter(x=df[df.has_tweet==1].index,
                         y = df[df.has_tweet==1]['values'],
                         mode = 'markers',
                         hovertemplate =
                                        '<i>tweet:</i>'+ '<br>' +
                                        
                                        '<i>%{text}</i>',
                         text = [t for t in df['tweet']],
                         name = 'has_tweets'))
fig.show()