使用如下数据框
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()
)
我遇到的问题是我希望每个方面的条形图首先按最高值排序 - 我该如何解决这个问题?请注意,我仍然需要按顺序保留图例中的顺序 - 即nissan
,toyota
答案 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())