在同一图中绘制两个变量的频率分布曲线

时间:2016-08-18 06:59:31

标签: r plot

我遇到了问题。以下是我的数据框d

的一瞥
size        Type
1  28.63    complete
2  24.44    complete
3  31.45    complete
4  23.12    complete
5  20.86    complete
6  15.70  incomplete
7  12.77    complete
8  29.51    complete
9  28.71    complete

我试图得到一个单独的频率分布曲线,表示不完整和完整,由相同图表中的单独符号表示,大小和频率分别为我的x和y轴。

情节应该是这样的。

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试使用ggplot2包。

library(ggplot2)
df <- data.frame(size=c(28.63,24.44,31.45,23.12,20.86,15.70,12.77,29.51,28.71),Type=c('complete','complete','complete','complete','complete','incomplete','complete','complete','complete'))
ggplot(df, aes(linetype = Type)) + geom_density(aes(size)) 

enter image description here

答案 1 :(得分:1)

  

(我之前的评论)请问您的size列是否离散?如果是,则列联表是有意义的,否则我们需要先将bin size放入单元格中(可能使用hist,因为它也会返回计数)。我问这个是因为你的size是十进制的,并且怀疑它是一个连续值。

(您的回复)size是离散的。频率由相同大小重复的次数定义,因为它给出了观察频率。

考虑一个玩具示例:

set.seed(0)
x <- data.frame(size = c(rpois(50,3),rpois(50,5)),
                Type = gl(2, 50, labels = c("complete","incomplete")))

我们可能会使用tapply为每种类型使用table()获取列联表:

y <- with(x, tapply(size, Type, table))
#$complete

# 0  1  2  3  4  5  6  8 
# 2  5 12 10 12  6  2  1 

#$incomplete

# 2  3  4  5  6  7  8  9 
# 5  6 13  6  7  8  4  1 

然后我们想将此列表重组为数据框:

z <- do.call(rbind.data.frame,
             lapply(y,
                    function (u) data.frame(size = c(as.numeric(names(u)),NA),
                                            freq = c(unname(u),NA))))

#             size freq
#complete.1      0    2
#complete.2      1    5
#complete.3      2   12
#complete.4      3   10
#complete.5      4   12
#complete.6      5    6
#complete.7      6    2
#complete.8      8    1
#complete.9     NA   NA
#incomplete.1    2    5
#incomplete.2    3    6
#incomplete.3    4   13
#incomplete.4    5    6
#incomplete.5    6    7
#incomplete.6    7    8
#incomplete.7    8    4
#incomplete.8    9    1
#incomplete.9   NA   NA

然后我们可以制作你想要的情节:

# `lty = 1` for "complete", `lty = 2` for "incomplete"
with(z, plot(size, freq, lty = rep(1:2, lengths(y) + 1L), type = "l"))

#with(z, plot(size, freq, pch = "."))
#with(z, lines(size, freq, lty = rep(1:2, lengths(y) + 1L)))

enter image description here

?????我不太明白的事情发生在这里。虽然我设置了plot,但k <- cumsum(lengths(y)) with(z, plot(size, freq, pch = ".")) with(z, lines(size[1:k[1]], freq[1:k[1]], lty = 1)) with(z, lines(size[(k[1]+1):k[2]], freq[(k[1]+1):k[2]], lty = 2)) 没有生成正确的线型。因此,我必须以无聊的方式做到这一点:

EntityProperty

enter image description here