Попытка добавить легенду, используя geom_abline - PullRequest
1 голос
/ 13 февраля 2020

У меня есть фрейм данных, сохраненный как df, с двумя столбцами точек, которые я хотел бы построить. Кроме того, я хотел бы нарисовать две линии на сюжете и хотел бы иметь легенду для этих линий. Вот мой код:

ggplot(df, aes(x = x, y = y)) + 
  geom_point(color = "black", shape = 16, alpha = 1) +
  scale_x_continuous(name = "x", limits = c(-5, 5)) + 
  scale_y_continuous(name = "y", limits = c(-5, 5)) +
  geom_abline(intercept = 0, slope = 4/3, linetype = "dashed", 
              color = "gray40", size = 1, aes(colour = "XNULL")) + 
  geom_abline(intercept = 0, slope = 0, linetype = "dotted", 
              color = "gray40", size = 1, aes(colour = "YNULL")) +
  scale_color_manual(name = "", values = c("XNULL" = "red", "YNULL" = "blue")) +
  theme(panel.background = element_rect(fill = "white"),
        panel.border = element_rect(colour = "black", fill = NA, size = 1),
        legend.position = "bottom")

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

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Из документации:

Эти гемы действуют немного иначе, чем другие гемы. Вы можете предоставить параметры двумя способами: либо в качестве аргументов функции слоя, либо с помощью эстетики. Если вы используете аргументы, например, geom_abline (intercept = 0, slope = 1), то за кадром geom создает новый фрейм данных, содержащий только те данные, которые вы предоставили.

Очевидно, у вас есть указать intercept и slope в aes, чтобы он работал.

library(ggplot2)

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
  geom_point() +
  coord_cartesian(xlim = c(0,10), ylim = c(0,10)) +
  geom_abline(aes(intercept = 0, slope = 0, color = "X"), linetype = "dotted") +
  geom_abline(aes(intercept = 0, slope = 4/3, color = "Y"),linetype = "dashed") +
  scale_color_manual(values = c(X = 'grey', Y = 'black'))

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

2 голосов
/ 13 февраля 2020

Вы можете попробовать создать еще один data.frame, который будет содержать информацию о ваших аблайнах:

df = data.frame(x=runif(10),y=runif(10))
df2 = data.frame(intercept=0,slope=c(4/3,0),type=c("XNULL","YNULL"))

Затем мы можем позвонить geom_abline, указав aes, чтобы мы могли использовать

ggplot(df, aes(x = x, y = y)) + 
geom_point(color = "black", shape = 16, alpha = 1) +
scale_x_continuous(name = "x", limits = c(-5, 5)) + 
scale_y_continuous(name = "y", limits = c(-5, 5)) +
geom_abline(data=df2,aes(intercept=intercept,slope=slope,
linetype=type,col=type),size = 1) +
scale_color_manual(name = "", values = c("XNULL" = "red", "YNULL" = "blue")) +
scale_linetype_manual(name = "", values = c("XNULL" = "dashed", "YNULL" = "dotted")) +
theme(panel.background = element_rect(fill = "white"),
      panel.border = element_rect(colour = "black", fill = NA, size = 1),
legend.position = "bottom")

enter image description here

...