小节中的x轴变量的顺序

时间:2019-03-14 02:42:03

标签: r ggplot2

我有与子类别和类别相对应的数字数据:

Category <- c("Cell", "Cell", "Nucleus", "Nucleus", "Metabolism", "Metabolism")
Subcategory <- c ("c","r","f","z","a","e")
Val <- c(1,5,34,89,23,12)
df <- data.frame(Category,Subcategory,Val)

我尝试过:

ggplot(df, aes(x=Subcategory, y=Val)) +
geom_bar(stat="identity", aes(fill=Category)) +
coord_flip() + 
xlim(rev(levels(df$Subcategory)))  

问题是xlim中的顺序: xlim总是将字母按字母顺序排列,如果我使用 rev(...),则以“ a”开头,如果: xlim(levels( ...)

有什么方法可以接受我在 df 中拥有的订单?

我希望 x 中的顺序与类别的顺序相对应,尽管这意味着子类别的字母保持非字母顺序。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望条形图按出现在数据框中的类别和子类别进行排序。那就是Cell(c,r);核(f,z);代谢(a,e)。

为此,您需要重新排序“类别”和“子类别”因子的级别。然后将“子类别”用作轴标签。

我遗漏了coord_flip,因为我认为此示例会使情况变得更糟。

df %>% 
  mutate(Category = factor(Category,
                           levels = unique(Category)),
         Subcategory = factor(Subcategory,
                              levels = unique(Subcategory))) %>%
  ggplot(aes(Subcategory, Val)) + 
  geom_col(aes(fill = Category)) + 
  scale_x_discrete(labels = df$Subcategory)

结果:

enter image description here

答案 1 :(得分:0)

levels中将xlim(rev(levels(df$Subcategory)))更改为as.character的{​​{1}}

这是最终代码:

xlim(rev(as.character(df$Subcategory)))