我正在为一些数据生成图表,但刻度的数量太小,我需要更精确的读数。
是否有某种方法可以增加ggplot2中的轴刻度数?
我知道我可以告诉ggplot使用一个向量作为轴刻度,但我想要的是为所有数据增加刻度的数量。换句话说,我希望从数据中计算出刻度数。
ggplot可能会在内部用一些算法来做这个,但我找不到它是怎么做的,根据我想要的改变。
我正在为一些数据生成图表,但刻度的数量太小,我需要更精确的读数。
是否有某种方法可以增加ggplot2中的轴刻度数?
我知道我可以告诉ggplot使用一个向量作为轴刻度,但我想要的是为所有数据增加刻度的数量。换句话说,我希望从数据中计算出刻度数。
ggplot可能会在内部用一些算法来做这个,但我找不到它是怎么做的,根据我想要的改变。
您可以通过修改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()
给你这个:
重写音阶可以得到这样的结果:
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))
如果您只想“放大”图的特定部分,请分别查看xlim()和ylim()。在这里也可以找到很好的见解来理解其他的论点。
您可以提供一个函数参数进行缩放,ggplot将使用 用来计算滴答点位置的函数。
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_continuous和scale_y_continuous的间断符
library(ggplot2)
plt <- ggplot(mtcars, aes(x = mpg, y = disp)) +
geom_point()
plt +
scale_x_continuous(n.breaks = 5)
plt +
scale_x_continuous(n.breaks = 10) +
scale_y_continuous(n.breaks = 10)
回答这个问题和如何在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))