Расположите текст аннотации «add_vline» вертикально и отцентрируйте среднюю точку на вертикальной линии

#python #text #plotly #position #legend

Вопрос:

 import plotly as plotly from plotly.offline import plot import plotly.express as px  import pandas as pd import numpy as np  df = pd.DataFrame({'height': [712, 712, 716, 716, 718, np.nan, np.nan, np.nan, np.nan, np.nan],  'moisture ': [0.06, 0.19, 0.18, 0.17, 0.18, np.nan, np.nan, np.nan, np.nan, np.nan],  'tasks': ['water', None, None, 'prune', None, None, 'position', None, 'prune', None],  'weather': [None, 'humid', None, None, 'wet', None, None, None, None, 'hot']},   index=['2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08', '2020-01-09',  '2020-01-10', '2020-01-11', '2020-01-12', '2020-01-13'])  df.index.name = 'date' fig = px.line(df, y="height")  for x in df.loc[~df["tasks"].isna()].index:  fig.add_vline(x=pd.to_datetime(x).timestamp() * 1000, line_width=1, line_dash="dash", line_color="red", annotation_text=df.loc[x, 'tasks'])  for x in df.loc[~df["weather"].isna()].index:  fig.add_vline(x=pd.to_datetime(x).timestamp() * 1000, line_width=1, line_dash="dash", line_color="blue", annotation_text=df.loc[x, 'weather'])   fig.show()  

Это приводит к следующему результату:

введите описание изображения здесь

Я хочу расположить текст аннотации вертикально для каждой строки с фиксированным центром в средней точке (на полпути вверх).

В документации я вижу только возможность разместить аннотацию вверху или внизу, используя annotation_position

Кроме того, поскольку строки взяты из разных столбцов, я хотел бы добавить легенду и возможность щелкнуть, чтобы скрыть/отобразить данные столбца (представленные «красными» и «синими» линиями).

Заранее большое спасибо.

Ответ №1:

Вы можете изменить аннотации, созданные add_vline()

 import plotly as plotly from plotly.offline import plot import plotly.express as px  import pandas as pd import numpy as np  df = pd.DataFrame({'height': [712, 712, 716, 716, 718, np.nan, np.nan, np.nan, np.nan, np.nan],  'moisture ': [0.06, 0.19, 0.18, 0.17, 0.18, np.nan, np.nan, np.nan, np.nan, np.nan],  'tasks': ['water', None, None, 'prune', None, None, 'position', None, 'prune', None],  'weather': [None, 'humid', None, None, 'wet', None, None, None, None, 'hot']},   index=['2020-01-04', '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08', '2020-01-09',  '2020-01-10', '2020-01-11', '2020-01-12', '2020-01-13'])  df.index.name = 'date' fig = px.line(df, y="height")  for x in df.loc[~df["tasks"].isna()].index:  fig.add_vline(x=pd.to_datetime(x).timestamp() * 1000, line_width=1, line_dash="dash", line_color="red", annotation_text=df.loc[x, 'tasks'])  for x in df.loc[~df["weather"].isna()].index:  fig.add_vline(x=pd.to_datetime(x).timestamp() * 1000, line_width=1, line_dash="dash", line_color="blue", annotation_text=df.loc[x, 'weather'])   fig.update_layout(annotations=[{**a, **{"y":.5}} for a in fig.to_dict()["layout"]["annotations"]])  

введите описание изображения здесь