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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 01:27:17