将文本标签添加到点子集的 plotly 散点图

Adding text labels to a plotly scatter plot for a subset of points

我有一个包含数千个点的 plotly.express.scatter 图。我想添加文本标签,但仅限于异常值(例如,远离趋势线)。

如何使用 plotly 执行此操作?

我猜我需要列出我想要标记的点,然后以某种方式将其传递给 plotly (update_layout?)。我对执行此操作的好方法很感兴趣。

感谢任何帮助。

您的想法是正确的:您需要获取异常值的坐标,并使用 Plotly 的 text annotations 为这些点添加文本标签。我不确定你想如何确定异常值,但以下是使用 tips 数据集的示例。

import pandas as pd
from sklearn import linear_model
import plotly.express as px

df = px.data.tips()

## use linear model to determine outliers by residual
X = df["total_bill"].values.reshape(-1, 1)
y = df["tip"].values

regr = linear_model.LinearRegression()
regr.fit(X, y)

df["predicted_tip"] = regr.predict(X)
df["residual"] = df["tip"] - df["predicted_tip"]
residual_mean, residual_std = df["residual"].mean(), df["residual"].std()
df["residual_normalized"] = (((df["tip"] - df["predicted_tip"]) - residual_mean) / residual_std).abs()

## determine outliers using whatever method you like
outliers = df.loc[df["residual_normalized"] > 3.0, ["total_bill","tip"]]

fig = px.scatter(df, x="total_bill", y="tip", trendline="ols", trendline_color_override="red")

## add text to outliers using their (x,y) coordinates:
for x,y in outliers.itertuples(index=False):
    fig.add_annotation(
        x=x, y=y,
        text="outlier",
        showarrow=False,
        yshift=10
    )
fig.show()