增加每秒x轴刻度ggplot2的边距

Increase the margin of every second x-axis tick ggplot2

我正在寻找一种方法来每秒 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 个刻度,所以我无法手动设置)。

有什么想法吗?

编辑:

输出应该是:

编辑2:

一个更复杂的例子是:

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

编辑 -- 在底部添加了分类方法。

这是一个技巧。希望有更好的方法!

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")

下面是与分类 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")