Заставить ось y начинаться с 0, вставить «break», И иметь большую ось y, используя ggplot2 - PullRequest
1 голос
/ 07 апреля 2020

давний тайник вернулся с другим вопросом ggplot.

Я все еще работаю над доработкой воспроизводимой цифры для публикации. Рецензенты хотели бы, чтобы ось Y нижнего графика графика начиналась с 0 и содержала разрыв строки "//". Ось Y должна быть не только достаточно большой (например, 1500 единиц), но и достаточно сильно увеличена (например, 300 единиц). Из-за этого рецензент хочет, чтобы мы добавили разрыв строки, чтобы обозначить, что наша ось начинается с 0, но продолжается.

Пример того, что я могу создать: enter image description here

Пример того, что я хочу (обратите внимание на ось y; это было сделано вручную в powerpoint на аналогичном рисунке): enter image description here

есть мысли ?? Спасибо !!

мой код:

ggplot(data = quad2,
       aes(x, predicted, group = group)) +
  geom_point(aes(shape = group), size = 6) +
  scale_shape_manual(values=c(19, 1)) +
  geom_line(size = 2,
            aes(linetype = group),
            color = "black") +
  scale_linetype_manual(values = c("solid", "dashed")) +
  geom_linerange(size = 1,
                 aes(ymin = predicted - conf.low,
                     ymax = predicted + conf.high),
                 color = "black",
                 alpha = .8) +
   geom_segment(aes(xend = x,
                    yend = ifelse(group == "Control", conf.high, conf.low)),
                arrow = arrow(angle = 90), color = "red")+
    labs(x = "Time",
       y = expression(bold("QUAD Volume (cm"^"3"*")")),
       linetype = "",
       shape = "") + #Legend title
  scale_y_continuous(limits =c(1500, 2000)) 

Воспроизводимые данные:

dput(quad2)
structure(list(x = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 
5L, 5L), .Label = c("PRE", "MID1", "MID2", "MID3", "POST"), class = "factor"), 
    predicted = c(1666.97185871754, 1660.27445165342, 1743.2831065274, 
    1678.48945165342, 1788.50605542978, 1637.40907049806, 1807.55826371403, 
    1639.78265640012, 1865.8766220711, 1652.91070173056), std.error = c(88.8033117577884, 
    91.257045996107, 92.9973963841595, 95.3834973421298, 95.0283457128716, 
    97.3739053806999, 95.6466346849776, 97.9142418717957, 93.3512943191676, 
    95.5735155125126), conf.low = c(0, 91.257045996107, 0, 95.3834973421298, 
    0, 97.3739053806999, 0, 97.9142418717957, 0, 95.5735155125126
    ), conf.high = c(88.8033117577884, 0, 92.9973963841595, 0, 
    95.0283457128716, 0, 95.6466346849776, 0, 93.3512943191676, 
    0), group = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
    2L), .Label = c("Intervention", "Control"), class = "factor")), class = "data.frame", row.names = c(NA, 
-10L))

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

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

Сначала создайте свой график. Единственное, что я добавил, было форматирование оси Y и тема линии оси. Мы просто пометим нижний тик «0».

plt <- ggplot(data = quad2,
       aes(x, predicted, group = group)) +
  geom_point(aes(shape = group), size = 6) +
  scale_shape_manual(values=c(19, 1)) +
  geom_line(size = 2,
            aes(linetype = group),
            color = "black") +
  scale_linetype_manual(values = c("solid", "dashed")) +
  geom_linerange(size = 1,
                 aes(ymin = predicted - conf.low,
                     ymax = predicted + conf.high),
                 color = "black",
                 alpha = .8) +
  geom_segment(aes(xend = x,
                   yend = ifelse(group == "Control", conf.high, conf.low)),
               arrow = arrow(angle = 90), color = "red")+
  labs(x = "Time",
       y = expression(bold("QUAD Volume (cm"^"3"*")")),
       linetype = "",
       shape = "") + #Legend title
  scale_y_continuous(limits =c(1400, 2000),
                     breaks = seq(1400, 2000, by = 200),
                     labels = c(0, seq(1600, 2000, by = 200)),
                     expand = c(0,0,0.05,0)) +
  theme(axis.line = element_line())

Затем мы превратим это в gtable и возьмем линию оси y:

gt <- ggplotGrob(plt)

is_yaxis <- which(gt$layout$name == "axis-l")
yaxis <- gt$grobs[[is_yaxis]]

# You should grab the polyline child
yline <- yaxis$children[[1]]

Сейчас мы можем отредактировать строку так, как сочтем нужным:

yline$x <- unit(rep(1, 4), "npc")
yline$y <- unit(c(0, 0.1, 1, 0.15), "npc")
yline$id <- c(1, 1, 2, 2)
yline$arrow <- arrow(angle = 90)

Поместите ее обратно в объект gtable и нанесите на карту:

yaxis$children[[1]] <- yline

gt$grobs[[is_yaxis]] <- yaxis

# grid plotting syntax
grid.newpage(); grid.draw(gt)      

enter image description here

Вы можете выбрать стилиста c на этапе редактирования строки по своему усмотрению.

1 голос
/ 07 апреля 2020

Насколько мне известно, ggplot2 не поддерживает разрывы осей. Здесь есть решение здесь с facet_grid.

...