ggplot: Boxplot от нескольких категориальных переменных - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь построить несколько боксов на одном графике, используя ggplot2. У меня есть 1 непрерывная переменная и несколько факторов. Я хотел бы иметь одну ось Y и каждую пару коробочных графиков, чтобы иметь свою собственную ось X со своими уровнями факторов. До сих пор я пытался использовать cowplot::plot_grid, чтобы объединить графики, которые я сделал отдельно, с пустым графиком, который я использую для оси Y. Я пытался заставить диаграммы хорошо сочетаться, скрывая поля и изменяя размеры графиков, но я все еще не могу получить разумные результаты, и этот метод требует слишком много ручной настройки. Это то, что я хочу получить и что я дошел до сих пор: графики

А это мой сценарий:

library(ggplot2)
library(cowplot)
library(dplyr)

# make a dataset:
DF <- mtcars
DF$cyl <- as.factor(DF$cyl)
DF$vs <- as.factor(DF$vs)
DF$am <- as.factor(DF$am)
DF$gear <- as.factor(DF$gear)
DF$carb <- as.factor(DF$carb)
#str(DF)

# fisrt boxplot
p1 <- DF %>% ggplot() + theme_grey() + aes(x=cyl, y=mpg, fill=cyl) +
  geom_boxplot() +
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  theme(plot.margin = margin(t=0.1, r=0, b=0, l=0, unit="cm"))

# second boxplot
p2 <- DF %>% ggplot() + theme_grey() + aes(x=vs, y=mpg, fill=vs) +
  geom_boxplot() +
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  theme(plot.margin = margin(t=0.1, r=0, b=0, l=0, unit="cm"))

# empty boxplot used only for the y axis
y_axis <- DF %>% ggplot() + theme_grey() + aes(x=mpg, y=mpg) +
  geom_point() +
  theme(axis.title.y = element_text(),
        axis.text.y = element_text(),
        axis.title.x = element_text(),
        axis.text.x = element_text()) +
  theme(plot.margin = margin(t=0.1, r=0, b=0, l=0, unit="cm"))+
  scale_x_continuous(limits = c(0, 0), breaks=c(0), labels = c(""), name="")

# join all charts toghether
p_all <- plot_grid(y_axis, p1, p2,
                   align="v", axis="l", 
                   nrow=1, rel_widths = c(0.2, 1, 1))

ggdraw(p_all)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вот как это выглядит с несколькими переменными, цветом и использованием tidyr. Вы можете добавить границу между графиками с помощью panel.border и указать число строк, равное 1, в facet_wrap:

library(ggplot2)
library(dplyr)
library(tidyr)

# Only select variables meaningful as factor
DF <- select(mtcars, mpg, cyl, vs, am, gear, carb) 

DF %>% 
  gather(variable, value, -mpg) %>%
  ggplot(aes(factor(value), mpg, fill = factor(value))) +
  geom_boxplot() +
  facet_wrap(~variable, scales = "free_x", nrow = 1, strip.position = "bottom") +
  theme(panel.spacing = unit(0, "lines"),
        panel.border = element_rect(fill = NA),
        strip.background = element_blank(),
        axis.title.x = element_blank(),
        legend.position = "none",
        strip.placement = "outside")

enter image description here

0 голосов
/ 09 ноября 2018

Это то, что вы хотите?

x <- DF
x$cars <- rownames(x)
x <- melt(x[,c("cars", "cyl", "mpg", "vs")], id.vars=c("cars", "mpg"))

ggplot(x, aes(x=value,y=mpg))+
  geom_boxplot()+
  facet_wrap(~variable, strip.position = "bottom", scales = "free_x")+
  theme(panel.spacing = unit(0, "lines"),
        strip.background = element_blank(),
        strip.placement = "outside")

Сначала я преобразовал ваш формат данных с помощью melt(), чтобы была возможна огранка. Я полагаю, вы можете пойти отсюда и самостоятельно выполнить остальное форматирование.

enter image description here

...