简体   繁体   English

如何使用 ggplot2 在直线和倒置 geom_density() 之间添加垂直空白空间

[英]How to add a vertical blank space between straight and inverted geom_density() with ggplot2

I am trying to reproduce this kind of Figure, with two densities, a first one pointing upwards and a second one pointing downwards.我试图重现这种图形,有两种密度,第一个指向上方,第二个指向下方。 I would also like to have some blank space between the two densities.我还想在两个密度之间留一些空白。

在此处输入图片说明

Here is the code I am currently using.这是我目前使用的代码。

library(hrbrthemes)
library(tidyverse)
library(RWiener)

# generating data
df <- rwiener(n = 1e2, alpha = 2, tau = 0.3, beta = 0.5, delta = 0.5)

df %>%
  ggplot(aes(x = q) ) +        
  geom_density(
    data = . %>% filter(resp == "upper"),
    aes(y = ..density..),
    colour = "steelblue", fill = "steelblue",
    outline.type = "upper", alpha = 0.8, adjust = 1, trim = TRUE
    ) +
  geom_density(
    data = . %>% filter(resp == "lower"),
    aes(y = -..density..), colour = "orangered", fill = "orangered",
    outline.type = "upper", alpha = 0.8, adjust = 1, trim = TRUE
    ) +
  # stimulus onset
  geom_vline(xintercept = 0, lty = 1, col = "grey") +
  annotate(
    geom = "text",
    x = 0, y = 0,
    # hjust = 0,
    vjust = -1,
    size = 3, angle = 90,
    label = "stimulus onset"
    ) +
  # aesthetics
  theme_ipsum_rc(base_size = 12) +
  theme(axis.text.y = element_blank() ) +
  labs(x = "Reaction time (in seconds)", y = "") +
  xlim(0, NA)

Which results in something like...这会导致类似......

在此处输入图片说明

How could I add some vertical space between the two densities to reproduce the above Figure?我怎样才能在两个密度之间添加一些垂直空间来重现上图?

If you want to try without faceting, you're probably best to just plot the densities as polygons with adjusted y values according to your desired spacing:如果您想尝试不使用刻面,您可能最好将密度绘制为多边形,并根据所需的间距调整 y 值:

s <- 0.25 # set to change size of the space

ud <- density(df$q[df$resp == "upper"])
ld <- density(df$q[df$resp == "lower"])
x <- c(ud$x[1], ud$x, ud$x[length(ud$x)], 
       ld$x[1], ld$x, ld$x[length(ld$x)])
y <- c(s, ud$y + s, s, -s, -ld$y - s, -s)
df2 <- data.frame(x = x, y = y, 
                  resp = rep(c("upper", "lower"), each =  length(ud$x) + 2))

df2 %>%
  ggplot(aes(x = x, y = y, fill = resp, color = resp) ) +
  geom_polygon(alpha = 0.8) +
  scale_fill_manual(values = c("steelblue", "orangered")) +
  scale_color_manual(values = c("steelblue", "orangered"), guide = guide_none()) +
  geom_vline(xintercept = 0, lty = 1, col = "grey") +
  annotate(
    geom = "text",
    x = 0, y = 0,
    # hjust = 0,
    vjust = -1,
    size = 3, angle = 90,
    label = "stimulus onset"
    ) +
  # aesthetics
  theme_ipsum_rc(base_size = 12) +
  theme(axis.text.y = element_blank() ) +
  labs(x = "Reaction time (in seconds)", y = "")

在此处输入图片说明

you can try facetting你可以尝试刻面

set.seed(123)
q=rbeta(100, 0.25, 1)

df_dens =data.frame(gr=1,
                    x=density(df$q)$x,
                    y=density(df$q)$y)

df_dens <- rbind(df_dens,
      data.frame(gr=2,
                 x=density(df$q)$x,
                 y=-density(df$q)$y))



ggplot(df_dens, aes(x, y, fill = factor(gr))) + 
   scale_x_continuous(limits = c(0,1)) +
   geom_area(show.legend = F) + 
   facet_wrap(~gr, nrow = 2, scales = "free_y") + 
   theme_minimal() +
   theme(strip.background = element_blank(),
        strip.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.title.y = element_blank())

在此处输入图片说明

The space between both plots can be increased using panel.spacing = unit(20, "mm") .可以使用panel.spacing = unit(20, "mm")增加两个图之间的空间。 Instead of facet_grid you can also try facet_grid(gr~., scales = "free_y")除了facet_grid您还可以尝试facet_grid(gr~., scales = "free_y")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM