增加轴刻度数

我正在为一些数据生成图,但刻度的数量太小,我需要更多的精度读取。

是否有某种方法可以增加ggplot2中的轴刻度数?

我知道我可以告诉ggplot使用一个向量作为轴刻度,但我想要的是为所有数据增加刻度的数量。换句话说,我希望从数据中计算出刻度数。

ggplot可能会在内部用一些算法来做这个,但我找不到它是怎么做的,根据我想要的改变。

370712 次浏览

你可以通过修改scale_x_continuous和/或scale_y_continuous来覆盖ggplot的默认规模。例如:

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))


ggplot(dat, aes(x,y)) +
geom_point()

给你这个:

enter image description here

重写音阶可以得到这样的结果:

ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks = round(seq(min(dat$x), max(dat$x), by = 0.5),1)) +
scale_y_continuous(breaks = round(seq(min(dat$y), max(dat$y), by = 0.5),1))

enter image description here

如果你想简单地“放大”图的特定部分,分别查看xlim()ylim()。好的洞察力也可以找到在这里来理解其他参数。

你可以为scale提供一个函数参数,ggplot将使用 计算tick位置的函数。

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))
number_ticks <- function(n) {function(limits) pretty(limits, n)}


ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks=number_ticks(10)) +
scale_y_continuous(breaks=number_ticks(10))

基于Daniel Krizian的评论,你也可以使用自动导入的scales库中的pretty_breaks函数:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))

你所要做的就是插入n所需的刻度数。


一个稍微不太有用的解决方案(因为你必须再次指定数据变量),你可以使用内置的pretty函数:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = pretty(dat$x, n = 10)) +
scale_y_continuous(breaks = pretty(dat$y, n = 10))

此外,

ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks = seq(min(dat$x), max(dat$x), by = 0.05))

适用于二进制或离散缩放的x轴数据(即,不需要舍入)。

从v3.3.0开始,ggplot2有一个选项n.breaks来自动生成scale_x_continuousscale_y_continuous的断点

    library(ggplot2)


plt <- ggplot(mtcars, aes(x = mpg, y = disp)) +
geom_point()


plt +
scale_x_continuous(n.breaks = 5)

enter image description here

    plt +
scale_x_continuous(n.breaks = 10) +
scale_y_continuous(n.breaks = 10)

enter image description here

这个问题的回答和如何在R ggplot中以相等的间隔在X轴和Y轴上设置标签?

mtcars %>%
ggplot(aes(mpg, disp)) +
geom_point() +
geom_smooth() +
scale_y_continuous(limits = c(0, 500),
breaks = seq(0,500,50))  +
scale_x_continuous(limits = c(0,40),
breaks = seq(0,40,5))