簡體   English   中英

Plotly:如何在指定點添加垂直線?

[英]Plotly: How to add vertical lines at specified points?

我有一個時間序列的數據框 plot 以及我想繪制垂直線的數值列表。 plot 是一款使用袖扣 package 創建的交互式產品。 這是 1000 個時間值的三個時間序列的示例,我想在 500 和 800 處繪制垂直線。我使用“axvlinee”的嘗試是基於我在類似帖子中看到的建議:

import numpy as np
import pandas as pd
import cufflinks

np.random.seed(123)
X = np.random.randn(1000,3)  
df=pd.DataFrame(X, columns=['a','b','c'])
fig=df.iplot(asFigure=True,xTitle='time',yTitle='values',title='Time Series Plot')
fig.axvline([500,800], linewidth=5,color="black", linestyle="--")
fig.show()

錯誤消息指出“Figure”object 沒有屬性“axvline”。

我不確定這條消息是由於我對基本情節缺乏了解還是源於使用 igraph 的限制。

答案:

要向現有 plotly 圖添加一行,只需使用:

fig.add_shape(type='line',...)

細節:

我認為是您在 matplotlib 中混音后看到的帖子。 正如評論中所述, axvline與 plotly 無關。 這僅用作您如何使用 matplotlib 完成此操作的示例。 使用 plotly,我會選擇 go 用於fig.add_shape(go.layout.Shape(type="line") 。但在您自己嘗試之前,請注意cufflinks已被棄用。我真的很喜歡袖扣,但是現在有更好的選擇來構建快速和詳細的圖表。如果你想堅持類似於iplot的單行,我建議使用plotly.express 。在你的情況下,唯一的障礙是改變你的數據集到plotly.express首選的長格式。下面的代碼片段正是為了生成以下 plot:

在此處輸入圖像描述

代碼:

import numpy as np
import pandas as pd
import plotly.express as px
from plotly.offline import iplot
#
np.random.seed(123)
X = np.random.randn(1000,3)  
df=pd.DataFrame(X, columns=['a','b','c'])
df['id'] = df.index
df = pd.melt(df, id_vars='id', value_vars=df.columns[:-1])

# plotly line figure
fig = px.line(df, x='id', y='value', color='variable')

# lines to add, specified by x-position
lines = {'a':500,'c':700,'a':900,'b':950}

# add lines using absolute references
for k in lines.keys():
    #print(k)
    fig.add_shape(type='line',
                yref="y",
                xref="x",
                x0=lines[k],
                y0=df['value'].min()*1.2,
                x1=lines[k],
                y1=df['value'].max()*1.2,
                line=dict(color='black', width=3))
    fig.add_annotation(
                x=lines[k],
                y=1.06,
                yref='paper',
                showarrow=False,
                text=k)
fig.show()

不確定這是否是您想要的,添加兩個scatter似乎有效:

np.random.seed(123)
X = np.random.randn(1000,3)  
df=pd.DataFrame(X, columns=['a','b','c'])
fig = df.iplot(asFigure=True,xTitle='time',yTitle='values',title='Time Series Plot')

fig.add_scatter(x=[500]*100, y=np.linspace(-4,4,100), name='lower')
fig.add_scatter(x=[800]*100, y=np.linspace(-4,4,100), name='upper')

fig.show()

Output:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM