在R中绘制判别分析几何图:两个ggplot相关技术问题
R绘图技术问题解答
1. 绘制两组均值连线的中垂线
实现逻辑与代码:
先计算两组数据的均值坐标,再推导均值连线的中点和中垂线的斜率(原连线斜率的负倒数,特殊情况单独处理),最后在ggplot中绘制:
library(ggplot2) library(dplyr) # 假设数据框为df,分组变量为group,x/y为绘图变量 # 计算两组均值 means <- df %>% group_by(group) %>% summarise(x = mean(x), y = mean(y)) # 提取均值坐标 x1 <- means$x[1] y1 <- means$y[1] x2 <- means$x[2] y2 <- means$y[2] # 计算中点 mid_x <- (x1 + x2) / 2 mid_y <- (y1 + y2) / 2 # 计算中垂线参数 if (x1 == x2) { # 原连线为垂直线,中垂线是水平线 hline_y <- mid_y } else if (y1 == y2) { # 原连线为水平线,中垂线是垂直线 vline_x <- mid_x } else { slope_ab <- (y2 - y1) / (x2 - x1) slope_perp <- -1 / slope_ab intercept_perp <- mid_y - slope_perp * mid_x } # 绘图 ggplot(df, aes(x, y, color = group)) + geom_point() + # 绘制均值连线 geom_segment(aes(x = x1, y = y1, xend = x2, yend = y2), color = "black", linewidth = 1) + # 绘制中垂线 {if (exists("hline_y")) geom_hline(yintercept = hline_y, linetype = "dashed", color = "red")} + {if (exists("vline_x")) geom_vline(xintercept = vline_x, linetype = "dashed", color = "red")} + {if (exists("slope_perp")) geom_abline(slope = slope_perp, intercept = intercept_perp, linetype = "dashed", color = "red")} + theme_bw()
2. 组合两个独立图并旋转其中一个
可以通过ggplot2结合patchwork、grid或gtable实现,以下是两种常用方案:
方案1:patchwork + grid旋转
library(ggplot2) library(patchwork) library(grid) # 创建两个示例图形 p_scatter <- ggplot(df, aes(x, y, color = group)) + geom_point() + theme_bw() p_density <- ggplot(ld1_df, aes(x = ld1, fill = group)) + geom_density(alpha = 0.5) + theme_bw() # 旋转密度图(以90度为例) rotated_density <- grobTree(ggplotGrob(p_density), vp = viewport(angle = 90)) # 组合图形,可调整宽度比例 wrap_plots(p_scatter, rotated_density, ncol = 2, widths = c(2, 1))
方案2:gtable调整布局与旋转
library(ggplot2) library(gtable) library(grid) # 转换为grob对象 g_scatter <- ggplotGrob(p_scatter) g_density <- ggplotGrob(p_density) # 旋转密度图的面板区域 rotated_panel <- gtable_filter(g_density, "panel") %>% grid.rotate(angle = 90) # 扩展散点图布局,添加旋转后的密度图 combined_gtable <- gtable_add_cols(g_scatter, widths = g_density$widths) combined_gtable <- gtable_add_grob(combined_gtable, rotated_panel, t = 1, l = ncol(g_scatter) + 1) # 绘制组合图 grid.draw(combined_gtable)
注意:旋转后可能需要调整图形尺寸、布局参数(如widths/heights),避免元素重叠或显示不全。
内容的提问来源于stack exchange,提问作者user101089
相关产品推荐
相关产品推荐

