增加轴刻度数


188

我正在为某些数据生成图,但是刻度的数量太少,我需要读取时更精确

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

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

ggplot可能在内部使用某种算法来做到这一点,但是我找不到它是如何做到的,可以根据自己的需要进行更改。

Answers:


186

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

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()。在这里也可以找到很好的见解以了解其他论点。


4
实际上,要点是将by参数“概括” 为不同的数字小数位,即,对于该数据,该范围为c(-3,3)的值是一个好的值,但对于范围为c(-3,3)的数据来说,这不是一个好的范围是c(0,5000)。有一些函数可以计算出来吗?
若奥·丹尼尔

3
@JoãoDaniel-我的意思是ggplot会自动做到这一点。如果不能产生令人满意的结果,我不确定是否有内置函数可以提供不同的结果。您想要的详细程度将特定于您的绘图,但也许可以考虑一下一些测试用例和您指定的详细程度以识别模式...如果这是箱线图,max-min/30则是一个非常常见的“桶”大小...但这对您来说可能不是一个好的起点。
Chase

4
对于x轴上的分类值(例如时间序列中的月份),该怎么办?
斯科特·戴维斯

3
@ScottDavis看看链接。您可以使用scale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Markus Hauschel

对于变焦,coord_cartesian应使用而不是xlimstackoverflow.com/questions/25685185/…–
qwr

165

根据Daniel Krizian的评论,您还可以使用库中的pretty_breaks功能,该功能scales会自动导入:

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

15
这显然是最好的答案!顺便说一句ggplot已经导入,scales但没有将函数添加到您的名称空间。因此,您可以在不导入的情况下将其称为scales::pretty_breaks(n = 10)

63

您可以向提供参数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))

81
无需创建自己的功能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 2014年

11
@Daniel Krizian:1)需要require(scales)2)这似乎阻止了我的休息以科学计数法出现,因此1e6更改为1000000?
smci 2014年

6
您可以pretty不使用scales包而使用基数R ,只需提供值作为参数即可。例如:(breaks=pretty(dat$x, n=10))
Molx

@smci如果ggplot2正在工作,则可以使用刻度。没有刻度,ggplot2将无法工作。
克劳斯·威尔克

5

即将发布的v3.3.0版本ggplot2将提供一个选项,n.breaks可以自动为scale_x_continuous和生成中断scale_y_continuous

    devtools::install_github("tidyverse/ggplot2")

    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)

在此处输入图片说明


4

另外,

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.