控制 ggplot2 中的离散刻度标签 (scale_x_discrete)

Dan*_*ams 2 r ggplot2

在连续的范围内,我可以使用 来降低刻度标签的密度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))
Run Code Online (Sandbox Code Playgroud)

# 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)
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 12 月 21 日创建(v2.0.1)

r2e*_*ans 8

处理过于密集的轴标签的一种选择是使用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))
Run Code Online (Sandbox Code Playgroud)

带有躲避轴标签的 ggplot

或者,如果您正在寻找一种减少使用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)
Run Code Online (Sandbox Code Playgroud)

具有交替标签删除功能的ggplot