Como altero a formatação de números em um eixo com ggplot?

131

Estou usando R e ggplot para desenhar um gráfico de dispersão de alguns dados, tudo está bem, exceto que os números no eixo y estão saindo com formatação de expoente no estilo de computador, ou seja, 4e + 05, 5e + 05, etc. Isso é obviamente inaceitável, por isso, quero exibi-los como 500.000, 400.000 e assim por diante. Obter uma notação de expoente adequada também seria aceitável.

O código para o gráfico é o seguinte:

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

Qualquer ajuda muito apreciada.

Jack Aidley
fonte
30
Tenha cuidado ao descrever ggplotas opções padrão como "obviamente inaceitáveis". Você quer dizer que você tem uma preferência pessoal por um formato diferente. Um número no formato 4e+05é notação científica e seria a formatação preferida em uma ampla variedade de aplicações.
Andrie
53
4e + 05 não é uma notação científica, é uma aproximação por computador à notação científica. Não seria aceitável em nenhum periódico impresso em que eu pudesse pensar, por isso considero inaceitável para a minha dissertação.
22812 Jack Aidley

Respostas:

126

Outra opção é formatar os rótulos dos marcadores do eixo com vírgulas, usando o pacote scalese adicione

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

à sua instrução ggplot.

Se você não deseja carregar o pacote, use:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
Jim M.
fonte
9
Surpreendente que um problema tão trivial exija o carregamento de um novo pacote.
Luchonacho
Para sua informação, isso também funciona com scale_y_log10 (labels = scale :: vírgula), e estou assumindo outras escalas no ggplot2. Ótimas dicas!
TheProletariat 19/09/17
66

Eu também encontrei outra maneira de fazer isso que fornece a notação 'x10 (sobrescrita) 5' adequada nos eixos. Estou postando aqui na esperança de que possa ser útil para alguns. Eu peguei o código aqui e, portanto, não reivindico crédito por isso, que é o 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)
}

Que você pode usar como

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 
Jack Aidley
fonte
10
Se você não quiser que 0 seja impresso como "0 x 10", adicione o seguinte abaixo da format(...)linha:l <- gsub("0e\\+00","0",l)
semi-extrínseco
1
Se você deseja especializar outras coisas, é mais fácil adicionar mais gsub()diretamente após o format()teste, enquanto testa o que format()retorna para o seu caso em um console separado.
semi-extrínseco
3
adicione isto antes do último gsubcomando: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)e depois: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)para torná-lo no formato geralmente usado em papéis.
John_West 23/02
44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)
DiscreteCircle
fonte
Quando tento isso, recebo um erro que o formatador é um argumento não utilizado? Precisa de outro pacote ou algo assim?
Jack Aidley
4
Alterei o código para incluir library(scales)e usar o commaque deve funcionar melhor do que a função que eu tinha antes.
DiscreteCircle
16

Estou atrasado para o jogo aqui, mas, caso outros desejem uma solução fácil, criei um conjunto de funções que podem ser chamadas como:

 ggplot + scale_x_continuous(labels = human_gbp)

que fornece números legíveis para humanos para os eixos x ou y (ou qualquer outro número em geral).

Você pode encontrar as funções aqui: Github Repo Basta copiar as funções no seu script para poder chamá-las.

Feargal Ryan
fonte
10

Acho a resposta sugerida por Jack Aidley útil.

Eu queria jogar fora outra opção. Suponha que você tenha uma série com muitos números pequenos e deseje garantir que os rótulos dos eixos escrevam o ponto decimal completo (por exemplo, 5e-05 -> 0,0005) e, em seguida:

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
fonte
23
Isso pode ser reduzido usando uma função anônima: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})por que não existe um formatador predefinido como esse, o inferno sabe.
precisa saber é o seguinte