ggplot을 사용하여 축의 숫자 형식을 어떻게 변경합니까?


131

R과 ggplot을 사용하여 일부 데이터의 산점도를 그리려고합니다 .y 축의 숫자가 컴퓨터 스타일 지수 형식 (예 : 4e + 05, 5e + 05)으로 나오는 것을 제외하고는 모두 좋습니다. 받아 들일 수 없으므로 500,000, 400,000 등으로 표시하고 싶습니다. 적절한 지수 표기법을 얻는 것도 가능합니다.

플롯의 코드는 다음과 같습니다.

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

도움을 주시면 감사하겠습니다.


30
ggplot기본 옵션을 "분명히 받아 들일 수없는"것으로 설명하는 데주의하십시오 . 당신은 다른 형식을 선호 합니다. 형식의 숫자 4e+05는 과학적 표기법이며 다양한 응용 프로그램에서 선호되는 형식입니다.
Andrie

53
4e + 05는 과학적 표기법이 아니며 과학적 표기법에 대한 컴퓨터 근사치입니다. 내가 생각할 수있는 어떤 인쇄 일지에서는 받아 들여지지 않을 것이기 때문에 나는 논문에 받아 들일 수 없다고 생각한다.
Jack Aidley

답변:


126

또 다른 옵션은 쉼표로 축 눈금 레이블의 형식을 패키지를 사용하는 것입니다 scales, 그리고 추가

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

ggplot 문에.

패키지를로드하지 않으려면 다음을 사용하십시오.

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

9
이러한 사소한 문제로 인해 새 패키지를로드해야한다는 점이 놀랍습니다.
luchonacho

참고로, scale_y_log10 (labels = scales :: comma)에서도 작동하며 ggplot2의 다른 스케일을 가정합니다. 좋은 팁!
프롤레타리아

66

또한 축에 적절한 'x10 (superscript) 5'표기법을 제공하는 다른 방법을 찾았습니다. 나는 그것이 일부 사람들에게 유용 할 수 있기를 희망하여 여기에 게시하고 있습니다. 여기 에서 코드를 얻었 으므로 아무런 크레딧도 요구하지 않습니다. 바로 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)
}

다음으로 사용할 수있는

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

10
0을하지 않으려면 "0 X 10⁺⁰"는 아래에 다음을 추가로 인쇄 할 format(...)라인 :l <- gsub("0e\\+00","0",l)
반 외부

1
다른 경우를 특수하게 처리 gsub()하려면 별도의 콘솔에서 사례에 대한 수익을 format()테스트하는 동안 을 추가 한 후 바로 추가하는 것이 가장 쉽습니다 format().
semi-exrinsic

3
마지막 gsub명령 이전 # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)과 이후에 이것을 추가 하십시오 : # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)논문에서 일반적으로 사용되는 형식으로 만드십시오.
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)

이것을 시도하면 포맷터가 사용되지 않는 인수라는 오류가 발생합니까? 다른 패키지가 필요합니까?
Jack Aidley

4
코드를 변경하여 이전보다 더 잘 작동 하는 코드를 library(scales)사용했습니다 comma.
DiscreteCircle

16

나는 여기 게임에 늦었지만 다른 사람들이 쉬운 해결책을 원한다면 다음과 같이 호출 할 수있는 일련의 기능을 만들었습니다.

 ggplot + scale_x_continuous(labels = human_gbp)

x 또는 y 축에 대해 사람이 읽을 수있는 숫자 (또는 일반적으로 실제로는 임의의 숫자)를 제공합니다.

여기에서 함수를 찾을 수 있습니다. Github Repo 함수를 스크립트에 복사하여 호출 할 수 있습니다.


10

Jack Aidley가 제안한 답변이 유용한 답변이라는 것을 알았습니다.

다른 옵션을 버리고 싶었습니다. 작은 숫자가 많은 계열이 있고 축 레이블에 소수점을 완전히 쓰도록 (예 : 5e-05-> 0.0005) 가정합니다.

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
익명 함수를 사용하면이를 단축 할 수 있습니다. scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})사전 정의 된 포맷터가없는 이유는 무엇입니까?
eMPee584
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.