我有一个880,000行和2列('width','group')的数据帧,格式如下:
宽度组
20 a
25 a
20 a
25 a
35 b
40 c
20 d
25 d
我想为同一图中的所有四个组创建一个频率多边形,但到目前为止我仍然没有成功。
df1 = cbind(ceiling(rnorm(20, 30,5)), 'a')
df2 = cbind(ceiling(rnorm(40, 80,10)), 'b')
df3 = cbind(ceiling(rnorm(30, 50,8)), 'c')
df4 = cbind(ceiling(rnorm(35, 30,7)), 'd')
dfrm = rbind(df1,rbind(df2,rbind(df3,df4)))
colnames(dfrm)=c('width', 'group')
dfrm = as.data.frame(dfrm)
qplot(width, data = dfrm, geom="freqpoly", binwidth = 100)
#不显示任何情节
ggplot(dfrm, aes(width, ..density.., colour = group)) +
geom_freqpoly(binwidth = 1000) #create more than four plots
我需要绘制类似于以下内容的内容:
http://had.co.nz/ggplot2/graphics/996ae62d750dfccac8805fa0c87168cc.png
或者
http://had.co.nz/ggplot2/graphics/55078149a733dd1a0b42a57faf847036.png
答案 0 :(得分:3)
有几个问题。首先,您创建dfrm
,width
的方式是一个因素。
> str(dfrm)
'data.frame': 125 obs. of 2 variables:
$ width: Factor w/ 60 levels "106","20","21",..: 7 7 17 10 9 9 6 7 17 4 ...
$ group: Factor w/ 4 levels "a","b","c","d": 1 1 1 1 1 1 1 1 1 1 ...
这是因为cbind
创建了一个必须具有相同类型的矩阵,并且因为有一个字符,所以它是一个字符矩阵。后来转换为data.frame使它们成为因素。这可以通过
dfrm$width <- as.numeric(as.character(dfrm$width))
或更好,不要以
开头制作矩阵df1 = data.frame(width=ceiling(rnorm(20, 30,5)), group='a')
df2 = data.frame(width=ceiling(rnorm(40, 80,10)), group='b')
df3 = data.frame(width=ceiling(rnorm(30, 50,8)), group='c')
df4 = data.frame(width=ceiling(rnorm(35, 30,7)), group='d')
dfrm = rbind(df1,df2,df3,df4)
这足以制作图表
ggplot(dfrm, aes(width, ..density.., colour = group)) +
geom_freqpoly(binwidth = 1000)
虽然看起来只有一条线,但实际上有4条线,所有线都在彼此之上。您只能看到最后绘制的一个(组“d”)。这指出了第二个问题:您的binwidth
对于此数据来说太大了。
ggplot(dfrm, aes(width, ..density.., colour = group)) +
geom_freqpoly(binwidth = 10)
geom_freqpoly
似乎没有fill
美学。