Избегайте комбинирования легенд, связанных с различными, но сгруппированными наборами данных

Вопросы и ответы

Я создаю точечную диаграмму с использованием ggplot2 с тремя группами. Затем я добавляю дополнительный слой для отображения дополнительных данных. В обоих случаях я привязываю данные к группе, но во втором случае я хочу, чтобы легенда была отделена от групп и представляла собой легенду с двоичной черно-белой линией. Сейчас легенда объединяет всё.

Основываясь на других решениях, я пробовал scale_linetype_identity() и scale_linetype_manual(), но безуспешно.

Пример:

library(ggplot2)

# Данные 1
data1 <- data.frame(
  x = c(1, 2, 3), 
  y = c(10, 20, 20, 10, 15, 15, 10, 10, 10), 
  group = factor(c(rep("A", 3), rep("B", 3), rep("C", 3)), 
                 levels = c("A", "B", "C")))

# Диаграмма 1
p <- ggplot(data1, aes(x = x, y = y, color = group, shape = group)) + 
  geom_line(show.legend = FALSE) +
  geom_point()
p

# Данные 2
data2 <- data.frame(
  x = c(1, 2), 
  y = c(10, 19.3, 10, 12.5, 10, 7.5), 
  group = data1$group[-c(3, 6, 9)],
  condition = c("Y", "Z")
)

p +
  geom_line(data = data2, aes(x = x, y = y, color = group), 
            linetype = "dotted", show.legend = TRUE) +
  geom_point(data = data2)

Создано 2024-09-15 с reprex v2.1.1

И я пытаюсь получить эту легенду:

введите описание изображения здесь

Но без типа линии для легенды группы, только форма.

Перед построением объедините наборы данных для каждого условия, используя переменную id для отслеживания источника. Затем вы можете сопоставить этот новый столбец с эстетикой linetype, что приблизит вас к легенде, которую вы описали. Чтобы удалить линии из легенды цвета, вы можете переопределить эстетики. linetype = 0 — это пустая линия.

library(ggplot2)
library(dplyr)

data1 <- data.frame(
  x = c(1, 2, 3), 
  y = c(10, 20, 20, 10, 15, 15, 10, 10, 10), 
  group = factor(c(rep("A", 3), rep("B", 3), rep("C", 3)), 
                 levels = c("A", "B", "C")))

data2 <- data.frame(
  x = c(1, 2), 
  y = c(10, 19.3, 10, 12.5, 10, 7.5), 
  group = data1$group[-c(3, 6, 9)]
)

bind_rows(data1, data2, .id = 'condition') |>
  ggplot(aes(x = x, y = y, color = group, shape = group, linetype = condition)) +
  geom_point() +
  geom_line() +
  guides(color = guide_legend(override.aes = list(linetype = 0)))

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

Ответ

Конечно! Чтобы избежать объединения легенд в вашем графике ggplot2 и создать отдельную легенду для типа линии, вам нужно провести некоторую подготовку данных и соответствующую настройку графика. Сначала объединим данные из двух наборов, добавив переменную, чтобы отслеживать их источник. Затем мы можем сопоставить эту новую переменную с эстетикой linetype, что поможет достичь нужного результата.

Вот шаги, как это сделать:

  1. Объедините данные из data1 и data2, добавив новый столбец, который будет обозначать источник данных.
  2. Настройте график с использованием эстетик для x, y, color, shape, и linetype.
  3. Настройте легенду так, чтобы она отображала только нужные элементы.

Вот пример кода на R:

library(ggplot2)
library(dplyr)

# Создание первого набора данных
data1 <- data.frame(
  x = c(1, 2, 3), 
  y = c(10, 20, 20, 10, 15, 15, 10, 10, 10), 
  group = factor(c(rep("A", 3), rep("B", 3), rep("C", 3)), 
                 levels = c("A", "B", "C"))
)

# Создание второго набора данных
data2 <- data.frame(
  x = c(1, 2), 
  y = c(10, 19.3, 10, 12.5, 10, 7.5), 
  group = data1$group[-c(3, 6, 9)]
)

# Объединение данных с добавлением переменной "condition"
combined_data <- bind_rows(data1, data2, .id = 'condition')

# Построение графика
ggplot(combined_data, aes(x = x, y = y, color = group, shape = group, linetype = condition)) +
  geom_point() +
  geom_line() +
  guides(color = guide_legend(override.aes = list(linetype = 0))) # Убираем линии из легенды цвета

Объяснение некоторых частей кода:

  • bind_rows(data1, data2, .id = ‘condition’): Эта функция объединяет два датафрейма, и новый столбец condition показывает, из какого набора данных пришла каждая строка.
  • aes(linetype = condition): Здесь мы используем переменную condition, чтобы управлять стилем линии (например, пунктирными линиями для второго набора данных).
  • guides(…): Этот метод позволяет изменить настройки легенды. В данном случае мы используем его для установки linetype = 0 в override.aes, что означает, что не будет отображаться линия для легенды цвета.

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

Оцените материал
Добавить комментарий

Капча загружается...