提问人:hanne 提问时间:11/17/2023 更新时间:11/17/2023 访问量:33
如何以编程方式标记“ggplot”轴上的最小值和最大值?
How to programmatically label the minimum and maximum values on a `ggplot` axis?
问:
我想让轴刻度 () 表示数据中观察到的最小值和最大值。但我不想手动执行此操作,因为代码应该扩展到不同的数据集。breaks
我尝试过适应 https://stackoverflow.com/a/22819926/17724015、https://stackoverflow.com/a/5380817/17724015 和 https://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
答:
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
})
我不确定有什么好方法可以避免在此处对数据框和 y 列进行硬编码,但至少它比硬编码实际值要好。也许其他人会知道如何做到这一点。
评论
0赞
Allan Cameron
11/17/2023
我认为如果你想避免硬编码,你可以改成。dat$y
y
1赞
Gregor Thomas
11/17/2023
感谢您@AllanCameron的想法,但它在这里不起作用。函数的输入是填充的限制。因此,仅使用即可使上限和下限在填充的极限处断裂,并且.而且由于超出了数据的严格范围,即使删除填充,结果为 0.5 和 26.5。(将硬编码从 breaks 参数移动到 result 会导致极端缺失的几何图形,因为图块超出了点。breaks
y
-0.8
27.8
geom_tile
expand = expansion(0, 0)
limits = rev(range(dat$y))
1赞
hanne
11/17/2023
谢谢。硬编码的最后一点可能会引起将来的参考。但是在我的特定情况下,不会产生任何问题,因为我在绘图生成部分周围使用了包装器函数,所以这解决了我的问题。dat$y
评论