ggplot - 在geom_bar facet_wrap中排序条形图

时间:2018-01-15 04:50:48

标签: r ggplot2

使用如下数据框

set.seed(99)
data = data.frame(name=c("toyota", "nissan"), a=sample(1:10,2)/10,b=sample(-150:-50,2),c=sample(1e2:1e3,2),d=sample(1e3:1e5,2), e=sample(-15:30,2))

我试图将各种变量绘制到单个图表上,如下所示。这很好用

library(ggplot2)
library(reshape2)
ggplot(melt(data, id = "name")) + 
  aes(name, value, fill = name) + 
  geom_col(position = "dodge") +
  facet_wrap(~ variable, scales = "free_y") +
  theme(
    axis.text.x=element_blank(),
    axis.text.y=element_blank()
    )

enter image description here

我遇到的问题是我希望每个方面的条形图首先按最高值排序 - 我该如何解决这个问题?请注意,我仍然需要按顺序保留图例中的顺序 - 即nissantoyota

1 个答案:

答案 0 :(得分:4)

this question阅读弗利克先生的回答后,我提出了以下想法。我想给他信任。

Flick先生在问题中所做的是创建一个新的因子变量。现在你有日产和丰田。但我们想为日产和丰田分配一个独特的因子水平;我们想创造十个级别。我们希望在variable的每个级别找到每个汽车公司的正确订单。此过程的结果存储为foo。在下一步中,我们要创建一个新的因子变量,该变量与前一代码中foo中的mutate()相同。然后,使用foo分配级别。在ggplot的代码中,我们想要使用scales = "free"

library(reshape2)
library(dplyr)
library(ggplot2)

temp <- melt(data, id = "name")

# Deciding the level order

foo <- temp %>%
       group_by(variable) %>%
       mutate(foo = levels(reorder(factor(paste(name, variable, sep = ".")), -value))) %>%
       pull(foo)

# Creating a new factor variable and assign levels with foo.

out <- temp %>% 
       mutate(new = factor(interaction(name, variable), levels = foo))

ggplot(data = out, aes(x = new, y = value, fill = name)) +
geom_col(position = "dodge") +
facet_wrap(~ variable, scales = "free") +
labs(x = "", fill = "Car company") +
theme(axis.text.x = element_blank(),
      axis.text.y = element_blank()) 

enter image description here