You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ggplot2散点图中定位并高亮距原点最近的点

解决方法

首先明确:你之前的计算逻辑本身是正确的,但因为x轴(Threshold)和y轴(Number)的数值尺度差异极大(x范围0.01-0.08,y范围10-300),直接计算欧氏距离时,y的权重远大于x,导致数学上的最短向量点在视觉上看起来离原点较远。下面分两种场景给出解决方案:

场景1:寻找数学上的最短向量点(原始坐标欧氏距离最小)

这种情况直接计算每个点到原点的欧氏距离平方(平方和最小等价于距离最小),定位后高亮该点并标注:

library(ggplot2)

df <- data.frame(
  Threshold = c(0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08),
  Number = c(300,200,150, 120, 90, 74, 30,10)
)

# 计算点到原点的距离平方
df$dist_sq <- df$Threshold^2 + df$Number^2
# 标记距离最小的点
df$is_closest <- df$dist_sq == min(df$dist_sq)

ggplot(df, aes(x = Threshold, y = Number)) +
  geom_line() +
  geom_point(aes(color = is_closest), size = 3) +
  # 标注该点的Threshold值
  geom_text(data = subset(df, is_closest), 
            aes(label = paste("Threshold:", Threshold)),
            vjust = -1) +
  scale_color_manual(values = c("black", "red")) +
  theme_minimal() +
  theme(legend.position = "none")

场景2:寻找视觉上的最短向量点(消除坐标轴尺度影响)

如果想要符合人眼视觉感受的“最近点”,需要先对x、y做标准化处理,让二者处于同一尺度后再计算距离:

library(ggplot2)
library(dplyr)

df <- data.frame(
  Threshold = c(0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08),
  Number = c(300,200,150, 120, 90, 74, 30,10)
)

# 归一化x、y到0-1范围,消除尺度差异
df <- df %>%
  mutate(
    Threshold_norm = (Threshold - min(Threshold)) / (max(Threshold) - min(Threshold)),
    Number_norm = (Number - min(Number)) / (max(Number) - min(Number)),
    dist_norm_sq = Threshold_norm^2 + Number_norm^2
  ) %>%
  mutate(is_closest_visual = dist_norm_sq == min(dist_norm_sq))

ggplot(df, aes(x = Threshold, y = Number)) +
  geom_line() +
  geom_point(aes(color = is_closest_visual), size = 3) +
  geom_text(data = subset(df, is_closest_visual), 
            aes(label = paste("Threshold:", Threshold)),
            vjust = -1) +
  scale_color_manual(values = c("black", "blue")) +
  theme_minimal() +
  theme(legend.position = "none")

关键说明

  • 原始坐标计算的最短向量点是(0.08, 10),因为它的向量长度平方最小;
  • 标准化后得到的视觉最近点会更符合人眼直观感受,因为此时x和y的权重对等。

内容的提问来源于stack exchange,提问作者tadeufontes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:21:07