ChatGPT解决这个技术问题 Extra ChatGPT

增加轴刻度数

我正在为一些数据生成图,但刻度数太少,我需要更精确的读数。

有什么方法可以增加 ggplot2 中的轴刻度数吗?

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

可能 ggplot 在内部使用某种算法执行此操作,但我找不到它是如何做到的,以根据我想要的进行更改。


C
Chase

您可以通过修改 scale_x_continuous 和/或 scale_y_continuous 来覆盖 ggplots 默认比例。例如:

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

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

给你这个:

https://i.stack.imgur.com/d5jFT.jpg

覆盖尺度可以给你这样的东西:

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))

https://i.stack.imgur.com/brQ5z.jpg

如果您想简单地“放大”绘图的特定部分,请分别查看 xlim()ylim()。还可以找到很好的洞察力here来理解其他论点。


实际上,重点是将 by 参数“概括”到不同的数字尺度,即 0.5 是这个范围为 c(-3,3) 的数据的好值,但它不是一个好的范围范围为 c(0,5000) 的数据。有没有计算它的函数?
@JoãoDaniel - 我的意思是 ggplot 自动在这方面做得不错。如果它没有产生一组令人满意的结果,我不确定是否有内置函数可以提供不同的东西。您需要的详细程度将特定于您的情节,但也许要考虑一些测试用例和您指定的详细程度来识别模式......如果这是一个箱线图,max-min/30 之类的东西很常见“桶”大小......但这对您来说可能是也可能不是一个好的起点。
对于 x 轴上的分类值,例如时间序列的一年中的月份,又如何呢?
@ScottDavis 看看 link。您可以使用 scale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
对于缩放,应使用 coord_cartesian 而不是 xlimstackoverflow.com/questions/25685185/…
s
slhck

基于 Daniel Krizian's comment,您还可以使用自动导入的 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 已经导入 scales 但没有将函数添加到您的命名空间。因此,您可以在没有导入为 scales::pretty_breaks(n = 10) 的情况下调用它们。
我同意 - 这太棒了!多年来,我一直在使用“不太有用”的解决方案,但它有一些限制(例如,它无法处理多面图中的“自由”比例),但 scales::pretty_breaks完美地处理了这些!我无法相信我花了这么长时间才找到它。
假设您使用的是支持它的 ggplot 版本,下面描述 n.breaks 参数的 Tung's answer 提供了相同的功能,但非常紧凑。两个很好的答案!
答案是最好的,也是我能找到的最好的,但是当 x 轴有“时间”时,不仅仅是一个数字,那么 pretty_breaks 会将时间转换为一个数字。很糟糕的是,ggplot 只绘制了这 3 或 4 个条目并且没有简单的方法来改进它。
c
crowding

您可以为 scale 提供一个函数参数,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))

无需创建自己的函数 number_ticks。这已在 pretty_breaks {scales} 中实现。因此:ggplot(dat, aes(x,y)) + geom_point() + scale_x_continuous(breaks=pretty_breaks(n=10)) + scale_y_continuous(breaks=pretty_breaks(n=10))
@Daniel Krizian:1)需要require(scales) 2)这似乎可以防止我的中断出现在科学记数法中,因此 1e6 更改为 1000000 ??
您可以在没有 scales 包的情况下使用基本 R 的 pretty,只需提供值作为参数。例如:(breaks=pretty(dat$x, n=10))
@smci 如果 ggplot2 正在工作,则可以使用 scales。 ggplot2 没有尺度就无法工作。
T
Tung

从 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)

https://i.stack.imgur.com/RUxXg.png

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

https://i.stack.imgur.com/pyTrw.png


这显然是最好的答案!假设您拥有提供此参数的更新版本的 ggplot,这与使用 scales::pretty_breaks 一样有效,但更紧凑和清晰。谢谢!
这个新特性很有帮助,但我希望我们可以指定中断增量,而不必指定最小值和最大值。因此,我想指定 break.increments = 1 之类的东西,而不是 breaks = seq(1:10, 1)n.breaks = 10 之类的东西(假设我的最小值为 1,最大值为 10)。因此,如果有 12 个数据点,就会有 12 个刻度/标签。 ggplot 已经有了数据,所以它似乎可以计算出最小值/最大值。
这是最好的答案,仍然! :)
b
bmc

此外,

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

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


S
Saurav Das

对此问题的答复和How set labels on the X and Y axises by equal intervals in R ggplot?

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))

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅