我有以下当前输出:
我的目标是这样的着色,但只填充到最高级别(例如填充在当前水平停止):创建这个的数据是:
df& …
以下是一些技巧选项。首先,为了获得每个问题的完整级别,以便您在数据中没有空白,我使用了 tidyr::complete 。那是我将要使用的数据框架。
tidyr::complete
library(ggplot2) library(dplyr) library(tidyr) library(purrr) library(patchwork) df_full <- df %>% complete(nesting(Domain, Question_Code), RespondentLevel) %>% mutate(RespondentLevel = as.character(RespondentLevel))
更简单的选择是通过更改alpha来近似渐变,并根据域设置色调(红色,绿色等)。这会使您选择的其他颜色失效,并且只使用每个调色板的最后,最暗的颜色。
为此,我列出了所有调色板。在设置填充时, map_chr(palettes, 5) 提取每个列表的第5个元素,这是每个列表中最暗的颜色。您可能想要调整或删除一个或两个图例。
map_chr(palettes, 5)
palettes <- list(Greens, Reds, Yellows, Blues) ggplot(df_full, aes(x = RespondentLevel, y = Question_Code, fill = Domain, alpha = RespondentLevel)) + geom_tile() + theme_minimal() + facet_grid(rows = vars(Domain), scales = "free", space = "free") + scale_fill_manual(values = map_chr(palettes, 5)) #> Warning: Using alpha for a discrete variable is not advised.
更难的方法是按域分割数据并制作一个图表列表,然后将它们与 patchwork 包。好处是你可以保留全彩色调色板,但缺点是控制你从中调整大小的东西更加困难 facet_grid ,这适用于某些域中列出的问题多于其他域中的问题。您可以手动调整这些大小 plot_layout 如果你认为这种方法是值得的。你还需要调整一些主题元素来模仿什么 facet_grid 会做。
patchwork
facet_grid
plot_layout
plot_list <- df_full %>% split(.$Domain) %>% map2(palettes, function(domain_df, pal) { ggplot(domain_df, aes(x = RespondentLevel, y = Question_Code, fill = RespondentLevel)) + geom_tile() + theme_minimal() + scale_fill_manual(values = pal) + theme(legend.position = "none") + labs(x = NULL, y = NULL) }) reduce(plot_list, `+`) + plot_layout(ncol = 1)
注意通常, patchwork 将情节放在一起就像 plot1 + plot2 模仿 ggplot 层次感。因为我在列表中有这些情节,所以我这样做了 purrr::reduce 。
plot1 + plot2
ggplot
purrr::reduce