it-swarm.com.de

Ich möchte keine wissenschaftliche Notation auf der Plotachse

Ich mache regelmäßig alle Arten von Streudiagrammen in R mit dem Befehl plot.

Manchmal sind beide, manchmal nur eine der Plotachsen in wissenschaftlicher Notation beschriftet. Ich verstehe nicht, wann R die Entscheidung trifft, zur wissenschaftlichen Notation zu wechseln. Überraschenderweise druckt es oft Zahlen, die kein vernünftiger Mensch in wissenschaftlicher Notation schreiben würde, wenn er eine Zeichnung beschriftet, beispielsweise 5 als 5e + 00. Nehmen wir an, Sie haben eine Log-Achse, die bis zu 1000 reicht. Die wissenschaftliche Notation ist bei solchen "kleinen" Zahlen nicht gerechtfertigt.

Ich möchte dieses Verhalten unterdrücken, ich möchte immer, dass R ganzzahlige Werte anzeigt. Ist das möglich?

Ich habe options(scipen=10) ausprobiert, aber dann schreibt es 5.0 statt 5, während auf der anderen Achse 5 noch 5 ist. Wie kann ich in meinen R-Plots reine Integer-Werte haben?

Ich verwende R 2.12.1 unter Windows 7.

61
user438602

Verwenden Sie options(scipen=5) oder eine andere ausreichend hohe Zahl. Die Scipen-Option legt fest, wie wahrscheinlich es ist, dass R in die wissenschaftliche Notation wechselt. Je höher der Wert, desto geringer ist die Wahrscheinlichkeit, dass R wechselt. Legen Sie die Option fest, bevor Sie Ihre Zeichnung erstellen, wenn sie noch über wissenschaftliche Notation verfügt, legen Sie eine höhere Zahl fest.

44
Greg Snow

Sie können format oder formatC verwenden, um Ihre Achsenbeschriftungen zu formatieren.

Versuchen Sie es für ganze Zahlen

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

Wenn die Zahlen in tatsächliche Ganzzahlen konvertiert werden können (d. H. Nicht zu groß), können Sie auch verwenden

formatC(x, format = "d")

Wie Sie die Etiketten auf Ihre Achse bringen, hängt von dem verwendeten Plotsystem ab.

16
Richie Cotton

Versuche dies. Ich habe absichtlich verschiedene Teile herausgebrochen, damit Sie Dinge bewegen können.

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

enter image description here

11
bill_080

Sie können dazu den Befehl axis() verwenden, zB:

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)

gibt:

enter image description here

BEARBEITEN: Wenn Sie alle im gleichen Format haben möchten, können Sie die Lösung von @Richie verwenden, um sie zu erhalten:

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))
11
Joris Meys

Sie könnten versuchen, Gitter :

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

enter image description here

4
Marek

Das Paket Rgraphics hat die Funktion axTicks, die die Tick-Positionen der Ticks zurückgibt, die von den Funktionen axis und plot automatisch festgelegt würden. Die anderen Antworten auf diese Frage definieren die Tick-Positionen manuell, was in einigen Situationen möglicherweise nicht bequem ist.

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

Ein minimales Beispiel wäre

plot(10^(0:10), 0:10, log = 'x', xaxt = 'n')
myTicks = axTicks(1)
axis(1, at = myTicks, labels = formatC(myTicks, format = 'd'))

Es gibt auch einen log-Parameter in der axTicks-Funktion, aber in dieser Situation muss er nicht festgelegt werden, um die korrekte Position der logarithmischen Achse zu ermitteln.

0
daniel.neumann