С ggplot2, как вы можете создать поле вокруг метки метки?

По нескольким причинам я пытаюсь дублировать гротескный сюжет, показанный ниже. Это нарушает многие заповеди хорошей визуализации данных, поэтому для целей обучения моя цель - использовать ggplot2 и деконструировать ее - удалять или пересматривать слабо выбранные функции по одному. Используя данные, воспроизведенные внизу и код ниже графика, я приближаюсь, но не смог понять, как включить одну заметную функцию.

Вопрос: Есть ли способ воспроизвести черный затененный прямоугольник вокруг трех ярлыков тика? (Если это так, просто создать другую факторную переменную, чтобы идентифицировать эти три метки и изменить их шрифт на белый.)

enter image description here

ggplot(plotpg19, aes(x = risks, y = scores, fill = colors)) +
  geom_bar(stat = "identity", width = 0.6) +
  scale_fill_manual(values = c("grey50", "deepskyblue2", "mediumorchid3", "gold")) + 
  geom_text(aes(label = scores), hjust = -0.4, size = 8, face = "bold") + 
  coord_flip() + 
  theme_bw() + labs(x = NULL, y = NULL) +
  theme(panel.grid.major = element_blank()) +
  guides(fill = FALSE) +
  scale_y_continuous(breaks = seq(0, 100, 20), labels = seq(0, 100, 20), expand = c(0,0)) + 
  theme(panel.border = element_blank(), axis.line = element_line(colour = "black", size = 5,                                                                linetype ="solid", lineend = "square")) +
  geom_hline(yintercept = seq(0, 80, 10), colour="grey30", size = .5, linetype="dotted") + 
  theme(axis.line.x = element_blank()) # to get a single axis border, must format both and then blank one

enter image description here Кстати, этот вопрос использует символы для ярлыков меток, может предложить некоторые идеи, используя пакет grImport, но его учения превышают меня, и я ищу затененную коробку вокруг указанного тика метки.

dput(plotpg19)

structure(list(risks.format = structure(c(2L, 3L, 1L, 4L, 5L, 
                                          7L, 8L, 6L), .Label = c("Geographic locations in which\n                                 the company operates", 
                                                                  "Inadequate resources for anti-bribery/\ncorruption compliance activities", 
                                                                  "Industries/sector(s) in which\n                                 the company operates", 
                                                                  "Lack of anti-bribery/corruption training\n                                 or awareness within the business", 
                                                                  "Lack of understanding\n                                 by top executives", 
                                                                  "Other", "Rogue employees", "Third parties/associates\n                                 acting on our behalf"
                                          ), class = "factor"), risks = structure(c(8L, 7L, 6L, 5L, 4L, 
                                                                                    3L, 2L, 1L), .Label = c("Other", "Third parties/associates acting on our behalf", 
                                                                                                            "Rogue employees", "Lack of understanding by top executives", 
                                                                                                            "Lack of anti-bribery/corruption training or awareness within the business", 
                                                                                                            "Geographic locations in which the company operates", "Industries/sector(s) in which the company operates", 
                                                                                                            "Inadequate resources for anti-bribery/corruption compliance activities"
                                                                                    ), class = "factor"), scores = c(15, 28, 71, 16, 5, 48, 55, 2
                                                                                    ), colors = c("A", "A", "B", "A", "A", "C", "D", "A")), .Names = c("risks.format", 
                                                                                                                                                       "risks", "scores", "colors"), row.names = c(NA, -8L), class = "data.frame")

Ответы

Ответ 1

Я считаю, что лучше всего создать видовые экраны в месте ярлыков меток и нарисовать там черный прямоугольник и белый текст. Например:

vp1 <- viewport(x = 0.225, y = 0.55, width = 0.45, height = 0.07)
grid.rect(gp = gpar(fill="black"), vp = vp1)
grid.text("Lack of anti-bribery corruption training or awareness within the business", gp=gpar(col="white", cex = 0.6), vp = vp1)

Вы найдете график ниже: enter image description here

Ответ 2

Немного не по теме, но это рекомендуемое быстрое и грязное решение: экспортируйте график как PNG (растровое) или SVG (на основе вектора) и вручную добавьте черные блоки с белым текстом.