Я создаю точечную диаграмму с использованием 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 и создать отдельную легенду для типа линии, вам нужно провести некоторую подготовку данных и соответствующую настройку графика. Сначала объединим данные из двух наборов, добавив переменную, чтобы отслеживать их источник. Затем мы можем сопоставить эту новую переменную с эстетикой linetype
, что поможет достичь нужного результата.
Вот шаги, как это сделать:
- Объедините данные из
data1
иdata2
, добавив новый столбец, который будет обозначать источник данных. - Настройте график с использованием эстетик для
x
,y
,color
,shape
, иlinetype
. - Настройте легенду так, чтобы она отображала только нужные элементы.
Вот пример кода на 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
, что означает, что не будет отображаться линия для легенды цвета.
Теперь вы получите график, где легенда для типа линии будет независима от группы, а в точках будут отображены соответствующие формы. Надеюсь, это поможет решить вашу задачу!