在连续的范围内,我可以使用 来降低刻度标签的密度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)
处理过于密集的轴标签的一种选择是使用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)
或者,如果您正在寻找一种减少使用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)
| 归档时间: |
|
| 查看次数: |
3483 次 |
| 最近记录: |