Горизонтальное выравнивание полос и фасетов - PullRequest
1 голос
/ 02 августа 2020

У меня есть два data.frames

df1 <- 
  data.frame(unit = factor(1:20, levels = 20:1),
             value = sample(1:10, 20, replace = T))

df2 <- 
  data.frame(unit = 
               factor(as.vector(sapply(1:20, FUN = function(x) rep(x, 10))).
                      levels = 1:20),
             time = rep(1:10, 20), 
             value = sample(1:100, 10*20, replace = T))

которые я хочу построить рядом, например:

library(ggplot2)
library(cowplot)
plot_grid(ggplot(df1, aes(x=value,y=unit)) +
            geom_bar(stat = 'identity') +
            scale_x_continuous(position = "top"),
          ggplot(df2, aes(x=time,y=value)) +
                   geom_line() +
                   facet_grid(rows = vars(unit), scales = "free_y") +
            scale_x_continuous(position = "top") +
            theme(axis.text.y = element_text(size=6)),
          ncol = 2)

, что приводит к этому результату

enter image description here

Still, the rows from the two plots, mapping variables from the same unit are not perfectly aligned:

введите описание изображения здесь

Какой самый простой способ выровнять их программно (чтобы он также работал с другим числом unit s)? Решение не требует использования пакета cowplot .

Ответы [ 2 ]

2 голосов
/ 02 августа 2020
• 1000 Мы можем сделать это с помощью scale_y_discrete(expand = c(0, 0)). Мы также можем масштабировать ширину полос так, чтобы она была равна пропорции, которую каждая из фасетных панелей занимает в своих выделенных окнах просмотра. К сожалению, это несколько зависит от габаритов устройства. Тем не менее, ширина 0,8 или 0,9 будет достаточно близко.
plot_grid(ggplot(df1, aes(x=value,y=unit)) +
            geom_bar(stat = 'identity', width = 0.8) +
            scale_x_continuous(position = "top") +
            scale_y_discrete(expand = c(0, 0)),
          ggplot(df2, aes(x=time,y=value)) +
                   geom_line() +
                   facet_grid(rows = vars(unit), scales = "free_y") +
            scale_x_continuous(position = "top") +
            theme(axis.text.y = element_text(size=6)),
          ncol = 2) 

введите описание изображения здесь

2 голосов
/ 02 августа 2020

Простое решение для достижения этого - также использовать фасеты для гистограммы. Если расстояние между панелями одинаково на обоих графиках, это должно гарантировать, что столбцы и линейные графики для каждой группы выровнены. Попробуйте это:

df1 <- 
  data.frame(unit = factor(1:20, levels = 20:1),
             value = sample(1:10, 20, replace = T))

df2 <- 
  data.frame(unit = factor(as.vector(sapply(1:20, FUN = function(x) rep(x, 10))), levels = 1:20),
             time = rep(1:10, 20), 
             value = sample(1:100, 10*20, replace = T))

library(ggplot2)
library(cowplot)

plot_grid(ggplot(df1, aes(x=value,y=unit)) +
            geom_bar(stat = 'identity') +
            facet_grid(rows = vars(unit), scales = "free_y") +
            scale_x_continuous(position = "top") +
            theme(panel.spacing.y = unit(1, "pt"), strip.text = element_blank()),
          ggplot(df2, aes(x=time,y=value)) +
            geom_line() +
            facet_grid(rows = vars(unit), scales = "free_y") +
            scale_x_continuous(position = "top") +
            theme(axis.text.y = element_text(size=6), panel.spacing.y = unit(1, "pt")),
          ncol = 2)

...