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.


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)

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) 

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)

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.


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) 

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.