繁体   English   中英

堆叠的geom_bar中的项目排序

[英]Ordering of items within a stacked geom_bar

出于对我来说似乎很好的原因,我想绘制一个堆积的条形图,并且条形按特定的数据相关顺序排列。 由于我不知道的原因,它似乎不起作用。 具体来说,虽然我可以轻松地以正确的顺序排列数据框的行,并使标识条形的名称列成为有序因素,所以以我想要的顺序获得条形图,但图形不会列出数据框的列按照我想要的顺序。

一个例子

tab <- structure(list(Item = c("Personal", "Peripheral", "Communication", "Multimedia", "Office", "Social Media"), `Not at all` = c(3.205128, 18.709677, 5.844156, 31.578947, 20.666667, 25.827815), Somewhat = c(30.76923, 23.87097, 24.67532, 18.42105, 30, 16.55629), `Don't know` = c(0.6410256, 2.5806452, 1.9480519, 11.1842105, 2.6666667, 5.9602649), Confident = c(32.69231, 29.67742, 33.11688, 17.10526, 23.33333, 27.15232), `Very confident` = c(32.69231, 25.16129, 34.41558, 21.71053, 23.33333, 24.50331)), .Names = c("Item", "Not at all", "Somewhat", "Don't know", "Confident", "Very confident"), row.names = c(NA, -6L), class = "data.frame")

Title <- 'Plot title'
ResponseLevels <- c("Not at all", "Somewhat", "Don't know", "Confident", "Very confident") # Labels for bars

pal.1 <- brewer.pal(category, 'BrBG') # Colours

tab <- tab %>% arrange(.[,2]) # Sort by first columns of responses
tab$Item <- factor(tab$Item, levels = tab$Item[order(tab[,2])], ordered = TRUE) # Reorder factor levels

tab.m <- melt(tab, id = 'Item')
tab.m$col <- rep(pal.1, each = items) # Set colours

g <- ggplot(data = tab.m, aes(x = Item, y = value, fill = col)) + 
    geom_bar(position = "stack", stat = "identity", aes(group = variable)) +
    coord_flip() +
    scale_fill_identity("Percent", labels = ResponseLevels, 
                        breaks = pal.1, guide = "legend") +
    labs(title = Title, y = "", x = "") +
    theme(plot.title = element_text(size = 14, hjust = 0.5)) +
    theme(axis.text.y = element_text(size = 16,hjust = 0)) +
    theme(legend.position = "bottom")

g

堆积的条形图,方向错误

条形图的堆叠部分从右到左,从“完全没有”到“非常有信心”。 这些项目的顺序是正确的,从“多媒体”到“个人”,按对每个项目说“完全不”的人的比例排序。

我想要得到的是该图,其响应以与图例相同的方式排序,即从左侧的“完全不”到右侧的“非常有信心”。 我不知道如何设置此顺序,也无法更改它。

我已经阅读了“类似的问题”,但看不到此特定查询的答案。 建议使用ggplot,而不是基于R的图形。

好吧,在allstaire的有用且广受赞赏的答案的基础上,我尝试以下方法

library(tidyverse)

tab <- structure(list(Item = c("Personal", "Peripheral", "Communication", "Multimedia", "Office", "Social Media"), `Not at all` = c(3.205128, 18.709677, 5.844156, 31.578947, 20.666667, 25.827815), Somewhat = c(30.76923, 23.87097, 24.67532, 18.42105, 30, 16.55629), `Don't know` = c(0.6410256, 2.5806452, 1.9480519, 11.1842105, 2.6666667, 5.9602649), Confident = c(32.69231, 29.67742, 33.11688, 17.10526, 23.33333, 27.15232), `Very confident` = c(32.69231, 25.16129, 34.41558, 21.71053, 23.33333, 24.50331)), .Names = c("Item", "Not at all", "Somewhat", "Don't know", "Confident", "Very confident"), row.names = c(NA, -6L), class = "data.frame")

tab <- tab %>% select(1,6,5,4,3,2,1) ## Re-order the columns of tab

tab.m <- tab %>% arrange(`Not at all`) %>%
mutate(Item = factor(Item, levels = Item[order(`Not at all`)])) %>% 
gather(variable, value, -Item, factor_key = TRUE)

ggplot(data = tab.m, aes(x = Item, y = value, fill = variable)) + 
geom_col() +
coord_flip() +
scale_fill_brewer("Percent", type = 'cat', palette = 'BrBG', 
                  guide = guide_legend(reverse = TRUE)) +
labs(title = 'Plot title', y = NULL, x = NULL) +
theme(legend.position = "bottom")

这正是我想要的图形,因此解决了我的紧迫问题。

正确堆叠的条形图

但是,如果我改为

ggplot(data = tab.m, aes(x = Item, y = value, fill = variable)) + 
geom_col() +
coord_flip() +
scale_fill_brewer("Percent", type = 'cat', palette = 'BrBG', 
                  guide = guide_legend(reverse = FALSE)) +
labs(title = 'Plot title', y = NULL, x = NULL) +
theme(legend.position = "bottom")

我得到的照片是这个

条形图堆积,图例方向错误

此处图表的主体是正确的,但图例的方向错误。

这解决了我的问题,但并不能完全回答我的问题。 我从一个数据帧开始,要获得我想要的东西,我必须反转数据列的顺序,并反转指南图例。 这显然是可行的,但这是错误的。

那么,堆积条形图如何决定以什么顺序展示堆积物? 很明显,这与它们在融合数据集中的顺序有关,但仅更改顺序会使图例向错误的方向前进。 从上到下查看融化的数据集tab.m,响应的顺序为“非常有信心”到“完全没有”,但默认图例是从“完全没有”到“非常有信心”的相反顺序。 。

如果传递的是guide_legend而不是字符串,则可以将其reverse参数设置为TRUE 简化一点

library(tidyverse)

tab <- structure(list(Item = c("Personal", "Peripheral", "Communication", "Multimedia", "Office", "Social Media"), `Not at all` = c(3.205128, 18.709677, 5.844156, 31.578947, 20.666667, 25.827815), Somewhat = c(30.76923, 23.87097, 24.67532, 18.42105, 30, 16.55629), `Don't know` = c(0.6410256, 2.5806452, 1.9480519, 11.1842105, 2.6666667, 5.9602649), Confident = c(32.69231, 29.67742, 33.11688, 17.10526, 23.33333, 27.15232), `Very confident` = c(32.69231, 25.16129, 34.41558, 21.71053, 23.33333, 24.50331)), .Names = c("Item", "Not at all", "Somewhat", "Don't know", "Confident", "Very confident"), row.names = c(NA, -6L), class = "data.frame")

tab.m <- tab %>% arrange(`Not at all`) %>%
    mutate(Item = factor(Item, levels = Item[order(`Not at all`)])) %>% 
    gather(variable, value, -Item, factor_key = TRUE)

ggplot(data = tab.m, aes(x = Item, y = value, fill = variable)) + 
    geom_col() +
    coord_flip() +
    scale_fill_brewer("Percent", palette = 'BrBG', 
                      guide = guide_legend(reverse = TRUE)) +
    labs(title = 'Plot title', y = NULL, x = NULL) +
    theme(legend.position = "bottom")


对于编辑:

条形顺序由因子级别顺序决定,而在上面,列顺序由列顺序决定,这是由于使用了gather来创建因子,尽管coord_flip使其不那么明显。 不过,通过levels<-或通过重新组合因子可以很容易地反转水平顺序。 要使颜色保持相同的级别,也可以将direction = -1传递给scale_fill_brewer以颠倒其顺序。

tab.m <- tab %>% arrange(`Not at all`) %>%
    mutate(Item = factor(Item, levels = Item[order(`Not at all`)])) %>% 
    gather(variable, value, -Item, factor_key = TRUE) %>% 
    mutate(variable = factor(variable, levels = rev(levels(variable)), ordered = TRUE))

ggplot(data = tab.m, aes(x = Item, y = value, fill = variable)) + 
    geom_col() +
    coord_flip() +
    scale_fill_brewer("Percent", palette = 'BrBG', direction = -1,
                      guide = guide_legend(reverse = TRUE)) +
    labs(title = 'Plot title', y = NULL, x = NULL) +
    theme(legend.position = "bottom")

暂无
暂无

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

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