在连续的范围内,我可以使用 来降低刻度标签的密度breaks,并使用 来以灵活的方式很好地控制它们的密度scales::pretty_breaks()。但是,我不知道如何通过离散规模实现类似的目标。具体来说,如果我的离散标签是letters,那么假设我想显示所有其他标签来清理图表。有没有一种简单、系统的方法来做到这一点?
我有一个可行的技巧(见下文),但正在寻找更自动和优雅的东西。
library(tidyverse)
# make some dummy data
dat <-
  matrix(sample(100),
         nrow = 10,
         dimnames = list(letters[1:10], LETTERS[1:10])) %>%
  as.data.frame() %>%
  rownames_to_column("row") %>%
  pivot_longer(-row, names_to = "column", values_to = "value")
# default plot has all labels on discrete axes
dat %>% 
  ggplot(aes(row, column)) +
  geom_tile(aes(fill = value))

# desired plot would look like following:
ylabs <- LETTERS[1:10][c(T, NA)] %>% replace_na("")
xlabs <- letters[1:10][c(T, NA)] %>% replace_na("")
# can force desired axis text density but it's an ugly hack
dat %>% 
  ggplot(aes(row, column)) +
  geom_tile(aes(fill = value)) +
  scale_y_discrete(labels = ylabs) +
  scale_x_discrete(labels = xlabs)

由reprex 包于 2021 年 12 月 21 日创建(v2.0.1)
处理过于密集的轴标签的一种选择是使用n.dodge:
ggplot(dat, aes(row, column)) +
  geom_tile(aes(fill = value)) +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  scale_y_discrete(guide = guide_axis(n.dodge = 2))
或者,如果您正在寻找一种减少使用xlabs并以编程方式进行的方法,那么我们可以将一个函数传递给scale_x_discrete(breaks=):
everyother <- function(x) x[seq_along(x) %% 2 == 0]
ggplot(dat, aes(row, column)) +
  geom_tile(aes(fill = value)) +
  scale_x_discrete(breaks = everyother) +
  scale_y_discrete(breaks = everyother)