首页 > 解决方案 > 创建两条镜像密度曲线的 ggplot2 图,中间有一条线图(或:在 R 中重新创建漂移扩散模型图)

问题描述

[注:我用镜像这个词是松散的,我只是说一个密度曲线是倒置的]

问这个问题可能有更好的方法,但我想使用 ggplot2 重新创建这种标准类型的 DDM(漂移扩散模型)图:

在此处输入图像描述

我在下面开发的代码创建了两条密度曲线,但我无法弄清楚如何在两条曲线之间创建一个空间来绘制漂移(即沿着模拟扩散过程移动的点)。

pacman::p_load(ggplot2, rdists)

rt1 <- rdiffusion(500, a=1, v=2, t0=0.5)
ggplot() + 
  geom_density(data=subset(rt1, response=="upper"), aes(rt, fill="upper", y= ..count..)) +
  geom_rug(data=subset(rt1, response=="upper"), aes(rt, fill="upper"), sides = "tr") +
  geom_density(data=subset(rt1, response=="lower"), aes(rt, fill="lower", y= -..count..)) +
  geom_rug(data=subset(rt1, response=="lower"), aes(rt, fill="lower")) +
  scale_fill_hue("response")

这产生了这个数字:

在此处输入图像描述

标签: rggplot2

解决方案


这是一个使用patchwork.

虚拟数据:

library(tidyverse)
library(patchwork)

df <- tibble(
  x = c(sort(runif(50)), sort(runif(50))),
  y = c(cumsum(runif(50, -0.5)), cumsum(runif(50, -1.5))),
  group = rep(c("A", "B"), each = 50)
)

创建 3 个图。

p_density_top <-
  df %>%
  filter(group == "A") %>%
  ggplot(aes(x)) +
    geom_density(fill = "purple") +
    theme_minimal() +
    theme(
      axis.title = element_blank(),
      axis.text = element_blank()
    )

p_density_bottom <-
  df %>%
  filter(group == "B") %>%
  ggplot(aes(x)) +
    geom_density(fill = "red") +
    scale_y_reverse() +
    theme_minimal() +
    theme(
      axis.title.y = element_blank(),
      axis.text.y = element_blank()
    )

p_middle <-
  ggplot(df, aes(x, y, col = group)) +
    geom_line() +
    scale_color_manual(values = c("purple", "red")) +
    theme_minimal() +
    theme(
      axis.title.x = element_blank(),
      axis.text.x = element_blank()
    )

用于patchwork将它们一起显示。

(p_density_top + p_middle + p_density_bottom) + plot_layout(ncol = 1, heights = c(1, 5, 1))

阴谋


推荐阅读