将文本标签添加到点子集的 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()
我有一个包含数千个点的 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()