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


69

我有以下要使用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()

当前数字如下所示: 在此处输入图片说明

Answers:


81

您需要告诉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")

在此处输入图片说明


2
而且,从技术上讲,它确实会为您订购。默认值是字母顺序-几乎不需要您想要的东西,但是很难想象会有更明智的默认值。
格雷戈尔·托马斯

@Gregor在您提到它之前,我不知道它是按字母顺序排列的。谢谢
Abel Callejo

30

这是一种不修改原始数据,但使用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)

在此处输入图片说明


3
我认为这是更好的答案,因为它与堆积的条形图兼容,条形图在列中重复使用相同的ID,因此与转换成可排序的因子不兼容。
Phil_T


5

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

library(dplyr)
dat <- read.table("...") %>% mutate(row = row_number())
ggplot(df,aes(x=reorder(V1,row),y=V2))+geom_bar()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.