首页 > 解决方案 > ggplot未按预期绘制箱线图

问题描述

考虑下面的 MWE。我想根据这些想法生成箱线图:

  1. Food在根据Amotfor排序的 y 轴上Home,而Amt在 x 轴上 (1:40)
  2. 显示覆盖框的平均点
  3. 根据数据中站点Food中位数排序的箱线图Home dfsummary
  4. 观察的文本注释N(取自dfsummary数据)

MWE

df <- data.frame(
  Site = sample(rep(c("Home", "Office"), size = 884)),
  Food = sample(rep(c("Banana","Apple","Egg","Berry","Tomato","Potato","Bean","Pea","Nuts","Onion","Carrot","Cabbage","Eggplant"), size=884)),
  Amt = sample(seq(1, 40, by = 0.25), size = 884, replace = TRUE)
)
random <- sample(seq(1, 884, by = 1), size = 100, replace = TRUE) # to randomly introduce 100 NAs to Amt vector
df$Amt[random] <- NA

摘要代码

dfsummary <- df %>%
  dplyr::group_by(Food, Site) %>%
  dplyr::summarise(Median = round(median(Amt, na.rm=TRUE), digits=2), N = sum(!is.na(Amt))) %>%
  ungroup()

ggplot代码

p1 <- ggplot(df, aes(Amt, Food)) +
  geom_boxplot() +
  facet_grid(facets = . ~ Site)

图形

在此处输入图像描述

我期待在这里看到箱线图。

添加注释

p2 <- p1 + geom_text(aes(y = 42, Food, label = paste("n=", N)), data = dfsummary, size = 3, nudge_x = 0.1) +
  facet_grid(facets = . ~ Site)

不幸的是,这也不起作用。

笔记

标签: rggplot2graphtidyverseboxplot

解决方案


要解决这个问题,您可能需要首先生成一个散点图:

library(ggplot2)
p1 <- ggplot(df, aes(Amt, Food)) +
  geom_point() +
  facet_grid(facets = . ~ Site)
p1

在此处输入图像描述

如您所见,不可能生成箱线图。但是,如果您切换xy

ggplot(df, aes(Food, Amt)) +
  geom_boxplot() +
  facet_grid(facets = . ~ Site)

你得到: 在此处输入图像描述


推荐阅读