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

Добавление show.legend = T и group = xxx не имеет значения.

data <- data.frame(
  A = c(1, 2, 3),
  B = c(1, 2, 3),
  C = c(2, 3, 4)
)

ggplot(data, aes(x = A)) +
  geom_line(aes(y = C)) +
  geom_point(aes(y = C)) +
  geom_col(aes(y = B))

enter image description here

0
Daniel 12 Окт 2021 в 00:31

2 ответа

Лучший ответ

Вы можете сохранить ту же структуру данных, но это все равно неудобно, поскольку ggplot на самом деле «не хочет», чтобы вы это делали (сопоставляйте эстетику с вещами, которые на самом деле не являются «настоящей» эстетикой);

ggplot(data = data,aes(x = A)) + 
  geom_line(aes(y = C,color = "C")) + 
  geom_col(aes(y = B,color = "B",fill = "B"),fill = "blue") + 
  scale_color_manual(values = c("C" = "red","B" = "blue")) +
  scale_fill_manual(values = c("C" = "red","B" = "blue")) +
  guides(color = guide_legend(override.aes = list(fill = "white")))

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

0
joran 11 Окт 2021 в 22:13

Мне удалось найти решение, которое не очень элегантно, но работает в моем случае.

data.2 <- data.frame(
  A = c(1, 2, 3, 1, 2, 3),
  D = c('B', 'B', 'B', 'C', 'C', 'C'),
  B = c(1, 2, 3, NA, NA, NA),
  C = c(NA, NA, NA, 2, 3, 4)
)

data.2 %>% 
  ggplot(aes(x = A, y = C, col = D, fill = D)) +
  geom_line() +
  geom_point() +
  geom_col(aes(y = B)) +
  scale_color_manual(values = c('black', 'red'), breaks = c('B', 'C')) +
  scale_fill_manual(values = c('grey', 'transparent'), breaks = c('B', 'C'))

enter image description here

0
Daniel 11 Окт 2021 в 22:10