在绘制geom_bar()时避免ggplot对x轴进行排序

时间:2013-11-18 06:03:20

标签: r ggplot2

我想要用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

4 个答案:

答案 0 :(得分:71)

你需要告诉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

答案 1 :(得分:16)

这是一种不修改原始数据但使用scale_x_discrete的方法。来自?scale_x_discrete&#34;使用限制来调整显示的级别(和顺序)&#34;例如:

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

答案 2 :(得分:6)

您也可以按照here

所述重新排序相应的因素
x$name <- factor(x$name, levels = x$name[order(x$val)])

答案 3 :(得分:2)

dplyr使您可以轻松创建一个row列,可以在ggplot中对其进行重新排序。

library(dplyr)
dat <- read.table("...") %>% mutate(row = row_number())
ggplot(df,aes(x=reorder(V1,row),y=V2))+geom_bar()