r - 使用双aes在GGplot中制作ECDF图
问题描述
我有点坚持如何使用超过 1 个 aes(可能是颜色、线型geom_line
或形状)来获取 ECDF(线和点组合在一起)图geom_point
。所以,我有这个代码例如
data<-mtcars
data$cyl<-as.factor(data$cyl)
data$am<-as.factor(data$am)
ggplot(data,aes(qsec))+
geom_line(stat = "ecdf",aes(linetype=cyl))+
geom_point(stat="ecdf",size=2,aes(shape=cyl))+
labs(x="sample")+
theme(axis.title.y = element_blank(),
text = element_text(size = 11, family = "serif"))+
scale_y_continuous(labels = function(x) paste0(sprintf("%1.0f", x*100),"%"))+
scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x),
labels = trans_format("log10", math_format(10^.x))
)
它是由 cyl 类型很好地形成的 ECDF 图
但是,然后我想根据am
类别标记一些点,在 的 aes 中添加 color=am geom_point
,结果似乎是随机分散的
我想,这是因为我使用了 ECDF,所以它基于我创建的新类别创建了新的个人累积计算。有人可以帮我吗?谢谢
解决方案
当您想要执行一个常见的简单统计转换时,您可以在 ggplot 中使用的各种统计信息很有帮助,但通常如果您正在尝试做一些不寻常的事情,就像您在这里所做的那样(显示 ecdfs 按一组划分,颜色划分为另一组),它们会使实现目标变得更加困难,而不仅仅是传递您实际想要绘制的数据:
data <- mtcars
data$cyl <- as.factor(data$cyl)
data$am <- as.factor(data$am)
data$ecdf <- numeric(nrow(data))
data <- do.call(rbind, lapply(split(data, data$cyl), function(x) {
x$ecdf <- ecdf(x$qsec)(x$qsec);
x[order(x$ecdf),]
}))
ggplot(data, aes(qsec, ecdf)) +
geom_line(aes(linetype = cyl)) +
geom_point(size = 2, aes(shape = cyl, colour = am)) +
labs(x = "sample") +
theme(axis.title.y = element_blank(),
text = element_text(size = 11, family = "serif")) +
scale_y_continuous(labels = function(x) paste0(sprintf("%1.0f", x*100), "%")) +
scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x),
labels = trans_format("log10", math_format(10^.x)))
推荐阅读
- docker - 将 JHipster 6.0.1 推送到 Gitlab 存储库
- reactjs - 尽管函数更改了 var,但 DOM 未更新
- kubernetes - 为 docker 配置后,minikube 不再运行
- python - 无法导入循环导入问题的名称“app”
- shell - 如何使用相同的文件夹名称 tar gzip
- shell - 如何获取从最后一个匹配到文件末尾的行?
- r - 使用 optim() 求解方程
- angular - 错误 TS2484 和 TS2416 使用带角度的全日历
- typescript - 使用通用字符串作为对象的键
- android - Autocompletetextview 返回指定为非空的参数为空