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