绘图意味着使用facet_wrap

时间:2018-05-23 11:40:55

标签: r ggplot2 histogram facet-wrap

我使用ggplot2facet_wrap制作了几个直方图,并希望在每个面板上绘制平均值。下面,我创建一个虚拟数据框,找到每个方面的平均值,然后创建使用geom_point添加平均值的图。

# Load libraries 
library(tidyverse)

# Toy data frame
df <- data.frame(ID = sample(letters[1:3], 100, replace = TRUE), n = runif(100))

# Mean value of each group
df_mean <- df %>% group_by(ID) %>% summarise(mean = mean(n))

# Plot histograms
ggplot(df) + 
  geom_histogram(aes(n)) + 
  facet_wrap(~ID) +
  geom_point(data = df_mean, aes(x = mean, y = Inf))

enter image description here

我使用y = Inf将点放在每个方面的顶部,但是 - 如您所见 - 它被略微裁剪。我想向下轻推它,以便它完全可见。据我所知,geom_point没有nudge_yvadj参数,0.7 * Inf显然是荒谬的。我还尝试将position = position_nudge(y = -5)作为参数添加到geom_point,但这似乎没有任何效果。作为一种解决方法,我甚至尝试使用geom_text并指定nudge_y,但是 - 与position_nudge解决方案一样 - 它没有任何明显的效果。在绘图时是否有一种简单的方法可以做到这一点,或者我只是需要在绘图之前计算y值?

2 个答案:

答案 0 :(得分:4)

如果您可以使用geom_text/label(),则可以使用vjust参数执行此操作:

ggplot(df) + 
    geom_histogram(aes(n)) + 
    facet_wrap(~ID) +
    geom_text(data = df_mean, aes(x = mean, y = Inf),
              label = "Mean", vjust = 1)

enter image description here

我总是在面板顶部使用它来浮动百分比变化或p值,而你不需要计算任何东西,ggplot已经找到了你。

答案 1 :(得分:2)

# Load libraries 
library(tidyverse)

# Toy data frame
df <- data.frame(ID = sample(letters[1:3], 100, replace = TRUE), n = runif(100))

# Mean value of each group
df_mean <- df %>% group_by(ID) %>% summarise(mean = mean(n))

# Get max count using the dataframe that stores ggplot info
ggplot(df) + 
  geom_histogram(aes(n)) + 
  facet_wrap(~ID) -> p

# Plot histograms and plot mean in the right place
p + geom_point(data = df_mean, aes(x = mean, y = max(ggplot_build(p)$data[[1]]$count)))

enter image description here

这里的关键是知道最大计数值,因为这将是直方图的最高y轴值。您可以使用ggplot_build函数获取该信息,并使用它在正确的位置绘制您的点。

当然,如果点落在其中一个柱子上,你可以略高于最大计数,例如y = 0.2 + max(ggplot_build(p)$data[[1]]$count))