我的数据框df
有46行3列。
我正在尝试通过youth_activity_rc
变量创建program_ID
变量值的图表,例如此代码/图表。 。 。
library(ggplot2)
ggplot(df, aes(x = program_name, y = total_minutes_p, group = youth_activity_rc, fill = youth_activity_rc)) +
geom_col(position = position_stack(reverse = T)) +
coord_flip()
。 。 。但program_ID
个变量根据Not Focused
变量youth_activity_rc
因子级别的值重新排序:
有许多问题证明如何在单个变量(即this question)的基础上执行此操作,但没有一个我可以根据与水平相关的值来实现这一点。一个因子(在这种情况下为Not Focused
);看起来很简单,但至少基于其他答案推荐的解决方案(即使用stats::reorder()
或dplyr::arrange()
),事实并非如此。
数据在这里:
df <- structure(list(program_ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L,
5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L,
8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L), .Label = c("1", "2", "4", "5",
"6", "7", "8", "9", "10"), class = "factor"), youth_activity_rc = structure(c(2L,
6L, 5L, 1L, 3L, 2L, 6L, 1L, 3L, 2L, 6L, 5L, 1L, 3L, 2L, 6L, 4L,
5L, 1L, 3L, 2L, 6L, 5L, 1L, 3L, 2L, 6L, 1L, 3L, 2L, 6L, 4L, 1L,
3L, 2L, 6L, 4L, 5L, 1L, 3L, 2L, 6L, 4L, 5L, 1L, 3L), .Label = c("Not Focused",
"Basic Skills Activity", "Program Staff Led", "Field Trip Speaker",
"Lab Activity", "Creating Product"), class = "factor"), total_minutes_p = c(0.248,
0.116, 0.075, 0.458, 0.103, 0.466, 0.015, 0.202, 0.317, 0.248,
0.263, 0.006, 0.372, 0.111, 0.183, 0.172, 0.088, 0.048, 0.305,
0.203, 0.157, 0.066, 0.079, 0.592, 0.106, 0.128, 0.423, 0.423,
0.026, 0.176, 0.233, 0.125, 0.426, 0.04, 0.164, 0.188, 0.046,
0.007, 0.524, 0.072, 0.163, 0.112, 0.013, 0.021, 0.567, 0.124
)), .Names = c("program_ID", "youth_activity_rc", "total_minutes_p"
), row.names = c(NA, -46L), vars = "program_ID", labels = structure(list(
program_ID = c(1, 2, 4, 5, 6, 7, 8, 9, 10)), .Names = "program_ID", row.names = c(NA,
-9L), class = "data.frame", vars = "program_ID", drop = TRUE), indices = list(
0:4, 5:8, 9:13, 14:19, 20:24, 25:28, 29:33, 34:39, 40:45), drop = TRUE, group_sizes = c(5L,
4L, 5L, 6L, 5L, 4L, 5L, 6L, 6L), biggest_group_size = 6L, class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
答案 0 :(得分:1)
按照youth_activity_rc
和total_minutes_p
对数据集进行排序,然后在绘图之前使用包 forcats 中的fct_inorder
作为一个选项。
fct_inorder
按照它们在数据集中出现的顺序设置因子的级别,这就是为什么需要对数据集进行排序以获得所需顺序的program_ID
级别的原因。
library(dplyr)
library(forcats)
df2 = df %>%
ungroup() %>%
arrange(youth_activity_rc, total_minutes_p) %>%
mutate(program_ID = fct_inorder(program_ID) )
情节:
ggplot(df2, aes(x = program_ID, y = total_minutes_p,
group = youth_activity_rc,
fill = youth_activity_rc)) +
geom_col(position = position_stack(reverse = TRUE)) +
coord_flip()
在fct_relevel
期间使用arrange
将您想要作为订单基础的因素的级别设置为第一级。例如,如果您想要在“正在创建产品”而不是“未聚焦”中按total_minutes_p
排序图表:
df2 = df %>%
ungroup() %>%
arrange(fct_relevel(youth_activity_rc, "Creating Product"), total_minutes_p) %>%
mutate(program_ID = fct_inorder(program_ID) )
答案 1 :(得分:1)
与aosmith类似的方法,但不使用forcats / dplyr进行数据操作。您可以在中获取所需子集中的订单,然后重构您的数据以获得该订单中的级别。类似于:
&#xA;&#xA; levs&lt; - df [which(df $ youth_activity_rc ==“Not Focused”),]#获取“未聚焦”组&# xA; order&lt; - order(levs [,“total_minutes_p”])#Order in your selected group&#xA;&#xA; df $ program_ID_2&lt; - factor(df $ program_ID,levels = levs [order,“program_ID” ])&#xA;&#xA; ggplot(df,aes(x = program_ID_2,y = total_minutes_p,&#xA; group = youth_activity_rc,&#xA; fill = youth_activity_rc))+&#xA; geom_col(position = position_stack(reverse = TRUE))+&#xA; coord_flip()&#xA;
&#xA;&#xA; &#xA;&#xA; 注意我创建了一个名为 program_ID_2
的新变量,但您不必