Как динамически создавать метки в ggplot2 в scale_x_discrete () с помощью bquote ()? - PullRequest
0 голосов
/ 27 июня 2018

В настоящее время мне приходится жестко кодировать метки в пределах scale_x_discrete(), но мне нужно динамически создавать их подмножество и располагать их в порядке убывания с дополнительными метками, добавляемыми к нижней части оси y со статическими местоположениями.

library(dplyr)
library(ggplot2)
library(scales)

set.seed(1)

samp <- data.frame(Names = sample(paste0("Sample_", 1:5), 90, replace = TRUE),
                   Mode = rep(c("UN", "CN", "CF"), 150))

ggplot(samp, aes(x=Names)) +
  geom_bar(aes(fill=Mode), position="fill", width = .5) + 
  scale_fill_manual(values = c("#a0de6f","tan1","#DAEBFF")) +
  scale_y_continuous(label=percent, expand = c(0,0)) +
  coord_flip() +
  labs(fill="", 
       x="", 
       y="") +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.margin = unit(c(1,1,.5,0),"cm"),
    legend.key.size = unit(.5, "lines")
  ) +
  guides(fill = guide_legend(reverse = TRUE)) +
  scale_x_discrete("", 
                   labels= c(
                     bquote("Sample_5" * " (n = " *  .(sum(samp$Names == "Sample_5")) * ")"),
                     bquote(italic("Sample_1") * " (n = "  * .(sum(samp$Names == "Sample_1")) * ")"),
                     bquote(italic("Sample_3") * " (n = "  * .(sum(samp$Names == "Sample_3")) * ")"),
                     bquote(italic("Sample_4") * " (n = "  * .(sum(samp$Names == "Sample_4")) * ")"),
                     bquote(italic("Sample_2") * " (n = "  * .(sum(samp$Names == "Sample_2")) * ")")))

Этот бит:

  scale_x_discrete("", 
                   labels= c(
                     bquote("Sample_5" * " (n = " *  .(sum(samp$Names == "Sample_5")) * ")"),
                     bquote(italic("Sample_1") * " (n = "  * .(sum(samp$Names == "Sample_1")) * ")"),
                     bquote(italic("Sample_3") * " (n = "  * .(sum(samp$Names == "Sample_3")) * ")"),
                     bquote(italic("Sample_4") * " (n = "  * .(sum(samp$Names == "Sample_4")) * ")"),
                     bquote(italic("Sample_2") * " (n = "  * .(sum(samp$Names == "Sample_2")) * ")")))

Это то, что мне нужно, чтобы динамически создаваться и располагаться в порядке убывания по количеству, но я действительно не знаю, как.

Как это должно выглядеть:

enter image description here

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете создать список меток отдельно для вашей динамической части и статической части, а затем объединить их

excludes <- "Sample_5"
cat_counts <- table(samp$Names) %>% {.[-match(excludes, names(.))]}
my_sorted_labels <- Map(function(label, count) {
  bquote(italic(.(label)) * " (n = "  * .(count) * ")")
  }, names(cat_counts), cat_counts)[order(cat_counts)]
my_sorted_limits <- names(sort(cat_counts))

my_fixed_labels <- Map(function(label, count) {
  bquote(.(label) * " (n = "  * .(count) * ")")
}, excludes, table(samp$Names)[excludes])

my_labels <- c(my_fixed_labels, my_sorted_labels)
my_limits <- c(excludes, my_sorted_limits)

, а затем используйте это с

scale_x_discrete("", limits=my_limits, labels= my_labels)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...