Wie ändere ich die Formatierung von Zahlen auf einer Achse mit ggplot?


130

Ich verwende R und ggplot, um ein Streudiagramm einiger Daten zu zeichnen. Alles ist in Ordnung, außer dass die Zahlen auf der y-Achse mit einer Exponentenformatierung im Computerstil ausgegeben werden, dh 4e + 05, 5e + 05 usw. Dies ist offensichtlich Inakzeptabel, daher möchte ich, dass sie als 500.000, 400.000 usw. angezeigt werden. Es wäre auch akzeptabel, eine korrekte Exponentennotation zu erhalten.

Der Code für das Diagramm lautet wie folgt:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

Jede Hilfe sehr geschätzt.


30
Beschreiben Sie die ggplotStandardoptionen nicht als "offensichtlich inakzeptabel". Sie meinen, Sie haben eine persönliche Präferenz für ein anderes Format. Eine Zahl im Format 4e+05ist eine wissenschaftliche Notation und wäre die bevorzugte Formatierung in einer Vielzahl von Anwendungen.
Andrie

53
4e + 05 ist keine wissenschaftliche Notation, sondern eine Computerannäherung an die wissenschaftliche Notation. Es wäre in keinem Printjournal akzeptabel, an das ich denken kann, daher halte ich es für meine Dissertation für inakzeptabel.
Jack Aidley

Antworten:


126

Eine andere Möglichkeit besteht darin, Ihre Achsen-Tick-Beschriftungen mit Kommas zu formatieren, indem Sie das Paket verwenden scalesund hinzufügen

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

zu Ihrer ggplot-Anweisung.

Wenn Sie das Paket nicht laden möchten, verwenden Sie:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
Erstaunlich, dass solch ein triviales Problem das Laden eines neuen Pakets erfordert.
Luchonacho

Zu Ihrer Information, dies funktioniert auch mit scale_y_log10 (labels = scale :: comma), und ich gehe von anderen Skalen in ggplot2 aus. Tolle Tipps!
TheProletariat

65

Ich habe auch einen anderen Weg gefunden, der die richtige 'x10 (hochgestellte) 5'-Notation auf den Achsen ergibt. Ich poste es hier in der Hoffnung, dass es für einige nützlich sein könnte. Ich habe den Code von hier bekommen, also beanspruche ich keine Gutschrift dafür, das geht zu Recht an Brian Diggs.

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

Welche können Sie dann als verwenden

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

10
Wenn Sie nicht möchten, dass 0 als "0 x 10⁺⁰" gedruckt wird, fügen Sie unter der format(...)Zeile Folgendes hinzu:l <- gsub("0e\\+00","0",l)
semi-extrinsisch

1
Wenn Sie andere Dinge in Sonderfällen ausführen möchten, können Sie diese am einfachsten gsub()direkt nach dem hinzufügen format(), während format()Sie in einer separaten Konsole testen, was für Ihren Fall zurückgegeben wird.
semi-extrinsic

3
Fügen Sie dies vor dem letzten gsubBefehl hinzu: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)und danach:, # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)um es in dem Format zu erstellen, das normalerweise in Papieren verwendet wird.
John_West

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

Wenn ich dies versuche, erhalte ich die Fehlermeldung, dass der Formatierer ein nicht verwendetes Argument ist. Benötigt es ein anderes Paket oder so?
Jack Aidley

4
Ich habe den Code geändert, um ihn einzuschließen library(scales)und zu verwenden, commader besser funktionieren sollte als die Funktion, die ich zuvor hatte.
DiscreteCircle

16

Ich bin hier zu spät zum Spiel, aber für den Fall, dass andere eine einfache Lösung wünschen, habe ich eine Reihe von Funktionen erstellt, die wie folgt aufgerufen werden können:

 ggplot + scale_x_continuous(labels = human_gbp)

die Ihnen vom Menschen lesbare Zahlen für die x- oder y-Achse geben (oder wirklich jede Zahl im Allgemeinen).

Die Funktionen finden Sie hier: Github Repo Kopieren Sie die Funktionen einfach in Ihr Skript, damit Sie sie aufrufen können.


10

Ich finde Jack Aidleys vorgeschlagene Antwort nützlich.

Ich wollte eine andere Option ausschließen. Angenommen, Sie haben eine Reihe mit vielen kleinen Zahlen und möchten sicherstellen, dass die Achsenbeschriftungen den vollen Dezimalpunkt (z. B. 5e-05 -> 0,0005) ausschreiben. Dann:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 

22
Dies kann durch die Verwendung einer anonymen Funktion verkürzt werden: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})Warum es so einen vordefinierten Formatierer nicht gibt, weiß die Hölle.
eMPee584
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.