-axis ggplot [duplicate]에서 여러 요인 변수 정렬

Nov 17 2020

x 축 표시 순서에 대한 몇 가지 질문을 보았지만 여전히 내 문제를 해결할 수는 없습니다. 두 개의 다른 변수에서 10 개의 변수를 계산하는 플롯을 만들려고합니다. 내 변수는 요인이며 구조는 다음과 같습니다.

crime_1   crime_2 ......  crime_10
Yes         No               Yes
Yes         Yes              No
No          Yes              No

이 코드를 사용했습니다.

new_data %>%
  pivot_longer(cols = starts_with("crime")) %>%
    filter(value != 0) %>%
  unite(crime,name, value) %>%
  ggplot(aes(x = crime )) +
    geom_bar(aes(fill = wave), position = position_dodge2(preserve = "single"))+ theme(axis.text.x=element_text(angle=90,hjust=1))+ggtitle("Crime")

출력은 crime_1, crime_2, ......., crime_10이 아니고 crime_1, crime_10, crime_2, ,,,,입니다. 내가 사용하고 scale_x_discrete(drop = FALSE )fct_inorder하고, ().

순서에 따라 변수를 만들어야합니다. 감사합니다

답변

1 Ben Nov 18 2020 at 00:02

언급했듯이 x 축의 순서는 숫자 순서가 아니라 알파벳 순서입니다. 이를 수정하는 한 가지 방법이 있습니다.

패키지 의 str_sort기능을 사용하여 다음을 수행 stringr할 수 있습니다.

vec <- c("sb_1_x", "sb_10_b", "sb_11_c", "sb_2_y")
vec

[1] "sb_1_x"  "sb_10_b" "sb_11_c" "sb_2_y"

중간 번호로 주문 :

str_sort(vec, numeric = T)

[1] "sb_1_x"  "sb_2_y"  "sb_10_b" "sb_11_c"

이 경우 sb가 요인 인지 확인 str_sort하고 요인 수준을 설정하는 데 사용 합니다. 또한 x 축 레이블의 이름을 변경했습니다 (필요한 것으로 바꿀 수 있음). 함께 모아서:

library(tidyverse)
library(ggplot2)
library(stringr)

df %>%
  pivot_longer(cols = starts_with("sb")) %>%
  filter(value != 0) %>%
  unite(sb, name, value) %>%
  ggplot(aes(x = factor(sb, levels = str_sort(unique(sb), numeric = TRUE)))) +
    geom_bar(aes(fill = wave), position = position_dodge2(preserve = "single")) +
    xlab("x-axis label")

음모

cookesd Nov 17 2020 at 23:16

crime순서가 지정된 수준으로 요인을 만드십시오 . 전체 데이터 세트를 볼 수 없으므로 단순히 crime_1, crime_2, ..., crime_10이 아니라면 레벨을 변경해야 할 수도 있습니다.

new_data %>%
  pivot_longer(cols = starts_with("crime")) %>%
    filter(value != 0) %>%
  unite(crime,name, value) %>%
 # make crime a factor with ordered levels crime_1,crime_2,...,crime_10
  mutate(crime = factor(crime,levels = paste('crime',1:10,sep='_')) %>%
  ggplot(aes(x = crime )) +
    geom_bar(aes(fill = wave), position = position_dodge2(preserve = "single"))+ theme(axis.text.x=element_text(angle=90,hjust=1))+ggtitle("Crime")
``