我有一个时间序列的数据框图,以及一个我想在其中绘制垂直线的数值列表。该图是使用cufflinks包创建的交互式图。这是一个以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'对象没有属性'axvline'。
我不确定此消息是由于我对基本情节缺乏了解还是由于使用igraph的局限性。
不确定是否是您想要的,添加两个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()
输出:
要在现有的绘图中添加一条线,只需使用:
fig.add_shape(type='line',...)
我收集this是您在matplotlib中混合后看到的帖子。正如评论中所指出的,axvline
与密谋无关。那仅是作为示例说明如何使用matplotlib完成它。使用plotly,我要么选择fig.add_shape(go.layout.Shape(type="line")
。但是在您亲自尝试之前,请注意cufflinks
已被弃用。我真的很喜欢袖扣,但是现在有了用于构建快速和详细图表的更好的选择。如果您想像iplot
一样坚持一线,我建议您使用plotly.express
。在这种情况下,唯一的障碍是将数据集从plotly.express
首选的宽格式更改为长格式。下面的代码片段仅用于生成以下图:
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()