我正在使用ggplot创建一个堆积条形图,如下所示:
plot_df <- df[!is.na(df$levels), ]
ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")
Run Code Online (Sandbox Code Playgroud)
这给了我这样的东西:
如何反转堆叠条本身的顺序,以便第1级位于底部,第5级位于每个条形的顶部?
我已经看到了很多关于这方面的问题(例如,如何使用ggplot2上的标识来控制堆积条形图的排序),并且常见的解决方案似乎是按照该级别对数据帧重新排序,因为ggplot正在使用确定顺序
所以我尝试使用dplyr进行重新排序:
plot_df <- df[!is.na(df$levels), ] %>% arrange(desc(levels))
然而,情节也是如此.不论我是按升序还是按降序排列,似乎也没有区别
这是一个可重复的例子:
group <- c(1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4, 1,2,3,4)
levels <- c("1","1","1","1","2","2","2","2","3","3","3","3","4","4","4","4","5","5","5","5","1","1","1","1")
plot_df <- data.frame(group, levels)
ggplot(plot_df, aes(group)) + geom_bar(aes(fill = levels), position = "fill")
Run Code Online (Sandbox Code Playgroud) 我写了以下函数来制作一个定制的堆积图:
stacked_plot <- function(data, what, by = NULL, date_col = date, date_unit = NULL, type = 'area'){
by <- enquo(by)
what <- ensym(what)
date_col <- ensym(date_col)
date_unit <- enquo(date_unit)
if (!rlang::as_string(date_col) %in% names(data)){
return(cat('Nie odnaleziono kolumny "', as_string(date_col), '".', sep = ''))
}
if (!rlang::quo_is_null(date_unit)){
data <- data %>%
mutate(!!date_col := floor_date(!!date_col, unit = !!date_unit, week_start = 1))
}
if (!rlang::quo_is_null(by)) {
data <- data %>%
filter(!is.na(!!by)) %>%
group_by(!!date_col, !!by) %>%
summarise(!!what := sum(!!what, na.rm = TRUE)) %>%
ungroup() %>% …Run Code Online (Sandbox Code Playgroud) 我面临着ggplot2无法理解的,排序和堆积条形图的行为。
我已经读过一些关于它的问题(这里,这里等等),但是不幸的是我找不到适合我的解决方案。也许答案很简单,但我看不到。希望这不是一个骗子。
我的主要目标是基于ordering列(这里称为ordering)使每个堆栈独立地排序。
这里有一些数据:
library(dplyr)
library(ggplot2)
dats <- data.frame(id = c(1,1,1,2,2,3,3,3,3),
value = c(9,6,4,5,6,4,3,4,5),
ordering = c(1,2,3,2,3,1,3,2,4),
filling = c('a','b','c','b','a','a','c','d','b')) %>% arrange(id,ordering)
Run Code Online (Sandbox Code Playgroud)
因此,有一个ID,一个值,一个要用于排序的值和一个填充,数据就像在ordering列中一样应该在图中进行排序。
我试图绘制它:的想法是绘制一个x轴为的堆叠条形图id,值为value,由填充filling,但填充的值ordering按升序排列,即 ordering ,每个值的最大值在底部专栏。的顺序在filling某种程度上与数据集相同,即每一列都有独立的顺序。
您可以想象它们是假数据,因此id的数量可以变化。
id value ordering filling
1 1 9 1 a
2 1 6 2 b
3 1 4 3 c
4 2 5 2 b
5 2 6 3 a …Run Code Online (Sandbox Code Playgroud) 我正在制作带有ggplot2的堆积条形图,其中有关y轴的特定条形排序.
# create reproducible data
library(ggplot2)
d <- read.csv(text='Day,Location,Length,Amount
1,4,3,1.1
1,3,1,2
1,2,3,4
1,1,3,5
2,0,0,0
3,3,3,1.8
3,2,1,3.54
3,1,3,1.1',header=T)
ggplot(d, aes(x = Day, y = Length)) + geom_bar(aes(fill = Amount, order = Location), stat = "identity")
ggplot(d, aes(x = Day, y = Length)) + geom_bar(aes(fill = Amount, order = rev(Location)), stat = "identity")
Run Code Online (Sandbox Code Playgroud)
第一个ggplot图按位置顺序显示数据,其中Location = 1最接近x轴,而每个增加值的数据都堆叠在下一个上.
第二个ggplot图以不同的顺序显示数据,但它没有堆叠具有最接近x轴的最高位置值的数据,而下一个最高位置的数据堆叠在距离x轴位置的第二个位置.第一个栏目栏,就像我希望它基于之前的帖子一样.
下一个片段确实以所需的方式显示数据,但我认为这是简单和小型示例数据集的工件.堆栈顺序尚未指定,因此我认为ggplot基于Amount的值进行堆叠.
ggplot(d, aes(x = Day, y = Length)) + geom_bar(aes(fill = Amount), stat = "identity")
Run Code Online (Sandbox Code Playgroud)
我想要的是强制ggplot按照位置值递减的顺序堆叠数据(位置= 4最接近x轴,位置= 3接下来,...,位置= 1位于条形列的最顶部)调用order =或等价的参数.有什么想法或建议吗? …
所以我有数据框
dput(df)
structure(list(Frequency = structure(c(1L, 2L, 3L, 4L, 1L, 2L,
3L, 4L), .Label = c("2", "3", "4", "5"), class = "factor"), Prcentage = c(1,
33, 58, 8, 2, 40, 53, 5), label = list("Insufficient", "Average",
"Good", "Excellent", "Insufficient", "Average", "Good", "Excellent"),
name = c("implementation", "implementation", "implementation",
"implementation", "energy", "energy", "energy", "energy")), .Names = c("Frequency",
"Prcentage", "label", "name"), row.names = c(NA, 8L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
并使用以下代码
# Get the levels for type in the required order
df$label = factor(df$label, levels = …Run Code Online (Sandbox Code Playgroud)