[英]Ggplot scale_fill_manual with dynamic returned values
我有一个 dataframe,其中包含多列因子类型(有 5 个级别:深绿色、绿色、橙色、黄色、灰色),尽管每个包含不同的值,如下面的屏幕截图所示。
我试图定义一个 function 来制作一个条形图,其中包含由所选列中包含的值手动设置的图例 colors,如下所示
library(tidyverse)
make_graph <- function(df, col){
data = select(df, group, col)
G = data$group
C = data$col
tbl = prop.table(table(G, C))
DF = data.frame(tbl) %>% filter(freq != 0)
ggplot(data, aes(x=G,y=Freq, fill=C)) +
geom_bar(stat="identity", position="dodge") + theme_minimal() +
scale_fill_manual(values=c(?????), labels=c(?????)) # needs to be automatically filled with the values contained in the selected column
我的问题是:如何根据提供给 function make_graph
的列动态设置参数values
和labels
? 例如,如果我执行此make_graph(df, 'col_2')
它将显示 3 个条形图,其中 colors 为深绿色、绿色和橙色,图例值为“很好”、“好”和“好”
PS:以下是 akrun 提供的代码的结果,其中图例值与 colors 不一致(例如,深绿色应标记为“好”而不是“可怕”)
library(dplyr)
library(ggplot2)
make_graph <- function(df, col){
keyval <- setNames(c("great", "good", "ok", "poor", "terrible"),
c("dark green", "green", "orange", "yellow", "grey"))
fill_m <- keyval[df[[col]]]
df %>%
select(group, all_of(col)) %>%
count(across(everything())) %>%
mutate(prop = n/sum(n)) %>%
filter(n != 0) %>%
ggplot(aes(x = group, y = n, fill = .data[[col]])) +
geom_bar(stat= "identity", position = "dodge") +
theme_minimal() +
scale_fill_manual(values = names(fill_m), labels = fill_m)
}
-测试
make_graph(df1, "col_2")
df1 <- structure(list(group = structure(c(1L, 2L, 1L, 2L), levels = c("1",
"2"), class = "factor"), col_1 = c("dark green", "dark green",
"dark green", "dark green"), col_2 = c("dark green", "green",
"orange", "orange"), col_3 = c("green", "yellow", "dark green",
"grey"), col_4 = c("grey", "dark green", "orange", "yellow"),
col_5 = c("dark green", "grey", "grey", "grey")), row.names = c(NA,
-4L), class = c("tbl_df", "tbl", "data.frame"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.