如何以编程方式标记“ggplot”轴上的最小值和最大值?

How to programmatically label the minimum and maximum values on a `ggplot` axis?

提问人:hanne 提问时间:11/17/2023 更新时间:11/17/2023 访问量:33

问:

我想让轴刻度 () 表示数据中观察到的最小值和最大值。但我不想手动执行此操作,因为代码应该扩展到不同的数据集。breaks

我尝试过适应 https://stackoverflow.com/a/22819926/17724015https://stackoverflow.com/a/5380817/17724015https://stackoverflow.com/a/52337662/17724015。我错过了哪些选项?ggplot

# situation
library(ggplot2)
dat <- data.frame(x = sample(letters), y = 1:26)
ggplot(dat, aes(x, y)) + 
  geom_tile() + 
  scale_y_reverse()


# required output
ggplot(dat, aes(x, y)) + 
  geom_tile() + 
  scale_y_reverse(breaks = c(1, 10, 20, 26))


# attempted solution (not suitable, not enough breaks)
ggplot(dat, aes(x, y)) + 
  geom_tile() + 
  scale_y_reverse(breaks = seq(min(dat$y), max(dat$y), by = mean(range(dat$y)) - 1))


# attempted solution (not scalable, too many breaks)
ggplot(dat, aes(x, y)) + 
  geom_tile() + 
  scale_y_reverse(n.breaks = nrow(dat) - 1)


# attempted solution (not working)
ggplot(dat, aes(x, y)) + 
  geom_tile() + 
  scale_y_reverse(expand = expansion(add = 1))

创建于 2023-11-16 with reprex v2.0.2

r ggplot2 轴标签

评论


答:

4赞 Gregor Thomas 11/17/2023 #1

计算中断的默认函数是 。您可以运行该函数并根据需要修改结果。(并且参数接受一个函数。也许是这样的:scales::extended_breaks()breaks

ggplot(dat, aes(x, y)) + 
  geom_tile() + 
  scale_y_reverse(breaks = \(y) {
    eb = scales::extended_breaks()(y)
    eb[1] = min(dat$y)
    eb[length(eb)] = max(dat$y)
    eb
  })

enter image description here

我不确定有什么好方法可以避免在此处对数据框和 y 列进行硬编码,但至少它比硬编码实际值要好。也许其他人会知道如何做到这一点。

评论

0赞 Allan Cameron 11/17/2023
我认为如果你想避免硬编码,你可以改成。dat$yy
1赞 Gregor Thomas 11/17/2023
感谢您@AllanCameron的想法,但它在这里不起作用。函数的输入是填充的限制。因此,仅使用即可使上限和下限在填充的极限处断裂,并且.而且由于超出了数据的严格范围,即使删除填充,结果为 0.5 和 26.5。(将硬编码从 breaks 参数移动到 result 会导致极端缺失的几何图形,因为图块超出了点。breaksy-0.827.8geom_tileexpand = expansion(0, 0)limits = rev(range(dat$y))
1赞 hanne 11/17/2023
谢谢。硬编码的最后一点可能会引起将来的参考。但是在我的特定情况下,不会产生任何问题,因为我在绘图生成部分周围使用了包装器函数,所以这解决了我的问题。dat$y