r - 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))
解决方案
大多数时候,当我创造这样的传奇时,我期待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"))
推荐阅读
- vue.js - 如何在 vue.js 2 中验证没有 v-model 和 :value 的输入值?
- c# - C# / Azure AD / Graph API - 使用 Open Extensions 设置其他用户属性
- javascript - 如何测试一个使用 window.screen.width 开玩笑的函数
- c++ - CMake 如何处理共享库升级?
- angular - Angular - 如何更改子组件的 url
- python - Alpha Vantage 异步(代码)
- docker - Windows 上的 Docker 容器操作系统和主机操作系统不兼容跳过操作系统验证?
- java - 作为 jar 运行但不在 ide 中运行时出现 SSL 握手问题
- javascript - Vue JS 3:如何将数据从一个组件传递到另一个组件?
- javascript - 角日期选择器空值