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

如何绘制数据框中3列中的2列?以X列与Y列绘图为例

嗨,我来帮你搞定这个X-Y对比图的问题!首先看一下你的sample3d函数——它是通过拒绝采样生成单位球面上的均匀分布点,这个逻辑是对的,但每次循环里用rbind逐行拼接数据框,在数据量较大时效率会很低,咱们先优化下这个函数,再讲绘图方法。

优化球面点生成函数

先给你两个更高效的版本:

版本1:优化拒绝采样(减少循环次数)

sample3d <- function(n) {
  # 预分配数据框空间,避免重复扩容
  df <- data.frame(X = numeric(n), Y = numeric(n), Z = numeric(n))
  current_row <- 1
  
  while(current_row <= n) {
    # 一次生成100个候选点,大幅减少循环次数
    candidates <- data.frame(
      X = runif(100, -1, 1),
      Y = runif(100, -1, 1),
      Z = runif(100, -1, 1)
    )
    # 计算每个点到原点的距离平方
    candidates$dist_sq <- candidates$X^2 + candidates$Y^2 + candidates$Z^2
    # 筛选出单位球内的点
    valid_points <- candidates[candidates$dist_sq < 1, ]
    # 归一化到单位球面
    valid_points$dist <- sqrt(valid_points$dist_sq)
    valid_points[, c("X", "Y", "Z")] <- valid_points[, c("X", "Y", "Z")] / valid_points$dist
    
    # 取需要的行数,避免超过目标数量n
    take <- min(n - current_row + 1, nrow(valid_points))
    df[current_row:(current_row + take - 1), ] <- valid_points[1:take, c("X", "Y", "Z")]
    current_row <- current_row + take
  }
  df
}

# 生成400个点
df <- sample3d(400)

版本2:球面坐标转换(无拒绝采样,效率最高)

如果不想用拒绝采样,直接用球面坐标转换生成均匀分布的球面点,速度会更快:

sample3d_fast <- function(n) {
  theta <- runif(n, 0, 2*pi)  # 方位角
  phi <- acos(runif(n, -1, 1))  # 极角
  data.frame(
    X = sin(phi)*cos(theta),
    Y = sin(phi)*sin(theta),
    Z = cos(phi)
  )
}

df <- sample3d_fast(400)
绘制X与Y的对比图

接下来就可以绘制X和Y的对比图了,这里给你两种常用的方法:

方法1:基础绘图系统(轻量快捷)

如果你习惯用R自带的基础绘图,直接用plot函数就能生成散点图:

# 绘制X-Y散点图
plot(df$X, df$Y, 
     main = "X vs Y on Unit Sphere",
     xlab = "X Value", ylab = "Y Value",
     pch = 16, col = "#2E86AB", cex = 1.2)  # pch=16是实心圆点,颜色选了蓝灰色

# 如果需要添加线性拟合线,可以加这行
abline(lm(Y ~ X, data = df), col = "#E74C3C", lwd = 2)  # 红色粗线

方法2:ggplot2(美观灵活,易自定义)

如果你喜欢更美观的可视化效果,推荐用ggplot2包,先确保你安装了它:

install.packages("ggplot2")
library(ggplot2)

然后绘图:

ggplot(df, aes(x = X, y = Y)) +
  geom_point(color = "#2E86AB", size = 3, alpha = 0.7) +  # 半透明蓝灰色圆点
  geom_smooth(method = "lm", color = "#E74C3C", se = FALSE) +  # 红色线性拟合线
  labs(title = "X vs Y on Unit Sphere",
       x = "X Coordinate", y = "Y Coordinate") +
  theme_minimal() +  # 简洁的主题
  theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))  # 标题居中加粗

这样就能得到清晰的X-Y对比散点图,你还可以根据需求调整点的样式、颜色,或者添加密度曲线、网格线等元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:37:40