Избежать ggplot сортировки оси X, в то время как построение Геом бар()


у меня есть следующие данные, которые я хочу построить с помощью ggplot:

SC_LTSL_BM    16.8275
SC_STSL_BM    17.3914
proB_FrBC_FL   122.1580
preB_FrD_FL    18.5051
B_Fo_Sp    14.4693
B_GC_Sp    15.4986

то, что я хочу сделать, это сделать гистограмму и поддерживать порядок бара, (т. е. начиная с SC_LTSL_BM ...B_GC_Sp). Но поведение по умолчанию ggplot geom_bar-это их сортировка. Как я могу этого избежать?

  library(ggplot2)
  dat <- read.table("http://dpaste.com/1469904/plain/")
  pdf("~/Desktop/test.pdf")
  ggplot(dat,aes(x=V1,y=V2))+geom_bar()
  dev.off()

текущая цифра выглядит так:

3 51

3 ответа:

вам нужно сказать ggplot, что у вас уже есть заказанный фактор, поэтому он автоматически не заказывает его для вас.

dat <- read.table(text=
"SC_LTSL_BM    16.8275
SC_STSL_BM    17.3914
proB_FrBC_FL   122.1580
preB_FrD_FL    18.5051
B_Fo_Sp    14.4693
B_GC_Sp    15.4986", header = FALSE, stringsAsFactors = FALSE)

# make V1 an ordered factor
dat$V1 <- factor(dat$V1, levels = dat$V1)

# plot
library(ggplot2)
ggplot(dat,aes(x=V1,y=V2))+geom_bar(stat="identity")

enter image description here

вот подход, который не изменяет исходные данные, но использует scale_x_discrete. От кого ?scale_x_discrete "используйте ограничения, чтобы настроить, какие уровни (и в каком порядке) отображаются" например:

dat <- read.table(text=
                "SC_LTSL_BM    16.8275
              SC_STSL_BM    17.3914
              proB_FrBC_FL   122.1580
              preB_FrD_FL    18.5051
              B_Fo_Sp    14.4693
              B_GC_Sp    15.4986", header = FALSE, stringsAsFactors = FALSE)
# plot
library(ggplot2)
ggplot(dat,aes(x=V1,y=V2))+
  geom_bar(stat="identity")+
  scale_x_discrete(limits=dat$V1)

enter image description here

вы также можете просто переупорядочить соответствующий фактор, как описано здесь

x$name <- factor(x$name, levels = x$name[order(x$val)])