不想在图表轴上显示科学计数法

85

我经常使用R中的plot命令制作各种散点图。

有时候,坐标轴上可能会出现科学计数法的标签,但我不知道R是如何决定是否要采用科学计数法的。有时候R会将一些本来不应该用科学计数法表示的数字进行转换,例如5被标记为5e+00。假设你的对数坐标轴最大值为1000,在这样“小”的数字上使用科学计数法是不合适的。

我希望能够避免这种情况,始终只显示整数值。这个有可能实现吗?

我尝试了options(scipen=10),但这会使得5变成5.0,而在另一个坐标轴上5仍然是5等等。请问该如何实现纯整数值的R图形呢?

我使用的操作系统是Windows 7,R版本是2.12.1。


在 https://dev59.com/pm025IYBdhLWcg3wwo2l#5816779 上有更多关于格式化数字的建议。 - Richie Cotton
7个回答

61

使用options(scipen=5)或其他高的数值。scipen选项决定R是否转换为科学计数法的可能性,数值越高,转换的可能性越小。 在绘制图表之前设置该选项,如果仍然使用科学计数法,请将其设置为更高的数字。


4
如果您实际上读了我的原始问题,您会发现我写道:“我尝试了options(scipen=10),但它开始写入5.0而不是5”。而且我希望数字写成5而不是5.0等等。 - user438602
@gojira 但是你尝试过其他的scipen值吗?你试过scipen=5吗? - Marek
你是对的,我错过了你已经尝试过那个。其他人指出,你可以使用axis函数来使用format、sprintf和pretty等函数将你想要的内容放在你想要的位置。 - Greg Snow

19

您可以使用 formatformatC 来格式化坐标轴标签。

对于整数,尝试使用

x <- 10 ^ (1:10)
format(x, scientific = FALSE)
formatC(x, digits = 0, format = "f")

如果这些数字可以转换为实际的整数(即不太大),你还可以使用以下方法:

formatC(x, format = "d")

如何在坐标轴上添加标签取决于您使用的绘图系统。


1
这并不是特别有帮助,因为原帖已经说明他们正在使用 plot() - Peter Ellis
@PeterEllis 这怎么不有用呢?如果使用 plot,你可以控制坐标轴,请参见此线程中的其他答案:https://dev59.com/lm025IYBdhLWcg3whGSx#5968136(以 axis( 开头的行)。 - Marek

14

试试这个。我特意将各个部分分开,这样你就可以移动它们。

library(sfsmisc)

#Generate the data
x <- 1:100000
y <- 1:100000

#Setup the plot area
par(pty="m", plt=c(0.1, 1, 0.1, 1), omd=c(0.1,0.9,0.1,0.9))

#Plot a blank graph without completing the x or y axis
plot(x, y, type = "n", xaxt = "n", yaxt="n", xlab="", ylab="", log = "x", col="blue")
mtext(side=3, text="Test Plot", line=1.2, cex=1.5)

#Complete the x axis
eaxis(1, padj=-0.5, cex.axis=0.8)
mtext(side=1, text="x", line=2.5)

#Complete the y axis and add the grid
aty <- seq(par("yaxp")[1], par("yaxp")[2], (par("yaxp")[2] - par("yaxp")[1])/par("yaxp")[3])
axis(2, at=aty, labels=format(aty, scientific=FALSE), hadj=0.9, cex.axis=0.8, las=2)
mtext(side=2, text="y", line=4.5)
grid()

#Add the line last so it will be on top of the grid
lines(x, y, col="blue")

输入图像描述


13
你可以使用axis()命令来实现,例如:
x <- 1:100000
y <- 1:100000
marks <- c(0,20000,40000,60000,80000,100000)
plot(x,y,log="x",yaxt="n",type="l")
axis(2,at=marks,labels=marks)

提供:

在此输入图片描述

编辑:如果您想要将它们全部格式化为相同的格式,可以使用@Richie的解决方案获取它们:

x <- 1:100000
y <- 1:100000
format(y,scientific=FALSE)
plot(x,y,log="x",yaxt="n",type="l")
axis(2,at=marks,labels=format(marks,scientific=FALSE))

我刚想到一个使用轴和字符串而不是数字来获取“纯整数”的想法(即引用数字)。 - Henrik
@Henrik:这样也可以,但使用格式化的想法是您可以为位置和标签提供一个向量。而且您可以在不同的图中重复使用它。我调整了我的代码来展示这一点。 - Joris Meys
在RStudio中,如果您导入数据集并执行以下操作: train_sample_10k = format(train_sample_10k,scientific=FALSE) 然后重新加载,它将更改科学计数法。 - mixdev
@mixdev 显然。如果您查看?format,您会发现它返回一个带有注释的字符字符串。如果您重新加载,您将用原始值覆盖字符字符串。 format()不设置某些格式属性,而是生成文本。因此,将其用作参数labels的值。 - Joris Meys
1
我以前怎么从来没有看到过这个答案/文档中的 scientific = FALSE 部分呢?format(x, scientific = FALSE, trim = TRUE, big.mark = ',') 真是改变生活的好东西。 - MichaelChirico

4
你可以尝试使用 lattice 包:
require(lattice)
x <- 1:100000
y <- 1:100000
xyplot(y~x, scales=list(x = list(log = 10)), type="l")

enter image description here


2
< p > R 图形 包有一个名为 axTicks 的函数,它返回 axisplot 函数自动设置的刻度位置。本问题中给出的其他答案手动定义刻度位置,在某些情况下可能不方便。

myTicks = axTicks(1)
axis(1, at = myTicks, labels = formatC(myTicks, format = 'd'))

一个简单的例子如下:
plot(10^(0:10), 0:10, log = 'x', xaxt = 'n')
myTicks = axTicks(1)
axis(1, at = myTicks, labels = formatC(myTicks, format = 'd'))

axTicks 函数中也有一个 log 参数,但在这种情况下,它不需要设置即可获得正确的对数轴刻度位置。


-3

通常将轴限制设置为变量的最大值就足够了

a <- c(0:1000000)
b <- c(0:1000000)

plot(a, b, ylim = c(0, max(b)))

不是这样的,而且你的回答也没有解释这会有任何影响。 - Brad Solomon

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