programing

ggplot에서 면 순서 수정

bestprogram 2023. 6. 26. 21:29

ggplot에서 면 순서 수정

데이터:

df <- data.frame(
    type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
    size   = c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"),
    amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

ggplot (x축 ->)을 사용하여 위 데이터의 막대 그래프를 그려야 합니다.typey축 ->amount에 따라 그룹을 짓다.size) 다음 코드를 사용했을 때 변수가 표시되지 않습니다.type뿐만 아니라size데이터에 표시된 순서대로그림을 보세요.저는 그것을 위해 아래의 코드를 사용했습니다.

 ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_col(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~size) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

enter image description here.

주문 문제를 해결하기 위해 변수 "유형"에 대해 다음과 같은 인자 방법을 사용했습니다.그림도 참조하시기 바랍니다.

temp$new = factor(temp$type, levels=c("T","F","P"), labels=c("T","F","P")) 

enter image description here

하지만 지금은 변수의 순서를 어떻게 수정해야 할지 모르겠습니다.size50%, 100%여야 합니다.150%, 200%.

다음을 통해 데이터 프레임의 크기를 결정할 수 있습니다.

temp$size_f = factor(temp$size, levels=c('50%','100%','150%','200%'))

그런 다음 변경합니다.facet_grid(.~size)로.facet_grid(.~size_f)

그런 다음 플롯:enter image description here

이제 그래프의 순서가 정확합니다.

여기에 몇 가지 좋은 해결책이 있습니다.

Harpal의 답변과 유사하지만, 측면 내에서는 기본 데이터나 사전 플롯 조작을 변경할 필요가 없습니다.

# Change this code:
facet_grid(.~size) + 
# To this code:
facet_grid(~factor(size, levels=c('50%','100%','150%','200%')))

이는 유연하며, 어떤 변수에 대해서도 구현할 수 있으며, 어떤 요소에 대해서도 변경할 수 있으며, 기본적인 데이터 변경은 필요하지 않습니다.

조작이 훨씬 덜함:facet_grid(~fct_relevel(size,'50%','100%','150%','200%'))

여기에 애플리케이션 파이프 체인 내에서 제품을 유지하는 솔루션이 있습니다.미리 데이터를 정렬한 다음 mutate_at을 사용하여 요인으로 변환합니다.현명하게 정렬할 수 있는 데이터를 고려할 때 이 솔루션이 일반적으로 어떻게 적용될 수 있는지 보여주기 위해 데이터를 약간 수정했습니다.

# the data
temp <- data.frame(type=rep(c("T", "F", "P"), 4),
                    size=rep(c("50%", "100%", "200%", "150%"), each=3), # cannot sort this
                    size_num = rep(c(.5, 1, 2, 1.5), each=3), # can sort this
                    amount=c(48.4, 48.1, 46.8, 
                             25.9, 26.0, 24.9,
                             20.8, 21.5, 16.5,
                             21.1, 21.4, 20.1))

temp %>% 
  arrange(size_num) %>% # sort
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>% # convert to factor

  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)

이 솔루션을 적용하여 면 내에서 막대를 배열할 수도 있지만 선호하는 단일 순서만 선택할 수도 있습니다.

    temp %>% 
  arrange(size_num) %>%
  mutate_at(vars(size), funs(factor(., levels=unique(.)))) %>%
  arrange(desc(amount)) %>%
  mutate_at(vars(type), funs(factor(., levels=unique(.)))) %>%
  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)


  ggplot() + 
  geom_bar(aes(x = type, y=amount, fill=type), 
           position="dodge", stat="identity") + 
  facet_grid(~ size)

glenn_in_boston의 답변과 비슷하지만 레벨에서 하드 코딩은 없습니다.

# Change this code:
facet_grid(.~size) + 
# To this code:
facet_grid(~factor(size, levels=unique(df$size)))

크기가 데이터 프레임에서 가장 작은 것부터 가장 큰 것까지 배열되어 있기 때문에 작동합니다.

크기가 이미 요인이고 표시할 때 순서를 뒤집으려는 경우 다음과 같은 옵션이 있습니다.

# Updating dataframe so size is a factor ordered smallest to largest
df <- data.frame(
  type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
  size   = factor(c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"), levels=c("50%", "100%","150%","200%"), ordered = TRUE),
  amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

# Now plotting with facets in the reverse order
ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_col(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(~factor(size, levels=rev(unique(df$size)))) +  #this part updated
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

레이블을 구문 분석하거나 원본 데이터를 수정하거나 다음을 사용하여 수동으로 순서를 정의하지 않고도 전세 패싯 레이블의 숫자 순서를 달성할 수 있습니다.stringr::str_sort( , numeric = TRUE):

... +

facet_grid(. ~ factor( , stringr::str_sort(unique( ), numeric = TRUE))) +

...


전체 예:

library(ggplot2)

df <- data.frame(
  type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
  size   = c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"),
  amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_col(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~factor(size, stringr::str_sort(unique(size), numeric = TRUE))) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

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

종종, 이 경우와 같이, 일부 순서 데이터를 나타내는 면의 순서를 지정하려는 욕구가 그것들에 뿌리를 두고 있습니다.이러한 경우에는 먼저 데이터를 적절하게 정리하는 것이 좋습니다. 즉, 문자 열에서 숫자 값을 구문 분석하는 것이 좋습니다.이 경우 캔은 쉽게 처리할 수 있습니다.df$size <- as.numeric(sub("%", "", df$size))/100라벨을 할 수 를 들어, 그 다 음 레 이 블 이 여 사 하 있 수 니 습 다 제 할 어 을 블 레 이 런 패 용 을 싯 능 기 된 정 지 ▁one 니 다 , ▁the ▁use et ▁to 있 ▁labels 습 ▁then 그 ▁e ▁a ▁functionfacet_grid(.~size, labeller = function(x) lapply(x, scales::label_percent()))

library(ggplot2)

df <- data.frame(
  type   = c("T", "F", "P", "T", "F", "P", "T", "F", "P", "T", "F", "P"), 
  size   = c("50%", "50%", "50%", "100%", "100%", "100%", "150%", "150%", "150%", "200%", "200%", "200%"),
  amount = c(48.4, 48.1, 46.8, 25.9, 26, 24.9, 21.1, 21.4, 20.1, 20.8, 21.5, 16.5)
)

df$size <- as.numeric(sub("%", "", df$size))/100

ggplot(df, aes(type, amount , fill=type, group=type, shape=type, facets=size)) + 
  geom_col(width=0.5, position = position_dodge(width=0.6)) + 
  facet_grid(.~size, labeller = function(x) lapply(x, scales::label_percent())) + 
  theme_bw() + 
  scale_fill_manual(values = c("darkblue","steelblue1","steelblue4"), 
                    labels = c("T", "F", "P"))

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

언급URL : https://stackoverflow.com/questions/14262497/fixing-the-order-of-facets-in-ggplot