繁体   English   中英

ggplot-在geom_bar facet_wrap中订购酒吧

[英]ggplot - ordering bars in geom_bar facet_wrap

具有如下数据框

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()
    )

在此处输入图片说明

我遇到的问题是,我希望每个构面中的条形首先按最高值排序-我该如何处理? 请注意,我仍然需要保持图例中的顺序不变,即toyota nissan

在阅读了弗利克先生在这个问题上的回答后,我想到了以下想法。 我想赞扬他。

Flick先生在问题中所做的是创建一个新的因子变量。 现在有日产和丰田。 但是,我们希望为日产和丰田汽车分配一个唯一的因子水平。 我们要创建十个级别。 我们希望在每个variable级别中为每个汽车公司找到合适的顺序。 该过程的结果存储为foo 在下一步中,我们要创建一个新的因子变量,该变量与上一代码中mutate()中的foo相同。 然后,使用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()) 

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM