频率图使用ggplot挂起或不显示情节

时间:2012-01-09 20:57:48

标签: r ggplot2

我有一个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

1 个答案:

答案 0 :(得分:3)

有几个问题。首先,您创建dfrmwidth的方式是一个因素。

> 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)

enter image description here

虽然看起来只有一条线,但实际上有4条线,所有线都在彼此之上。您只能看到最后绘制的一个(组“d”)。这指出了第二个问题:您的binwidth对于此数据来说太大了。

ggplot(dfrm, aes(width, ..density.., colour = group)) +                  
   geom_freqpoly(binwidth = 10)

geom_freqpoly似乎没有fill美学。

enter image description here