不需要坐标轴上的科学计数法


75

我经常使用plot命令在R中进行各种散点图。

有时两者同时出现,有时只有一个绘图轴以科学计数法标记。我不了解R何时决定转换为科学计数法。出人意料的是,它通常会打印出在标绘地块时没有理智的人会用科学记数法写的数字,例如将5标记为5e + 00。假设您的对数轴最多可以达到1000个,科学计数法对于此类“小”数字是不合理的。

我想抑制这种行为,我一直希望R显示整数值。这可能吗?

我试过了,options(scipen=10)但是它开始写5.0而不是5,而在另一轴上5仍然是5,依此类推。如何在我的R图中获得纯整数值?

我在Windows 7上使用R 2.12.1。


Answers:


55

使用options(scipen=5)或其他足够高的数字。Scipen选项确定R转换为科学计数法的可能性,值越高,转换R的可能性越小。在制作图之前,请先设置选项,如果它仍然具有科学计数法,请将其设置为更大的数字。


3
如果您确实阅读了我的原始问题,那么您会读到“我尝试了options(scipen = 10),但随后开始写5.0而不是5”。我希望数字写成5而不是5.0,依此类推。

@gojira但是您是否尝试过其他值scipen?你尝试了scipen=5吗?
马雷克(Marek)

您是对的,我想念您已经尝试过了。其他人指出,您可以使用axis函数通过format,sprintf和pretty之类的函数将所需的内容准确地放置在所需的位置。
格雷格·斯诺

19

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

对于整数,请尝试

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

如果数字可以转换为实际整数(即,不要太大),则也可以使用

formatC(x, format = "d")

如何将标签粘贴到轴上取决于您使用的绘图系统。


1
这并不是特别有用,因为OP已经声明他们正在使用plot()
Peter Ellis

@PeterEllis它没有帮助吗?如果使用plot土特产品拿到过轴控制,看到在这个线程对方的回答:stackoverflow.com/a/5968136/168747(与线开始axis(
马立克

12

您可以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:也可以使用,但是使用格式的想法是您可以为位置和标签提供一个向量。您可以在不同的图中重用该对象。我调整了代码以表明这一点。
乔里斯·梅斯

在rstudio中,如果导入数据集并进行train_sample_10k = format(train_sample_10k,scientific = FALSE)并重新加载,它将更改科学计数法。
mixdev 2014年

@mixdev显然。如果选中?format,则会看到它返回带有符号的字符串。如果重新加载,则会用原始值覆盖字符串。format()没有设置格式属性,它生成文本。因此,该参数用作论点的值labels
Joris Meys 2014年

1
scientific = FALSE在😭format(x, scientific = FALSE, trim = TRUE, big.mark = ',')是改变生活的人之前,我怎么从未见过此答案/文档的一部分
MichaelChirico

11

尝试这个。我故意弄坏了各个部分,以便您可以四处移动。

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

在此处输入图片说明


4

您可以尝试点阵

require(lattice)
x <- 1:100000
y <- 1:100000
xyplot(y~x, scales=list(x = list(log = 10)), type="l")

在此处输入图片说明


2

R graphics程序包具有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'))

函数中还有一个log参数,axTicks但是在这种情况下,无需设置该参数即可获取正确的对数轴刻度位置。


-2

通常,设置变量的轴极限@ max就足够了

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

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

不,不是,您的答案也不会去解释这将如何产生影响。
布拉德·所罗门
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.