#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"]])