Постройте экспресс-линейную диаграмму, отметьте конкретные точки и сохраните данные о наведении

#python #pandas #plotly

Вопрос:

Рассмотрим следующий пример фрейма данных.

 import pandas as pd
import numpy as np


df = pd.DataFrame({
    'id': list(range(1000, 2000)),
    'y1': np.random.randn(1000, ),
    'y2': 1   np.random.randn(1000, )
})
 

Теперь я хочу отсортировать фрейм данных по «y1» в порядке убывания и построить график x против y1. При отображении идентификатора и y2 в качестве данных наведения.

 from plotly import express as px

df = df.sort_values('y1', ascending=False, ignore_index=True)
df['x'] = df.index
fig = px.line(df, x='x', y='y1', hover_data=['id', 'y2'])
 

Теперь я хочу отметить 3 точки на оси x (скажем, 100, 200, 300) как особые и добавить маркеры только к этим точкам

Это то, что я пытался:

 from plotly import graph_objects as go

fig.add_trace(
    go.Scatter(
        x=[100, 200, 300],
        y=[df.at[100, 'y1'], df.at[200, 'y1'], df.at[300, 'y1']],
        mode='markers',
        name='Ground Truth'
    )
)
 

Но это приводит к тому, что при наведении указателя мыши на отмеченные точки формы (x_special, y1(x_special)) данные hover_data из фрейма данных теряются, я больше не могу видеть id, y2 информацию для этих точек.

Как я могу отметить только эти специальные точки маркерами и при этом сохранить информацию о данных при наведении из фрейма данных.

Я также был бы в порядке, если бы у кого-нибудь был альтернативный/лучший способ показать, что определенные значения x являются особенными.

Ответ №1:

  • есть смоделированные данные, соответствующие вашему вопросу. Дополнительно случайным образом выбираются маркеры истинности
  • простой случай настройки hoverinfo
 import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go

# generate some data...
df = pd.DataFrame(
    {
        "y1": np.random.uniform(1, 5, 50),
        "id": np.random.randint(1, 4, 50),
        "y2": np.random.uniform(5, 7, 50),
    }
)
df = df.sort_values("y1", ascending=False, ignore_index=True)
df["x"] = df.index
fig = px.line(df, x="x", y="y1", hover_data=["id", "y2"])

# pick points that are special...
df2 = df.iloc[np.unique(np.random.randint(0, len(df), 5))]

# add special markers without hoverinfo
fig.add_traces(
    go.Scatter(
        x=df2.index, y=df2["y1"], mode="markers", name="Ground Truth", hoverinfo="skip"
    )
)
 

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