itsource

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

mycopycode 2023. 6. 11. 10:39
반응형

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

저는 다음과 같은 줄거리를 가지고 있습니다.

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축에 정수만 표시하기를 원합니다.이것이 라운딩을 통해 이루어지는지 아니면 더 우아한 방법을 통해 이루어지는지는 저에게 중요하지 않습니다.

만약 당신이 가지고 있다면.scales패키지, 사용할 수 있습니다.pretty_breaks()브레이크를 수동으로 지정할 필요가 없습니다.

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

다음을 사용합니다.

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

와 함께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))

사용자 지정 레이블을 사용할 수 있습니다.예를 들어, 이 함수는 정수 구분만 생성하도록 보장합니다.

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

이러한 해결책은 저에게 효과가 없었고 해결책을 설명하지도 않았습니다.

breaksscale_*_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())

저는 조슈아 쿡에게서 이 해결책을 찾았고 꽤 잘 작동했습니다.

integer_breaks <- function(n = 5, ...) {
  fxn <- function(x) {
    breaks <- floor(pretty(x, n, ...))
    names(breaks) <- attr(breaks, "labels")
    breaks
  }
  return(fxn)
}

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

소스: https://joshuacook.netlify.app/post/integer-values-ggplot-axis/

당신은 할 수 .accuracy또는 이에 대한 인수:

fakedata <- data.frame(
  x = 1:5,
  y = c(0.1, 1.2, 2.4, 2.9, 2.2)
)

library(ggplot2)

# without the accuracy argument, you see .0 decimals
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::comma)

# with the accuracy argument, all displayed numbers are integers
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = ~ scales::comma(.x, accuracy = 1))

# equivalent
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::label_comma(accuracy = 1))

# this works with scales::label_number() as well
ggplot(fakedata, aes(x = x, y = y)) +
  geom_point() +
  scale_y_continuous(label = scales::label_number(accuracy = 1))

reprex 패키지(v2.0.0.9000)에 의해 2021-08-27에 생성되었습니다.

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

이 선은 정수를 구분합니다.

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

내용은 하십시오.?labeling::extended는 (으)로 되는 함수입니다.scales::breaks_extended).

기적으로, 은주장.Q는 알고리즘이 척도 구분에 사용하려고 하는 nice 숫자 집합입니다.이 0, 2.5, 5, 7.5이기 가 아닌 구분, 됩니다.Q2.5 포함:Q = c(1,5,2,2.5,4,3).

EDIT: 주석에서 지적한 바와 같이 Y축의 범위가 작을 경우 정수가 아닌 파단이 발생할 수 있습니다.기본적으로,breaks_extended()에 대해 만들려고 노력합니다.n = 5브레이크. 범위가 너무 작을 경우 불가능합니다.빠른 테스트 결과 0 < y < 2.5보다 넓은 범위는 정수 절편(n수동으로 줄일 수도 있습니다.

이 답변은 데이터가 0에서 1로만 진행되는 경우 1에서 중단이 나타나지 않는다는 Kory의 의견을 다루는 @Axman의 답변을 기반으로 합니다.이것은 의 부정확성 때문으로 보입니다.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

구글은 저를 이 질문으로 이끌었습니다.저는 어떤 척도로든 실수를 사용하려고 노력하고 있습니다.그들의 축척 숫자는 백만 단위입니다.

체중계 패키지commamethod는 나의 큰 숫자에 쉼표를 도입합니다.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을 즐기세요 :)

한 가지 대답은 실제로 예쁜() 함수의 문서 안에 있습니다.여기서 설명한 것처럼 'ggplot2'에서 축을 정수 값으로 설정하는 기능에는 이미 솔루션이 포함되어 있습니다.당신은 작은 가치를 위해 그것을 작동시키기만 하면 됩니다.한 가지 가능성은 작성자가 작성하는 것처럼 새로운 함수를 작성하는 것입니다. 나에게 breaks 인수 안의 람다 함수는 다음과 같이 작동합니다.

... + scale_y_continuous(breaks = ~round(unique(pretty(.))

값의 크기에 관계없이 정수 레이블만 생성하는 pretty()에 의해 생성된 고유한 값 집합을 반올림합니다.

만약 당신의 값이 정수라면, 이것을 하는 다른 방법은 다음과 같습니다.group = 1그리고.as.factor(value):

library(tidyverse)

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")
data3 %>% 
  mutate(value = as.factor(value)) %>% 
  ggplot(aes(x =factor(IR), y = value, fill = Legend, width=.15)) +
  geom_col(position = 'dodge', colour='black', group = 1) 

reprex 패키지(v2.0.1)에 의해 2022-04-05에 생성되었습니다.

이게 제가 한 일입니다.

scale_x_continuous(labels = function(x) round(as.numeric(x)))

언급URL : https://stackoverflow.com/questions/15622001/how-to-display-only-integer-values-on-an-axis-using-ggplot2

반응형