Bagaimana cara mengubah format angka pada sumbu dengan ggplot?

131

Saya menggunakan R dan ggplot untuk menggambar sebar data, semua baik-baik saja kecuali bahwa angka pada sumbu y keluar dengan format eksponen gaya komputer, yaitu 4e + 05, 5e + 05, dll. Ini jelas tidak dapat diterima, jadi saya ingin menampilkannya sebagai 500.000, 400.000, dan sebagainya. Mendapatkan notasi eksponen yang tepat juga dapat diterima.

Kode untuk plot adalah sebagai berikut:

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

Setiap bantuan sangat dihargai.

Jack Aidley
sumber
30
Hati-hati dalam mendeskripsikan ggplotopsi default sebagai "jelas tidak dapat diterima". Maksud Anda, Anda memiliki preferensi pribadi untuk format yang berbeda. Angka dalam format 4e+05adalah notasi ilmiah, dan akan menjadi format yang disukai dalam berbagai aplikasi.
Andrie
53
4e + 05 bukan notasi ilmiah, ini adalah perkiraan komputer untuk notasi ilmiah. Itu tidak akan diterima dalam jurnal cetak apa pun yang dapat saya pikirkan, jadi saya menganggapnya tidak dapat diterima untuk disertasi saya.
Jack Aidley

Jawaban:

126

Pilihan lain adalah memformat label centang sumbu Anda dengan koma adalah dengan menggunakan paket scales, dan tambahkan

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

untuk pernyataan ggplot Anda.

Jika Anda tidak ingin memuat paket, gunakan:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
Jim M.
sumber
9
Luar biasa bahwa masalah sepele seperti itu perlu memuat paket baru.
luchonacho
FYI, ini juga berfungsi dengan scale_y_log10 (label = skala :: koma), dan saya mengasumsikan skala lain di ggplot2. Tips hebat!
TheProletariat
66

Saya juga menemukan cara lain untuk melakukan ini yang memberikan notasi 'x10 (superscript) 5' yang tepat pada sumbu. Saya mempostingnya di sini dengan harapan mungkin bermanfaat bagi sebagian orang. Saya mendapat kode dari sini jadi saya mengklaim tidak ada kredit untuk itu, yang benar berlaku untuk 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)
}

Yang kemudian dapat Anda gunakan sebagai

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 
Jack Aidley
sumber
10
Jika Anda tidak ingin 0 dicetak sebagai "0 x 10⁺⁰", tambahkan baris berikut di bawah ini format(...):l <- gsub("0e\\+00","0",l)
semi-ekstrinsik
1
Jika Anda ingin membuat case khusus untuk hal-hal lain, akan lebih mudah untuk menambahkan lebih banyak gsub()secara langsung setelah format(), sambil menguji apa yang format()mengembalikan case Anda di konsol terpisah.
semi-ekstrinsik
3
tambahkan ini sebelum gsubperintah terakhir : # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)dan setelahnya: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)untuk membuatnya dalam format yang biasanya digunakan dalam kertas.
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
sumber
Ketika saya mencoba ini saya mendapatkan kesalahan bahwa formatter adalah argumen yang tidak digunakan? Apakah perlu paket lain atau sesuatu?
Jack Aidley
4
Saya mengubah kode untuk memasukkan library(scales)dan menggunakan commayang seharusnya berfungsi lebih baik daripada fungsi yang saya miliki sebelumnya.
DiscreteCircle
16

Saya terlambat ke permainan di sini, tetapi kalau-kalau ada yang ingin solusi mudah, saya membuat satu set fungsi yang bisa disebut seperti:

 ggplot + scale_x_continuous(labels = human_gbp)

yang memberi Anda angka yang dapat dibaca manusia untuk sumbu x atau y (atau angka apa pun secara umum sebenarnya).

Anda dapat menemukan fungsinya di sini: Github Repo Cukup salin fungsi ke skrip Anda sehingga Anda dapat memanggilnya.

Ryan Feargal
sumber
10

Saya menemukan jawaban yang disarankan Jack Aidley adalah yang bermanfaat.

Saya ingin membuang opsi lain. Misalkan Anda memiliki seri dengan banyak angka kecil, dan Anda ingin memastikan label sumbu menuliskan titik desimal penuh (mis. 5e-05 -> 0,0005), maka:

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
sumber
23
Ini dapat disingkat dengan menggunakan fungsi anonim: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})Mengapa tidak ada formatter yang sudah ditentukan sebelumnya seperti itu, neraka tahu.
eMPee584