首页 > 解决方案 > 使用双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,所以它基于我创建的新类别创建了新的个人累积计算。有人可以帮我吗?谢谢

标签: rggplot2aesecdf

解决方案


当您想要执行一个常见的简单统计转换时,您可以在 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)))

在此处输入图像描述


推荐阅读