我要绘制四个系列。
有2种型号:xg和algo30。
数据有两种:预测的和观察的。
这意味着我们有以下4个系列:“预测的xg”,“观察的xg”,“预测的30”,“观察的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))
答案 0 :(得分:3)
通常在制作这样的图例时,我会去看override.aes
中的guide_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"))