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

Posted

技术标签:

【中文标题】如何将数据点添加到时间序列线图中以突出显示事件?【英文标题】:How to add datapoints to a time series line plot to highlight events? 【发布时间】:2021-12-22 09:09:04 【问题描述】:

我正在尝试通过 plotly 将推文作为点/散点图添加到现有图上。

目前,我的代码如下:

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()

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

编辑#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(事后看来这是完全合理的),我不知道如何绕过它。

见下文:

【问题讨论】:

如果没有您的数据样本,最后一部分有点难以回答。如果到目前为止我的建议对您有所帮助,您会考虑将最后一部分作为一个新问题提出吗? @vestland ***.com/questions/69920851/… 我又提出了一个新问题。 【参考方案1】:

我可能在这里遗漏了一些东西,但这应该就像添加带有 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.Scatterhovertemplatetext 属性来实现

情节 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()

【讨论】:

非常感谢!我还在学习情节,所以这是一个巨大的帮助! 我可能应该澄清一下,我想从点本身获取悬停数据,这是我认为我主要在努力解决的问题,但这让我走上了一个很好的轨道。 @Falcon 线轨迹和标记轨迹都具有此设置的悬停数据。或者您是否希望所有红色标记都显示信息而不考虑悬停? 我已经更新了 OP,对我正在尝试做的事情提供了一个半解决方案,以及我迷路的屏幕截图。 @Falcon 我很困惑 =) 您是否在发布后编辑了 this 问题?我在编辑历史中看不到...

以上是关于如何将数据点添加到时间序列线图中以突出显示事件?的主要内容,如果未能解决你的问题,请参考以下文章

将具有不同索引的数据框添加到时间序列

将缺失的日期添加到时间序列数据框

将特征添加到时间序列预测模型输入的适当方法

熊猫将时间间隔重叠到时间序列

Python将前导零添加到时间字段[重复]

如何在swift中突出显示文本时触发事件