Ich möchte keine wissenschaftliche Notation auf der Plotachse

75

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

Manchmal beide, manchmal nur eine der Plotachsen in wissenschaftlicher Notation. Ich verstehe nicht, wann R die Entscheidung trifft, zur wissenschaftlichen Notation zu wechseln. Überraschenderweise werden häufig Zahlen gedruckt, die kein vernünftiger Mensch in wissenschaftlicher Notation schreiben würde, wenn ein Plot beschriftet wird, beispielsweise 5 als 5e + 00. Nehmen wir an, Sie haben eine Log-Achse von bis zu 1000, die wissenschaftliche Notation ist mit solch "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 es versucht, options(scipen=10)aber dann beginnt es, 5,0 anstelle von 5 zu schreiben, während auf der anderen Achse 5 immer noch 5 usw. ist. Wie kann ich reine Ganzzahlwerte in meinen R-Plots haben?

Ich verwende R 2.12.1 unter Windows 7.

Marek
quelle
Weitere Hinweise zum Formatieren von Zahlen finden Sie unter stackoverflow.com/questions/5812493/…
Richie Cotton

Antworten:

55

Verwenden Sie options(scipen=5)oder eine andere ausreichend hohe Zahl. Die Option scipen bestimmt, wie wahrscheinlich es ist, dass R in die wissenschaftliche Notation wechselt. Je höher der Wert, desto weniger wahrscheinlich ist es, dass es wechselt. Stellen Sie die Option vor dem Erstellen Ihres Diagramms ein. Wenn die wissenschaftliche Notation noch vorhanden ist, setzen Sie sie auf eine höhere Zahl.

Greg Snow
quelle
3
Wenn Sie meine ursprüngliche Frage tatsächlich gelesen hätten, hätten Sie gelesen, dass "ich Optionen ausprobiert habe (scipen = 10), aber dann beginnt es, 5.0 statt 5 zu schreiben". Und dass ich Zahlen als 5 schreiben möchte, nicht als 5.0 und so weiter.
@gojira Aber hast du andere Werte von ausprobiert scipen? Hast du es versucht scipen=5?
Marek
Sie haben Recht, ich habe vermisst, dass Sie das bereits versucht hatten. Andere haben darauf hingewiesen, dass Sie die Achsenfunktion verwenden können, um mit Funktionen wie Format, Sprintf und Pretty genau das zu platzieren, was Sie möchten.
Greg Snow
19

Sie können Ihre Achsenbeschriftungen verwenden formatoder formatCähm formatieren.

Versuchen Sie es mit ganzen Zahlen

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

Wenn die Zahlen in tatsächliche Ganzzahlen konvertierbar sind (dh nicht zu groß), können Sie auch verwenden

formatC(x, format = "d")

Wie Sie die Beschriftungen auf Ihre Achse bringen, hängt vom verwendeten Plotsystem ab.

Richie Cotton
quelle
1
Dies ist nicht besonders hilfreich, da das OP bereits angegeben hat, dass sie verwendenplot()
Peter Ellis
@ PeterEllis Wie ist es nicht hilfreich? Wenn Sie die plotKontrolle über die Achse haben, lesen Sie die andere Antwort in diesem Thread: stackoverflow.com/a/5968136/168747 (Zeile beginnt mit axis(.
Marek
12

Sie können dafür den axis()Befehl verwenden, z.

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:

Geben Sie hier die Bildbeschreibung ein

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))
Joris Meys
quelle
Ich hatte gerade die Idee, Achsen und Zeichenfolgen anstelle von Zahlen zu verwenden, um "reine Ganzzahlen" zu erhalten (dh die Zahlen zu zitieren)?
Henrik
@Henrik: funktioniert auch, aber die Idee bei der Verwendung des Formats ist, dass Sie einen Vektor für Position und Beschriftung angeben können. Und Sie können dieses in verschiedenen Plots wiederverwenden. Ich habe meinen Code angepasst, um das zu zeigen.
Joris Meys
Wenn Sie in rstudio ein Dataset importieren und train_sample_10k = format (train_sample_10k, Scientific = FALSE) ausführen und neu laden, werden die wissenschaftlichen Notationen geändert.
Mixdev
@mixdev Offensichtlich. Wenn Sie überprüfen ?format, sehen Sie, dass eine Zeichenfolge mit den Notationen zurückgegeben wird. Wenn Sie neu laden, überschreiben Sie die Zeichenfolge mit den ursprünglichen Werten. format()setzt kein Formatattribut, sondern generiert Text. Daher die Verwendung als Wert für das Argumentlabels
Joris Meys
1
Wie habe ich den scientific = FALSETeil dieser Antwort / der Dokumentation noch nie gesehen ? 😭 format(x, scientific = FALSE, trim = TRUE, big.mark = ',')ist ein Lebensveränderer
MichaelChirico
11

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

Geben Sie hier die Bildbeschreibung ein

bill_080
quelle
4

Sie könnten Gitter versuchen :

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

Geben Sie hier die Bildbeschreibung ein

Marek
quelle
2

Das R graphicsPaket verfügt über die Funktion axTicks, die die Tick-Positionen der Ticks zurückgibt, die die Funktionen axisund plotautomatisch setzen würden. Die anderen Antworten auf diese Frage definieren die Häkchenpositionen 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 logParameter in der axTicksFunktion, aber in dieser Situation muss er nicht eingestellt werden, um die richtige Position der logarithmischen Achse zu erhalten.

daniel.heydebreck
quelle
-2

Normalerweise reicht es aus, die Achsgrenze @ max Ihrer Variablen einzustellen

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

plot(a, b, ylim = c(0, max(b)))
user2835629
quelle
Nein, das ist es nicht, und Ihre Antwort erklärt nicht, wie sich dies auswirken würde.
Brad Solomon