我想使用 HH 包创建一个 Likert 图,该包在每个条形类别中结合了视觉模式(例如阴影线),以提高色盲用户的可访问性。
显然,对于客户来说,拥有灰度或其他色盲友好的颜色是不够的。
每个条形的不同类别(例如,非常高兴、高兴、既不高兴也不悲伤、悲伤、非常悲伤),除了不同的颜色之外,还必须包含一些图案或其他视觉区别(例如符号)。
这是一个可重现的示例:
样本数据:
## Dataframe with the necessary variables
df <- data.frame(institutt = c("institutt1", "institutt2"),
Spørsmål = c("q1", "q1"),
Veryhappy = c(3, 5),
Happy = c(2, 4),
Neithernor = c(3, 2),
Sad = c(4, 3),
Verysad = c(5, 2))
开始剧情:
install.packages("HH")
library(HH)
likert_plot <- df %>%
likert(grouping = df$institutt,
as.percentage = TRUE)
这会创建:这个数字,正如预期的那样。
如何在“非常快乐”、“快乐”等类别中添加线条、十字或符号来区分它们?
虽然“HH”包可以毫不费力地生成漂亮的李克特图,但它是一个相当老的包(目前至少有 18 年了),并且使用网格图形系统,该系统不支持图案填充。网格图形中的绘制方法绘制图形对象而不将它们返回给用户。这意味着我们无法使用底层
grid
图形系统中开发的新功能来修改输出。
虽然捕获和修改输出并非“不可能”,但它既困难又复杂。当然,切换到替代系统要容易得多,例如带有 ggpattern 的 ggplot:
library(tidyverse)
library(ggpattern)
df %>%
pivot_longer(-c(1:2), names_to = "level") %>%
mutate(level = fct_inorder(level)) %>%
group_by(institutt, Spørsmål) %>%
mutate(left = cumsum(lag(value, 1, 0)), right = left + value) %>%
mutate(xmin = left - (left + right)[level == "Neithernor"]/2) %>%
mutate(xmax = xmin + value) %>%
ungroup() %>%
mutate(ymin = as.numeric(factor(institutt)) - 0.3) %>%
mutate(ymax = ymin + 0.6) %>%
ggplot(aes(fill = level, pattern = level, pattern_angle = level)) +
geom_vline(xintercept = 0, linetype = 2) +
geom_rect_pattern(aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
pattern_color = NA, pattern_fill = "white",
pattern_spacing = 0.02) +
scale_fill_manual(values = c("#e16a86", "#e79aa9", "#e2e2e2",
"#a2ace5", "#768be6")) +
scale_pattern_manual(values = c("none", "stripe", "crosshatch", "stripe",
"circle")) +
scale_y_reverse(limits = c(2.5, 0.5), breaks = 1:2,
labels = levels(factor(df$institutt))) +
scale_pattern_angle_manual(values = c(45, 90, 45, 45, 0)) +
theme_classic(20) +
theme(legend.position = "bottom",
panel.background = element_rect(color = "black"),
axis.line = element_blank(),
legend.key.size = unit(10, "mm"))