我想在同一图表中绘制多个变量的CDF图。变量的长度是不同的。为了简化细节,我使用以下示例代码:
library("ggplot2")
a1 <- rnorm(1000, 0, 3)
a2 <- rnorm(1000, 1, 4)
a3 <- rnorm(800, 2, 3)
df <- data.frame(x = c(a1, a2, a3),ggg = gl(3, 1000))
ggplot(df, aes(x, colour = ggg)) + stat_ecdf()+ coord_cartesian(xlim = c(0, 3)) + scale_colour_hue(name="my legend", labels=c('AAA','BBB', 'CCC'))
正如我们所看到的,a3是800长度,与a1,a2不同。 当我运行代码时,它显示:
> df <- data.frame(x = c(a1, a2, a3),ggg = gl(3, 1000))
Error in data.frame(x = c(a1, a2, a3), ggg = gl(3, 1000)) :
arguments imply differing number of rows: 2800, 3000
> ggplot(df, aes(x, colour = ggg)) + stat_ecdf()+ coord_cartesian(xlim = c(0, 3)) + scale_colour_hue(name="my legend", labels=c('AAA','BBB', 'CCC'))
Error: ggplot2 doesn't know how to deal with data of class function
那么,如何使用ggplot2绘制同一图形中不同长度的不同变量的cdf图?期待有帮助!
答案 0 :(得分:2)
你是对的,因为ggplot确实在每组中都需要相同数量的计数。因此,您可以自己进行计算
,而不是使用stat_ecdf
library(ggplot2)
a1 <- rnorm(1000, 0, 3)
a2 <- rnorm(1000, 1, 4)
a3 <- rnorm(800, 2, 3)
df <- data.frame(x = c(a1, a2, a3),ggg = factor(rep(1:3, c(1000,1000,800))))
df <- df[order(df$x), ]
df$ecdf <- ave(df$x, df$ggg, FUN=function(x) seq_along(x)/length(x))
ggplot(df, aes(x, ecdf, colour = ggg)) + geom_line() + scale_colour_hue(name="my legend", labels=c('AAA','BBB', 'CCC'))
请注意,您错误地使用了gl()
;您的代码假设所有三个组都有1000个条目。在这里,我已将其更改为rep()
,以便为每个组获得正确数量的标签。
答案 1 :(得分:2)
ggplot
可以毫不费力地处理每组中的不同计数。问题在于你创建了因子ggg。使用此:
library(ggplot2)
a1 <- rnorm(1000, 0, 3)
a2 <- rnorm(1000, 1, 4)
a3 <- rnorm(800, 2, 3)
df <- data.frame(x = c(a1, a2, a3), ggg=factor(rep(1:3, c(1000,1000,800))))
ggplot(df, aes(x, colour = ggg)) +
stat_ecdf()+
scale_colour_hue(name="my legend", labels=c('AAA','BBB', 'CCC'))
此外,设置xlim=c(0,3)
的方式设置[0,3]
,在{{1}}上绘制cdf,正如您在上图中所看到的那样或多或少是一条直线。