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.

Jack Aidley
quelle
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)
Jim M.
quelle
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) 
Jack Aidley
quelle
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)
DiscreteCircle
quelle
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.

Feargal Ryan
quelle
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) 
EconomiCurtis
quelle
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