Увеличивайте поля каждой второй галочки по оси x ggplot2 - PullRequest
0 голосов
/ 20 октября 2019

Я ищу способ перемещаться каждую секунду x-axis вниз, чтобы линия tick опускалась вместе с ним. Я могу изменить общий запас и длину тиков для всех тиков с помощью:

#MWE
library(ggplot2)
ggplot(cars, aes(dist, speed))+
   geom_point()+
   theme(
       axis.ticks.length.x = unit(15, "pt")
   )

Но я бы хотел, чтобы тики по оси x 0, 50 и 100 (т.е. каждый второй тик) были бездобавлено верхнее поле. Обобщенный ответ предпочтительнее, так как моя ось x является категориальной, а не числовой (и содержит 430 тиков, поэтому я ничего не могу установить вручную).

Любые идеи?

Редактировать:

Выходные данные должны быть: enter image description here

Edit2:

Более сложный пример:

#MWE
ggplot(diamonds, aes(cut, price, fill = clarity, group = clarity))+
geom_col(position = 'dodge')+
theme(
    axis.ticks.length.x = unit(15, "pt")
)

1 Ответ

2 голосов
/ 21 октября 2019

Edit - добавлен категоричный подход внизу.

Вот хак. Надеюсь, что есть лучший способ!

ticks <- data.frame(
  x = 25*0:5,
  y = rep(c(-0.2, -2), 3)
)

ggplot(cars, aes(dist, speed))+
  geom_point()+
  geom_rect(fill = "white", xmin = -Inf, xmax = Inf,
            ymin = 0, ymax = -5) +
  geom_segment(data = ticks,
               aes(x = x, xend = x,
                   y = 0, yend = y)) +
  geom_text(data = ticks,
            aes(x = x, y = y, label = x), vjust = 1.5) +
  theme(axis.ticks.x = element_blank()) +
  scale_x_continuous(breaks = 25*0:5, labels = NULL, name = "") +
  coord_cartesian(clip = "off")

enter image description here

Вот аналогичный подход, используемый с категориальным x.

cats <- sort(as.character(unique(diamonds$cut)))
ticks <- data.frame(x = cats)
ticks$y = ifelse(seq_along(cats) %% 2, -500, -2000)

ggplot(diamonds, aes(cut, price, fill = clarity, group = clarity))+
  geom_col(position = 'dodge') +
  annotate("rect", fill = "white",
           xmin = 0.4, xmax = length(cats) + 0.6,
           ymin = 0, ymax = -3000) +
  geom_segment(data = ticks, inherit.aes = F,
               aes(x = x, xend = x,
                   y = 0, yend = y))  +
  geom_text(data = ticks, inherit.aes = F,
            aes(x = x, y = y, label = x), vjust = 1.5) +
  scale_x_discrete(labels = NULL, name = "cut") +
  scale_y_continuous(expand = expand_scale(mult = c(0, 0.05))) +
  theme(axis.ticks.x = element_blank()) +
  coord_cartesian(clip = "off")

enter image description here

...