如何修改绘图中坐标轴刻度的间距?

83

我该如何更改绘图轴上刻度间距的间隔?

在使用基础绘图或 rgl 时,应该使用哪些参数?


请查看 https://stackoverflow.com/questions/34519823/minor-tick-position-in-r 以获取刻度线大小的信息。 - Ferroao
5个回答

101

base graph中,至少有两种方法可以实现这一点(我的例子是针对x轴的,但是对y轴同样适用):

  1. 使用par(xaxp = c(x1, x2, n))plot(..., xaxp = c(x1, x2, n))来定义极端刻度线的位置(x1x2)以及刻度线之间的间隔数(n)。相应地,n+1就是绘制的刻度线数量。(仅适用于不使用对数刻度尺的情况,有关对数刻度尺的行为,请参见?par。)

  2. 您可以完全取消轴的绘制,并稍后使用axis()添加刻度线。
    要取消轴的绘制,请使用plot(... , xaxt = "n")

然后使用 axis() 函数并传入 sideatlabels 参数:axis(side = 1, at = v1, labels = v2)。其中 side 指定坐标轴的位置(1 表示 x 轴,2 表示 y 轴),v1 是一个包含刻度位置信息的向量(例如,如果您的轴范围是从 0 到 6,且您需要三个刻度,则可以使用 c(1, 3, 5)),v2 是一个包含相应刻度标签的向量(必须与 v1 长度相同,例如:c("group a", "group b", "group c"))。请参考 ?axisstats.stackexchange 上的一篇我更新过的帖子中的示例

有没有办法控制R在数值刻度标签上使用多少位小数。我刚试过labels=c(0.0,0.5,1.0,1.5,2.0),但在图表中标签显示为0、0.5、1、1.5等。有没有办法让所有标签都显示相同数量的小数位数?我试过labels=round(seq(0,2,0.5),1),但整数仍然没有小数位数。 - eipi10
2
尝试使用函数formatCprettyNum来创建字符向量以传递给labels。例如:formatC(seq(0,2,0.5), digits = 1, format = "f") - Henrik
1
我已经寻找了一段时间来找到这个答案。事实证明,n 实际上是刻度标记的数量减 1。我想要从 19 的刻度标记,并且必须设置 xaxp = c(1, 9, 8) 才能得到期望的结果。 - ThomasH
对于我来说,使用par(xaxp...)不起作用。只有当我把它放在plot(xaxp...)的内部时才有效。 - Daniel Bonetti

34

使用基础绘图,最简单的方法是停止绘制坐标轴,并自行绘制。

plot(1:10, 1:10, axes = FALSE)
axis(side = 1, at = c(1,5,10))
axis(side = 2, at = c(1,3,7,10))
box()

你好我在x轴上有时间日期数据(chron) 在我的情况下,我认为最好的方法不是写一行包含25个完整日期的代码。如果我希望日期垂直地显示在x轴上,该怎么办呢?谢谢 - skan
1
请查看 ?par 中的图形参数 las,它可以添加到对 axis() 的调用中,并控制刻度标签的方向。例如:axis(side = 1, at = c(1,5,10), las = 2)。您可能想要调查是否有适用于时间序列对象的 axis() 函数,或者考虑使用 R 的日期时间类,这些类已经具有 axis() 函数(例如,类 "Date"axis.Date())。 - Gavin Simpson

7

我有一个数据集,其中时间为x轴,强度为y轴。首先需要删除除坐标轴标签以外的所有默认坐标轴:

plot(Time,Intensity,axes=F)

然后我使用以下代码重新构建图形元素:

box() # create a wrap around the points plotted
axis(labels=NA,side=1,tck=-0.015,at=c(seq(from=0,to=1000,by=100))) # labels = NA prevents the creation of the numbers and tick marks, tck is how long the tick mark is.
axis(labels=NA,side=2,tck=-0.015)
axis(lwd=0,side=1,line=-0.4,at=c(seq(from=0,to=1000,by=100))) # lwd option sets the tick mark to 0 length because tck already takes care of the mark
axis(lwd=0,line=-0.4,side=2,las=1) # las changes the direction of the number labels to horizontal instead of vertical.

因此,at = c(...) 指定了要放置刻度线的位置集合。 在这里,我想在 0、100、200、...、1000 的位置上放置标记。 seq(from =...,to =...,by =...) 允许我选择限制和增量。


3

如果您不想让R添加小数或零,可以使用...axt停止它绘制x轴或y轴或两者都不绘制。然后,您可以添加自己的刻度和标签:

plot(x, y, xaxt="n")
plot(x, y, yaxt="n")
axis(1 or 2, at=c(1, 5, 10), labels=c("First", "Second", "Third"))

当然,你可以使用变量 flagyaxt=flag 的编程方式来打开或关闭此选项。但是,诀窍在于如果你想要标准标签,则设置 flag <- "s";如果不想要标准标签,则使用 flag <- "n"。(我补充说明一下,因为我自己也花了一段时间才找到 "s") - Clem Wang

2

我刚刚发现了Hmisc包:

该包含有许多有用的函数,可用于数据分析、高级图形、实用操作、计算样本大小和功率的函数、导入和注释数据集、填充缺失值、高级表格制作、变量聚类、字符串操作、将R对象转换为LaTeX和html代码以及重新编码变量。

library(Hmisc)    
plot(...)
minor.tick(nx=10, ny=10) # make minor tick marks (without labels) every 10th

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接