Как устранить неловкий вертикальный разрыв между двумя легендами, которые я создал для Cowplot в R? - PullRequest
2 голосов
/ 06 января 2020

Я пытался создать две отдельные легенды, потому что я хотел сгруппировать свои легенды по-разному. Однако между обеими легендами существует этот неловкий разрыв; Я хочу закрыть неловкий вертикальный разрыв между двумя легендами (как на фото). Как я могу go сделать это?

Спасибо.

picture here

library(cowplot)

data2 <- tibble::tribble(
  ~Color,    ~Item, ~Count,       ~Year,
  "Blue",    "Bag",     50, "2009-2011",
  "Blue", "Wallet",     60, "2009-2011",
  "Green",  "Shoes",     80, "2009-2011",
  "Green",  "Shirt",     90, "2009-2011",
  "Yellow", "Flower",     20, "2009-2011",
  "Yellow",   "Bees",     30, "2009-2011",
  "Blue",    "Bag",     50, "2009-2012",
  "Blue", "Wallet",     60, "2009-2012",
  "Green",  "Shoes",     90, "2009-2012",
  "Green",  "Shirt",     20, "2009-2012",
  "Yellow", "Flower",     10, "2009-2012",
  "Yellow",   "Bees",      5, "2009-2012"
)

palette1 <- c("#4575B4","#74ADD1","#ABD9E9","#800026","#FC4E2A","#FEB24C")
palette2 <- c("#800026","#FC4E2A","#FEB24C")

data2$Count_final <- with(data2, Count * c(1, -1)[(Color == "Yellow") + 1])


full_plot <- ggplot(data=data2)+ 
    geom_bar(aes(x=Year,y=Count_final,fill=Item),stat="identity",position="identity") +
    scale_y_continuous(labels=abs)+
    scale_fill_manual(values=palette1)+
    theme_bw(base_size=18) +
    ylab("Count")+
    theme(legend.position="none")


Legend1 <- 
    data2 %>%
    filter(Item %in% c("Bag","Wallet","Shoes")) %>%
    ggplot(aes(x=Year,fill=Item))+geom_bar()+
    scale_fill_manual(values=palette1,name="Accessories")

Legend2 <- 
    data2 %>%
    filter(Item %in% c("Shirt","Flower","Bees")) %>%
    ggplot(aes(x=Year,fill=Item))+geom_bar()+
    scale_fill_manual(values=palette2,name="Not Accessories")


plot_grid(
    full_plot
    , plot_grid(
      get_legend(Legend1)
      , get_legend(Legend2)
      , nrow = 2
    )
    , nrow = 1
    , rel_heights = c(1,0)

  )



Ответы [ 2 ]

2 голосов
/ 06 января 2020

Это может быть не совсем то, что вы хотели. Возможно, вам придется использовать альтернативные способы, чтобы получить цвета, которые вам нравятся. Это только один из способов решить вашу проблему. Надеюсь, поможет.

library(ggplot2)
library(cowplot)
data2 <- tibble::tribble(
  ~Color,    ~Item, ~Count,       ~Year,
  "Blue",    "Bag",     50, "2009-2011",
  "Blue", "Wallet",     60, "2009-2011",
  "Green",  "Shoes",     80, "2009-2011",
  "Green",  "Shirt",     90, "2009-2011",
  "Yellow", "Flower",     20, "2009-2011",
  "Yellow",   "Bees",     30, "2009-2011",
  "Blue",    "Bag",     50, "2009-2012",
  "Blue", "Wallet",     60, "2009-2012",
  "Green",  "Shoes",     90, "2009-2012",
  "Green",  "Shirt",     20, "2009-2012",
  "Yellow", "Flower",     10, "2009-2012",
  "Yellow",   "Bees",      5, "2009-2012"
)

data2$Count_final <- with(data2, Count * c(1, -1)[(Color == "Yellow") + 1])

data2$Item = factor(data2$Item, 
                    levels=c("Accessories","Bag","Bees", "Flower", " ",
                             "Non-accessories", "Shirt","Shoes","Wallet"))

full_plot <- ggplot(data=data2)+ 
  geom_bar(aes(x=Year,y=Count_final,fill=Item),stat="identity",position="identity") +
  scale_y_continuous(labels=abs)+
  theme_bw(base_size=18) +
  ylab("Count")

full_plot + 
  scale_fill_manual(values=c("white", "#4575B4","#74ADD1","#ABD9E9", 
                             "white","white", "#800026","#FC4E2A","#FEB24C"),
                    drop=FALSE)+
  theme(legend.position="right", 
        legend.title=element_blank())

Создано в 2020-01-06 пакетом Представить (v0.3.0)

Редактировать

Я подумал, что здесь будет проще объяснить это на ваши вопросы, чем в поле для комментариев. В этом подходе используется один набор ggplot меток легенд. Добавляя пробелы и новые метки, это выглядит как два набора легенд. Сначала мы добавляем 3 новых уровня в переменную term: «Аксессуары», «», «Не аксессуары». В следующем порядке:

data2$Item = factor(data2$Item, 
                    levels=c("Accessories","Bag","Bees", "Flower", " ",
                             "Non-accessories", "Shirt","Shoes","Wallet"))

Затем в ggplot назначьте пробелы для этих 3 уровней. Поскольку для этих уровней нет фактических значений, они будут отброшены по умолчанию. Поэтому мы использовали drop = FALSE, чтобы сохранить их.

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

1 голос
/ 07 января 2020

Используйте этот вызов plot_grid:

Leg <- plot_grid(get_legend(Legend1), get_legend(Legend2), nrow = 4, align = "hv")
plot_grid(full_plot, Leg)

screenshot

...