首页 > 解决方案 > ggplot2:一组实线,另一组点

问题描述

我有四个系列要绘制。
有 2 个模型:xg 和 algo30。有两种类型的数据:预测的和观察到的。
这意味着我们有以下 4 个系列:“predicted xg”、“observed xg”、“predicted 30”、“observed 30”。

我希望“xg”为蓝色,“algo30”为红色。我还希望预测为实线并观察为点。

这就是我的意思,使用基本图:

library(magrittr)
library(ggplot2)
library(dplyr)

set.seed(123)
gr <- 1:10
obs.xg <- sort(runif(10, 0.5, 1))
obs.30 <- sort(runif(10, 0.5, 1))
pred.xg <- lm(obs.xg~gr) %>% predict() %>% add(rnorm(10,0,.01))
pred.30 <- lm(obs.30~gr) %>% predict() %>% add(rnorm(10,0,.01))        
plot(gr, obs.xg, col="darkblue", ylim=range(c(obs.xg,obs.30)), pch=20)
lines(gr, pred.xg, col="darkblue", lwd=2)
points(gr, obs.30, col="firebrick", pch=20)
lines(gr, pred.30, col="firebrick", lwd=2)
legend("bottomright", 
  pch=c(20,NA,NA,NA,NA),
  lty=c(NA,1,NA,1,1),
  lwd=c(NA,1,NA,2,2),
  col = c("black","black",NA, "darkblue","firebrick"),
  legend=c("observé","prédit",NA,"xgboost","algo30"),
  bty='n')

在此处输入图像描述

这是我使用 ggplot 的最佳尝试。请注意,图例无法按我的意愿工作。

xg.data <- data.frame(model= "xg", decile = seq(1:10), observed = obs.xg, predicted = pred.xg)
algo30.data <- data.frame(model = "algo30",decile = seq(1:10),  observed = obs.30, predicted = pred.30)
ggplotdata <- bind_rows(xg.data, algo30.data)

ggplotdata %>%
   ggplot( aes(x=decile, y= predicted, color= model))+ geom_line()+
  geom_point(aes(x=decile, y= observed, color = model))

在此处输入图像描述

标签: rggplot2

解决方案


大多数时候,当我创造这样的传奇时,我期待override.aesguide_legend()

这里的想法是使用您不希望映射到绘图本身的附加美学来制作图例,然后使用常量而不是该美学的变量。我用过alpha,因为点和线都使用了这种美感。

然后完成繁重的工作scale_alpha_manual:删除图例名称,通过设置 确保情节看起来仍然正确values,然后最后选择正确的点类型和线条以及图例的空白。

ggplot(ggplotdata, aes(x=decile, y= predicted, color= model))+ 
    geom_line( aes(alpha = "prédit") )+
    geom_point(aes(x=decile, y= observed, alpha = "observé")) +
    scale_alpha_manual(name = NULL, values = c(1, 1),
                       guide = guide_legend(override.aes = list(linetype = c(0, 1), shape = c(16, NA)))) +
    scale_color_manual(name = NULL, values = c("firebrick", "darkblue"))

在此处输入图像描述


推荐阅读