Сюжет: как добавить вертикальные линии в указанные точки? - PullRequest
1 голос
/ 25 мая 2020

У меня есть график кадра данных временного ряда вместе со списком числовых c значений, на которых я хотел бы нарисовать вертикальные линии. Сюжет интерактивный, создан с помощью пакета запонок. Вот пример трех временных рядов для 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'.

Я не уверен, связано ли это сообщение с моим непониманием базовых c графиков или связано с ограничением использования igraph.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Ответ:

Чтобы добавить линию к существующей графической фигуре, просто используйте:

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

Детали:

Я понял this - это сообщение, которое вы видели с тех пор, как микшируете в matplotlib. И как уже было сказано в комментариях, axvline не имеет ничего общего с сюжетом. Это использовалось только в качестве примера того, как вы могли бы сделать это с помощью matplotlib. Используя plotly, я бы либо go, либо fig.add_shape(go.layout.Shape(type="line"). Но прежде чем вы попробуете это сами, имейте в виду, что cufflinks устарел. Запонки мне очень понравились, но теперь есть более удобные варианты построения как быстрых, так и подробных графиков. Если вы хотите использовать однострочники, аналогичные iplot, я бы предложил использовать plotly.express. Единственное препятствие в вашем случае - это изменение вашего набора данных с широкого на длинный формат, который предпочитает plotly.express. Приведенный ниже фрагмент делает именно это, чтобы создать следующий график:

enter image description here

Код:

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()
1 голос
/ 26 мая 2020

Не уверен, что это то, что вы хотите, добавление двух 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()

Вывод:

enter image description here

...