Избегайте сортировки ggplot по оси x при построении geom_bar()
У меня есть следующие данные, которые я хочу построить с помощью 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()
Текущая цифра выглядит так:
![enter image description here]()
Ответы
Ответ 1
Вам нужно сообщить 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]()
Ответ 2
Вот подход, который не изменяет исходные данные, но использует scale_x_discrete. From? 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]()
Ответ 3
Вы также можете просто переупорядочить соответствующий коэффициент, как описано здесь
x$name <- factor(x$name, levels = x$name[order(x$val)])
Ответ 4
dplyr позволяет вам легко создать столбец row
который вы можете переупорядочить в ggplot.
library(dplyr)
dat <- read.table("...") %>% mutate(row = row_number())
ggplot(df,aes(x=reorder(V1,row),y=V2))+geom_bar()