Как я могу организовать свою легенду в подгруппы? - PullRequest
0 голосов
/ 09 мая 2019

Легенда для моей гистограммы в настоящее время перечисляет все элементы на графике в один длинный список.Я хотел бы иметь группу легенды по каждому столбцу.

Количество столбцов является динамическим, поэтому легенда должна быть в состоянии соответственно отрегулировать.

library("phyloseq"); packageVersion("phyloseq")
library(ggplot2)
library(scales)
data("GlobalPatterns")
TopNOTUs <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50])
gp.ch   <- prune_species(TopNOTUs, GlobalPatterns)
gp.ch = subset_taxa(gp.ch, Genus != "NA")
mdf = psmelt(gp.ch)
# Create a ggplot similar to
library("ggplot2")
mdf$group <- paste0(mdf$Phylum, "-", mdf$Genus, sep = "")

colours <-ColourPalleteMulti(mdf, "Phylum", "Genus")

# Plot resultss
ggplot(mdf, aes(Phylum)) + 
  geom_bar(aes(fill = group), colour = "grey", position = "stack")

Сейчас легенда печатаетitems:

Actinobacteria-Bifidobacterium

Actinobacteria-Rothia

Bacteriodetes-Alistipes

Bacteriodetes-Bacteroides

...

Я хотел бы напечатать:

Актинобактерии

-Бифидобактерии

-Ротия

Бактериодет

-Алистипы

-Бактероиды

...

1 Ответ

0 голосов
/ 09 мая 2019

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

# Fake data sample
library(tidyverse)
cars_sample <- mtcars %>%
  rownames_to_column(var = "name") %>%
  mutate(make = word(name, end = 1),
         model = word(name, start = 2, end = -1)) %>%
  filter(make %in% c("Mazda", "Merc", "Hornet")) %>%
  select(name, make, model, mpg, wt)


# Add rows for groups and make a factor for each group and each component
cars_sample_fct <- cars_sample %>%
  bind_rows( cars_sample %>% count(make) %>% mutate(model = make, name = "")) %>%
  arrange(make, name) %>%
  mutate(name_fct   = fct_inorder(if_else(name == "", make, paste0("- ", model))))

# Plot with transparent grouping legend labels
ggplot(cars_sample_fct, aes(wt, mpg, color = name_fct)) +
  geom_point() +
  scale_color_discrete(name = "Car") +
  guides(color = guide_legend(
    override.aes = list(size = 5, 
                        alpha = cars_sample_fct$name != "")))

enter image description here

...