ggplot2를 사용하여 축에 정수 값만 표시하는 방법


87

다음 플롯이 있습니다.

library(reshape)
library(ggplot2)
library(gridExtra)
require(ggplot2)



data2<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(15L, 11L, 29L, 42L, 0L, 5L, 21L, 
22L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
p <- ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15))


data3<-structure(list(IR = structure(c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L
), .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L), .Label = c("Real queens", "Simulated individuals"
), class = "factor"), value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L, 
4L), Legend = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Real queens", 
"Simulated individuals"), class = "factor")), .Names = c("IR", 
"variable", "value", "Legend"), row.names = c(NA, -8L), class = "data.frame")
q<- ggplot(data3, aes(x =factor(IR), y = value, fill = Legend, width=.15))


##the plot##
q + geom_bar(position='dodge', colour='black') + ylab('Frequency') + xlab('IR')+scale_fill_grey() +theme(axis.text.x=element_text(colour="black"), axis.text.y=element_text(colour="Black"))+ opts(title='', panel.grid.major = theme_blank(),panel.grid.minor = theme_blank(),panel.border = theme_blank(),panel.background = theme_blank(), axis.ticks.x = theme_blank())

y 축에 정수만 표시하고 싶습니다. 이것이 반올림을 통해 수행되는지 또는 더 우아한 방법을 통해 수행되는지 여부는 나에게별로 중요하지 않습니다.


2
스케일 함수를 살펴본 적이 있습니까? scale_y_continuous아마도?
joran

비슷한 질문에 대한 몇 가지 답변을 읽었고 scale_y_continuous가 다른 숫자 형식 (예 : 과학적 표기법)에서 변환 된 인상을 받았지만 내가 찾고 있던 실수를 정수로 변환하지 못했습니다. 나는 ... 오해 수 있습니다
Atticus29

답변:


41

scale_y_continuous()및 인수 breaks=를 사용 하여 y 축의 중단 점을 표시하려는 정수로 설정할 수 있습니다.

ggplot(data2, aes(x =factor(IR), y = value, fill = Legend, width=.15)) +
    geom_bar(position='dodge', colour='black')+
    scale_y_continuous(breaks=c(1,3,7,10))

41
이 솔루션은 축에있는 값을 알고있는 상황에만 유용합니다. 좋은 일반적인 솔루션이 아닙니다.
swolf

3
후손을위한 참고 사항 : geom_bar더 이상 y 미학에서 작동하지 않습니다 (으로 대체 geom_col). 그리고 일반적인 해결책은 아니지만이 예제에서 특정 n으로 pretty를 호출하면 원래 문제를 해결할 수 있습니다 (하드 코딩 중단보다 더 유연함). q + geom_col(position='dodge', colour='black') + xlab('IR')+scale_fill_grey() + theme_bw() + scale_y_continuous('Frequency', breaks=function(x) pretty(x, n=6))
helmingstay 19

72

scales패키지 가 있으면 pretty_breaks()수동으로 구분을 지정하지 않고도 사용할 수 있습니다 .

q + geom_bar(position='dodge', colour='black') + 
scale_y_continuous(breaks= pretty_breaks())

17
이것은 기본 방법이하는 일을 거의하는 것처럼 보였고 여전히 나누기에 소수점이있었습니다.
kory

어디 pretty_breaks()에서 왔습니까?
Marian


11
pretty_breaks()예쁘지 만 항상 정수는 아닙니다. 분명히 소수의 아름다움이 있습니다 ...
PatrickT

50

이것이 내가 사용하는 것입니다.

ggplot(data3, aes(x = factor(IR), y = value, fill = Legend, width = .15)) +
  geom_col(position = 'dodge', colour = 'black') + 
  scale_y_continuous(breaks = function(x) unique(floor(pretty(seq(0, (max(x) + 1) * 1.1)))))

17

사용자 지정 레이 블러를 사용할 수 있습니다. 예를 들어이 함수는 정수 나누기 만 생성하도록 보장합니다.

int_breaks <- function(x, n = 5) {
  l <- pretty(x, n)
  l[abs(l %% 1) < .Machine$double.eps ^ 0.5] 
}

로 사용

+ scale_y_continuous(breaks = int_breaks)

기본 중단을 취하고 정수인 중단 만 유지하여 작동합니다. 데이터 휴식 시간이 너무 적 으면을 늘리십시오 n. 예 :

+ scale_y_continuous(breaks = function(x) int_breaks(x, n = 10))

이로 인해 0-1.25의 데이터 만 있거나 무엇을 가지고있는 경우 정수 1을 잃게됩니다. x 축에는 0 만 표시됩니다.
kory

1
나는 단순함을 위해 이것을 좋아합니다. 참고 n귀하의 값 범위에 따라 일부 조정을 사용할 수 있습니다. 얼마나 많은 휴식이 있을지 (대략) 결정하는 것 같습니다.
Marian

13

이 솔루션은 저에게 효과적이지 않았고 솔루션을 설명하지 않았습니다.

함수에 대한 breaks인수 scale_*_continuous는 제한을 입력으로 사용하고 중단을 출력으로 반환하는 사용자 지정 함수와 함께 사용할 수 있습니다. 기본적으로 축 제한은 연속 데이터 (데이터 범위에 상대적)에 대해 각면에서 5 % 씩 확장됩니다. 이 확장으로 인해 축 제한은 정수 값이 아닐 가능성이 높습니다.

내가 찾고 있던 해결책은 단순히 하한을 가장 가까운 정수로 반올림하고 상한을 가장 가까운 정수로 반올림 한 다음 이러한 끝점 사이의 정수 값에서 중단되는 것입니다. 따라서 나누기 기능을 사용했습니다.

brk <- function(x) seq(ceiling(x[1]), floor(x[2]), by = 1)

필수 코드 스 니펫은 다음과 같습니다.

scale_y_continuous(breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1))

원래 질문에서 재현 가능한 예는 다음과 같습니다.

data3 <-
  structure(
    list(
      IR = structure(
        c(4L, 3L, 2L, 1L, 4L, 3L, 2L, 1L),
        .Label = c("0.13-0.16", "0.17-0.23", "0.24-0.27", "0.28-1"),
        class = "factor"
      ),
      variable = structure(
        c(1L, 1L, 1L, 1L,
          2L, 2L, 2L, 2L),
        .Label = c("Real queens", "Simulated individuals"),
        class = "factor"
      ),
      value = c(2L, 2L, 6L, 10L, 0L, 1L, 4L,
                4L),
      Legend = structure(
        c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
        .Label = c("Real queens",
                   "Simulated individuals"),
        class = "factor"
      )
    ),
    row.names = c(NA,-8L),
    class = "data.frame"
  )

ggplot(data3, aes(
  x = factor(IR),
  y = value,
  fill = Legend,
  width = .15
)) +
  geom_col(position = 'dodge', colour = 'black') + ylab('Frequency') + xlab('IR') +
  scale_fill_grey() +
  scale_y_continuous(
    breaks = function(x) seq(ceiling(x[1]), floor(x[2]), by = 1),
    expand = expand_scale(mult = c(0, 0.05))
    ) +
  theme(axis.text.x=element_text(colour="black", angle = 45, hjust = 1), 
        axis.text.y=element_text(colour="Black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank(), 
        axis.ticks.x = element_blank())

2
여기에 최고의 답변
Martin

3

Google은 저에게이 질문을 가져 왔습니다. 저는 실제 숫자 를 y 척도 로 사용하려고합니다 . y 스케일 숫자는 백만 단위입니다.

저울 패키지 comma방법은 소개 쉼표 내 많은 수를. R-Bloggers 에 대한이 게시물은 다음 comma방법을 사용하는 간단한 접근 방식을 설명합니다 .

library(scales)

big_numbers <- data.frame(x = 1:5, y = c(1000000:1000004))

big_numbers_plot <- ggplot(big_numbers, aes(x = x, y = y))+
geom_point()

big_numbers_plot + scale_y_continuous(labels = comma)

R을 즐기십시오 :)


1
여기에있는 다른 솔루션은 실제로 저에게 효과가 없었거나 엄청나게 복잡해 보였습니다. 이것은 효과가 있었고 간단했습니다.
Brian Doherty

@BrianDoherty에게 감사합니다. 단순함은 대부분의 일에 핵심입니다 ...
Tony Cronin

3

기존의 모든 답변에는 사용자 지정 기능이 필요하거나 경우에 따라 실패하는 것 같습니다.

이 줄은 정수 나누기를 만듭니다.

bad_scale_plot +
  scale_y_continuous(breaks = scales::breaks_extended(Q = c(1, 5, 2, 4, 3)))

자세한 내용은 설명서 ?labeling::extended(에서 호출하는 함수 scales::breaks_extended)를 참조하세요.

기본적으로 인수 Q는 알고리즘이 스케일 브레이크에 사용하려고하는 멋진 숫자 세트입니다. 의 기본값에 Q2.5 가 포함 되므로 원래 플롯은 정수가 아닌 구분 (0, 2.5, 5 및 7.5)을 생성합니다 Q = c(1,5,2,2.5,4,3).

편집 : 주석에서 지적했듯이 y 축의 범위가 작을 때 정수가 아닌 구분이 발생할 수 있습니다. 기본적으로 범위가 너무 작 으면 불가능한 휴식 시간에 breaks_extended()대해 시도합니다 n = 5. 빠른 테스트에 따르면 0 <y <2.5보다 넓은 범위는 정수 중단을 제공합니다 ( n수동으로 줄일 수도 있음).


1

이 답변은 데이터가 0에서 1로만 이동하면 1에서 중단이 표시되지 않는다는 kory의 의견을 해결하기 위해 @Axeman의 답변을 기반으로합니다. 이는 pretty1이 아닌 것으로 보이는 출력 의 부정확성 때문인 것 같습니다. 1 (마지막의 예 참조).

따라서 사용하는 경우

int_breaks_rounded <- function(x, n = 5)  pretty(x, n)[round(pretty(x, n),1) %% 1 == 0]

+ scale_y_continuous(breaks = int_breaks_rounded)

0과 1은 모두 중단으로 표시됩니다.

Axeman과의 차이점을 설명하는 예

testdata <- data.frame(x = 1:5, y = c(0,1,0,1,1))

p1 <- ggplot(testdata, aes(x = x, y = y))+
  geom_point()


p1 + scale_y_continuous(breaks = int_breaks)
p1 + scale_y_continuous(breaks =  int_breaks_rounded)

둘 다 초기 질문에 제공된 데이터로 작동합니다.

반올림이 필요한 이유 설명

pretty(c(0,1.05),5)
#> [1] 0.0 0.2 0.4 0.6 0.8 1.0 1.2
identical(pretty(c(0,1.05),5)[6],1)
#> [1] FALSE

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.