如何将数据点添加到时间序列线图中以突出显示事件?
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.Scatter
的hovertemplate
和text
属性来实现
情节 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 问题?我在编辑历史中看不到...以上是关于如何将数据点添加到时间序列线图中以突出显示事件?的主要内容,如果未能解决你的问题,请参考以下文章