Bir eksendeki sayıların biçimlendirmesini ggplot ile nasıl değiştiririm?


131

Bazı verilerin dağılım grafiğini çizmek için R ve ggplot kullanıyorum, y eksenindeki sayıların bilgisayar tarzı üs biçimlendirmesiyle çıkması dışında her şey yolunda, yani 4e + 05, 5e + 05, vb. Bu açıkça. kabul edilemez, bu yüzden onları 500.000, 400.000 vb. olarak göstermesini istiyorum. Uygun bir üs gösterimi elde etmek de kabul edilebilir.

Arsa kodu aşağıdaki gibidir:

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

Herhangi bir yardım çok takdir edilir.


30
ggplotVarsayılan seçenekleri "açıkça kabul edilemez" olarak tanımlarken dikkatli olun . Farklı bir format için kişisel bir tercihiniz olduğunu söylüyorsunuz . Biçimdeki bir sayı 4e+05bilimsel gösterimdir ve çok çeşitli uygulamalarda tercih edilen biçimlendirme olacaktır.
Andrie

53
4e + 05 bilimsel gösterim değildir, bilimsel gösterime bilgisayar yaklaşımıdır. Aklıma gelen hiçbir basılı dergide kabul edilemez, bu yüzden tezim için kabul edilemez buluyorum.
Jack Aidley

Yanıtlar:


126

Diğer bir seçenek de, eksen onay etiketlerinizi virgülle biçimlendirmek, paketi kullanmak scalesve

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

ggplot ifadenize.

Paketi yüklemek istemiyorsanız, şunu kullanın:

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

9
Bu kadar önemsiz bir sorunun yeni bir paket yüklemeyi gerektirmesi şaşırtıcı.
luchonacho

Bilginize, bu aynı zamanda scale_y_log10 (etiketler = ölçekler :: virgül) ile de çalışır ve ggplot2'deki diğer ölçekleri varsayıyorum. Harika ipuçları!
TheProletariat

66

Eksenler üzerinde uygun 'x10 (üst simge) 5' gösterimi veren başka bir yöntem de buldum. Bazıları için yararlı olabileceği umuduyla buraya gönderiyorum. Kodu buradan aldım, bu yüzden haklı olarak Brian Diggs'e ait.

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

Daha sonra hangisini kullanabilirsiniz

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

10
0'ın "0 x 10⁺⁰" olarak yazdırılmasını istemiyorsanız, aşağıdakini format(...)satırın altına ekleyin :l <- gsub("0e\\+00","0",l)
yarı-dışsal

1
Başka şeyleri özel olarak belirtmek istiyorsanız, vakanız için neyin geri döndüğünü ayrı bir konsolda test ederken, gsub()doğrudan sonra daha fazla eklemek en kolay yoldur . format()format()
yarı dışsal

3
bunu son gsubkomuttan önce ekleyin : # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)ve ondan sonra: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)genellikle kağıtlarda kullanılan biçimde yapmak için.
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)

Bunu denediğimde, formatlayıcının kullanılmayan bir argüman olduğuna dair bir hata alıyorum? Başka bir pakete falan mı ihtiyacı var?
Jack Aidley

4
Daha önce sahip olduğum işlevden daha iyi çalışması gereken kodu içerecek library(scales)ve kullanacak şekilde değiştirdim comma.
DiscreteCircle

16

Burada oyuna geç kaldım, ancak başkalarının kolay bir çözüm istemesi durumunda, şöyle adlandırılabilecek bir dizi işlev oluşturdum:

 ggplot + scale_x_continuous(labels = human_gbp)

size x veya y eksenleri için insan tarafından okunabilir sayılar (veya genel olarak herhangi bir sayı) verir.

Fonksiyonları burada bulabilirsiniz: Github Repo Fonksiyonları betiğinize kopyalayın, böylece onları çağırabilirsiniz.


10

Jack Aidley'in önerdiği cevabı faydalı buluyorum.

Başka bir seçenek atmak istedim. Çok sayıda küçük sayı içeren bir seriniz olduğunu ve eksen etiketlerinin tam ondalık noktayı yazdığından emin olmak istediğinizi varsayalım (örneğin 5e-05 -> 0.0005), sonra:

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
Bu, anonim bir işlev kullanılarak kısaltılabilir: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})Neden böyle önceden tanımlanmış bir biçimlendirici yok, cehennem bilir.
eMPee584
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.