如何绘制数据框中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
相关产品推荐
相关产品推荐

