Легенда ggplot2 с контуром на каждой другой группе - PullRequest
1 голос
/ 12 апреля 2020

Я делаю диаграмму рассеяния, используя . У меня есть 17 групп, которые необходимо отобразить, и я пытаюсь найти способы сделать так, чтобы такое количество цветов отличалось друг от друга. Как можно поставить черный контур на каждой другой группе , чтобы черный контур отображался как на диаграмме рассеяния, так и в легенде.

Вот воспроизводимый пример слишком большого количества цветов для визуализации. Мне бы хотелось, чтобы «Группа 1», «Группа 11», «Группа 13» и др. c. иметь черный контур вокруг них, чтобы их можно было отличить от соседей.

groupings <- paste0("Group", 1:15)
iris$group <- rep(groupings, 10)

iris_plot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point(aes(Sepal.Length, Sepal.Width, colour = factor(iris$group)))

shrink_legend <- function(NMDS, pointSize, textSize, spaceLegend){
  NMDS +
        guides(shape = guide_legend(override.aes = list(size = pointSize)),
               color = guide_legend(override.aes = list(size = pointSize))) +
        theme(legend.title = element_text(size = textSize), 
              legend.text  = element_text(size = textSize),
              legend.key.size = unit(spaceLegend, "lines"))
}

shrink_legend(iris_plot, pointSize = 1.2, textSize = 10, spaceLegend = 0.5)

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

Я думаю, что форма по умолчанию для geom_point не поддерживает заливку и контур / границу (цвет). Если вы используете формы 21-24 , вы сможете добавить два значения к fill и colour. Я использовал форму 21 в этом, например,

Я добавил границу столбца, чтобы определить, какой из них будет дана граница. Конечно, это будет означать, что у вас будет две записи легенды (см. Pi c.)

groupings <- paste0("Group", 1:15)
iris$group <- rep(groupings, 10)
iris$border <- c(T,F)


iris_plot <-  ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, fill = factor(iris$group))) + 
    geom_point(aes(Sepal.Length, Sepal.Width, fill = group, colour = border), shape = 21, size = 3)+ scale_colour_manual(values=c("grey", "black"))

shrink_legend <- function(NMDS, pointSize, textSize, spaceLegend){
  NMDS +
    guides(shape = guide_legend(override.aes = list(size = pointSize)),
           color = guide_legend(override.aes = list(size = pointSize))) +
    theme(legend.title = element_text(size = textSize), 
          legend.text  = element_text(size = textSize),
          legend.key.size = unit(spaceLegend, "lines"))
}

shrink_legend(iris_plot, pointSize = 1.2, textSize = 10, spaceLegend = 0.5)

Вывод графика

1 голос
/ 12 апреля 2020

Попробуйте это. Сначала я меняю форму точек на точки с границами. Во-вторых. Чтобы добиться желаемого графика, я установил цвета границы для неравномерных групп на черный, в то время как цвета по умолчанию ggplot2 для четных. Цвета задаются с помощью scale_color_manual. В результате контур появляется как на сюжете, так и в легенде.

library(ggplot2)
library(forcats)
library(scales)

# Helper to make it easy to set colors
iris$group1 <- rep(1:15, 10)
iris$group <- paste0("Group", iris$group1)
# Order Groups
iris$group <- forcats::fct_reorder(iris$group, iris$group1)
# Default ggplot2 colors
colors <- scales::hue_pal()(15)
# Set color to "black" for uneven groups
colors[seq(1, 15, by = 2)] <- "black"

iris_plot <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
  # Change shape to 21 = point with outline
  geom_point(aes(Sepal.Length, Sepal.Width, fill = group, color = group), shape = 21) +
  # Set colors
  scale_color_manual(values = colors)

shrink_legend <- function(NMDS, pointSize, textSize, spaceLegend){
  NMDS +
    guides(shape = guide_legend(override.aes = list(size = pointSize)),
            color = guide_legend(override.aes = list(size = pointSize))) +
    theme(legend.title = element_text(size = textSize), 
          legend.text  = element_text(size = textSize),
          legend.key.size = unit(spaceLegend, "lines"))
}

shrink_legend(iris_plot, pointSize = 1.2, textSize = 10, spaceLegend = 0.5)

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

...