我有与子类别和类别相对应的数字数据:
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 中的顺序与类别的顺序相对应,尽管这意味着子类别的字母保持非字母顺序。
答案 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)
结果:
答案 1 :(得分:0)
在levels
中将xlim(rev(levels(df$Subcategory)))
更改为as.character
的{{1}}
这是最终代码:
xlim(rev(as.character(df$Subcategory)))