ggplot2: размер символа ключа верхней легенды изменяется с меткой ключа легенды - PullRequest
0 голосов
/ 25 октября 2018

Проблема

Я хочу разместить легенду моего сюжета над сюжетом.Я также хочу разместить символ ключа легенды (цветные квадраты) над метками ключа легенды (текст легенды).К сожалению, когда я делаю это, символ ключа легенды «растягивается», чтобы соответствовать размеру этикетки.Я полагаю, что ggplot2 работает нормально, но как я могу вручную переопределить эту функцию?

Как сохранить последовательный символ ключа легенды в верхней части с метками переменной длины?

ВоспроизводимыйПример

( Это не обязательно минимальный пример, на случай, если структура моего фактического кода, такая как вызовы coord_flip и fill, оказывает влияние )

library(dplyr)
library(ggplot2)

dataFrame <- diamonds %>%
              group_by(color, cut) %>%
              summarise(count = n()) %>%
              group_by(color) %>%
              mutate(percent = count/sum(count),
                    pretty_label = paste0(round(percent*100, 1), "%")) %>%
              ungroup()

p <- ggplot(data = dataFrame, mapping = aes(x=color, y = percent, group = cut))+
      geom_bar(aes(fill = cut), stat = "identity", position = "fill")+
      geom_text(aes(label = pretty_label), position=position_fill(vjust=0.5), colour="white", stat = "identity")+
      coord_flip()+
      theme(legend.position="top")+
      guides(fill = guide_legend(label.position = "bottom", reverse = TRUE))

plot(p)

legend symbols stretch with labels

Обратите внимание, что каждый из символов легенды имеет разные размеры в зависимости от длины этикетки.

То, что я уже пробовал

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

  1. С здесь и здесь : p + guides(colour = guide_legend(override.aes = list(size=3)))

  2. С здесь : p + guides(colour = guide_legend(keywidth = .5, keyheight = .5)) и p + guides(colour = guide_legend(keywidth = unit(.5, "cm"), keyheight = unit(.5, "cm")))

  3. С здесь : (Попытка обернуть метки) p + guides(color = guide_legend(nrow = 2))

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

Заключительные мысли

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

Заранее спасибо!

Вывод сеанса

> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252    LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] bindrcpp_0.2.2 ggplot2_3.0.0  dplyr_0.7.6   

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.18      bindr_0.1.1       magrittr_1.5      tidyselect_0.2.4  munsell_0.5.0     colorspace_1.3-2  viridisLite_0.3.0
 [8] R6_2.2.2          rlang_0.2.1       plyr_1.8.4        tools_3.5.1       grid_3.5.1        gtable_0.2.0      withr_2.1.2      
[15] yaml_2.1.19       lazyeval_0.2.1    assertthat_0.2.0  digest_0.6.17     tibble_1.4.2      purrr_0.2.5       glue_1.2.0       
[22] labeling_0.3      compiler_3.5.1    pillar_1.2.3      scales_0.5.0      pkgconfig_2.0.1  

1 Ответ

0 голосов
/ 25 октября 2018

Я не знаю, есть ли способ контролировать ширину цветовых полей легенды отдельно от текста (кроме взлома легенды).Тем не менее, если вы добавите legend.key.width=unit(1.5, "cm") в свой оператор темы, все поля цвета будут расширены до одинаковой ширины (вам может потребоваться немного изменить значение 1.5 вверх или вниз, чтобы получить желаемую ширину блока).

library(scales)

ggplot(dataFrame, aes(x=color, y = percent))+
  geom_bar(aes(fill = cut), stat = "identity") +
  geom_text(aes(label = pretty_label), position=position_fill(vjust=0.5), 
            colour="white", size=3)+
  coord_flip()+
  theme(legend.position="top",
        legend.key.width=unit(1.5, "cm"))+
  guides(fill = guide_legend(label.position = "bottom", reverse = TRUE)) +
  scale_y_continuous(labels=percent)

enter image description here

Вы можете сэкономить немного места, поставив Very Good в две строки:

library(forcats)

ggplot(dataFrame, aes(x=color, y = percent, fill = fct_recode(cut, "Very\nGood"="Very Good")))+
  geom_bar(stat = "identity") +
  geom_text(aes(label = pretty_label), position=position_fill(vjust=0.5), 
            colour="white", size=3)+
  coord_flip()+
  theme(legend.position="top",
        legend.key.width=unit(1.2, "cm"))+
  guides(fill = guide_legend(label.position = "bottom", reverse = TRUE)) +
  labs(fill="Cut") +
  scale_y_continuous(labels=percent)

enter image description here

...