Как сделать базовый блокпост в стиле R, используя ggplot2? - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужно сделать много коробок для предстоящей публикации. Я хотел бы использовать ggplot2, потому что я думаю, что он будет более гибким для будущих проектов, но мой PI настаивает на том, чтобы я делал эти графики в стиле base-R. Он специально хочет, чтобы пунктирные линии были похожи на предыдущие графики, которые мы сделали. Я сделал пример, используя набор данных iris, чтобы показать вам, используя этот код:

plot(iris$Species,
     iris$Sepal.Length,
     xlab='Species',
     ylab='Sepal Length',
     main='Sepal Variation Across Species',
     col='white')

base R plot

Мой вопрос: как сделать похожий сюжет, используя ggplot2?

Вот моя попытка:

library("ggplot2")
ggplot(iris) +
  geom_boxplot(aes(x=Species,y=Sepal.Length),linetype="dashed") +
  ggtitle("Sepal Variation Across Species")

ggplot attempt

Мне нужно сочетание пунктирных и сплошных линий, но я не могу заставить что-либо работать. Я уже проверил https://stats.stackexchange.com/questions/8137/how-to-add-horizontal-lines-to-ggplot2-boxplot, что очень очень близко, но нет пунктирных линий, которые нам нужны. Также выбросы - это заполненные круги, которые не совпадают с base-R.

Ответы [ 2 ]

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

Вот обертка вокруг великолепного решения @Marcus, для удобного использования и большей гибкости:

geom_boxplot2 <- function(mapping = NULL, data = NULL, stat = "boxplot", position = "dodge2", 
                          ..., outlier.colour = NULL, outlier.color = NULL, outlier.fill = NULL, 
                          outlier.shape = 1, outlier.size = 1.5, outlier.stroke = 0.5, 
                          outlier.alpha = NULL, notch = FALSE, notchwidth = 0.5, varwidth = FALSE, 
                          na.rm = FALSE, show.legend = NA, inherit.aes = TRUE,
                          linetype = "dashed"){
  list(
    geom_boxplot(mapping = mapping, data = data, stat = stat, position = position,
                 outlier.colour = outlier.colour, outlier.color = outlier.color, 
                 outlier.fill = outlier.fill, outlier.shape = outlier.shape, 
                 outlier.size = outlier.size, outlier.stroke = outlier.stroke, 
                 outlier.alpha = outlier.alpha, notch = notch, 
                 notchwidth = notchwidth, varwidth = varwidth, na.rm = na.rm, 
                 show.legend = show.legend, inherit.aes = inherit.aes, 
                 linetype = linetype, ...),
    stat_boxplot(aes(ymin = ..lower.., ymax = ..upper..), outlier.shape = 1) ,
    stat_boxplot(geom = "errorbar", aes(ymin = ..ymax..)) ,
    stat_boxplot(geom = "errorbar", aes(ymax = ..ymin..)) ,
    theme_classic(), # remove panel background and gridlines
    theme(plot.title = element_text(hjust = 0.5,  # hjust = 0.5 centers the title
                                    size = 14,
                                    face = "bold"),
          panel.border = element_rect(linetype = "solid",
                                      colour = "black", fill = "NA", size = 0.5))
  )
}

ggplot(data = iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot2() +
  scale_y_continuous(breaks = seq(4.5, 8.0, 0.5)) + # not sure how to generalize this
  labs(title = "Sepal Variation Across Species", y = "Sepal Length")
0 голосов
/ 06 ноября 2018

Чтобы сгенерировать блокпост «базовый стиль R» с помощью ggplot2, мы можем наложить 4 объекта блокплота поверх друг друга. Порядок здесь имеет значение , поэтому имейте это в виду, если вы изменяете код. Я настоятельно рекомендую вам изучить этот код, построив каждый слой boxplot отдельно; Таким образом, вы можете почувствовать, как взаимодействуют различные слои.

Упорядочение коробочных графиков работает следующим образом (упорядочено снизу вверх):

  • (1) вертикальные пунктирные линии ставятся первыми
  • (2) сплошная рамка со средней линией, , которая покрывает пунктирную рамку из (1)
  • (3) & (4) сплошные линии вискера, созданные с помощью панелей ошибок с минимумами, установленными на максимумы, и наоборот.

Я также добавил пользовательские перерывы в соответствии с вашим базовым R-участком, который вы можете изменять в зависимости от ваших потребностей. panel.border используется для создания тонкой рамки в стиле базы R. Чтобы получить нужные кружки, мы используем outlier.shape.

Код:

library("ggplot2")

ggplot(data = iris, aes(x = Species, y = Sepal.Length)) +
  geom_boxplot(linetype = "dashed", outlier.shape = 1) +
  stat_boxplot(aes(ymin = ..lower.., ymax = ..upper..), outlier.shape = 1) +
  stat_boxplot(geom = "errorbar", aes(ymin = ..ymax..)) +
  stat_boxplot(geom = "errorbar", aes(ymax = ..ymin..)) +
  scale_y_continuous(breaks = seq(4.5, 8.0, 0.5)) +
  labs(title = "Sepal Variation Across Species",
       x = "Species",
       y = "Sepal Length") +
  theme_classic() + # remove panel background and gridlines
  theme(plot.title = element_text(hjust = 0.5,  # hjust = 0.5 centers the title
                                  size = 14,
                                  face = "bold"),
        panel.border = element_rect(linetype = "solid",
                                    colour = "black", fill = "NA", size = 0.5))

Сюжет:

enter image description here

Не совсем точно так же, но, похоже, это приличное приближение. Надеюсь, это достаточно близко для ваших нужд. Удачи и счастливого заговора!

...