将因子绘制为线条或面积而不是矩形

3

我有一个系数和一个数字向量。当我使用

plot(factor ~ vector, data)

它看起来像这样:

enter image description here

但我希望它看起来像这样:

enter image description here

其中y轴表示(累积)频率。

问题是,当我告诉R使用lines绘图时,R告诉我

In rect(xleft, ybottom, xright, ytop, col = col, ...) :
  graphical parameter "type" is obsolete

那么我该如何做呢?

如果使用基本的plot()而不是ggplot或其他类似的解决方案,则会获得额外的分数。颜色并非必需,可以使用灰度值。


示例数据:

a.factor <- c("level1", "level1", "level1", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level3", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level1", "level1", "level1", "level2", "level1", "level1", "level2", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level1", "level2", "level1", "level1", "level1", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level1", "level1", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level1", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level1", "level2", "level2", "level2", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level3", "level1", "level1", "level1", "level3", "level2", "level1", "level2", "level2", "level1", "level1", "level2", "level2", "level2", "level2", "level2", "level2", "level1", "level1", "level1", "level1", "level1", "level1", "level2", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level2", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level1", "level2", "level2", "level2", "level1", "level2", "level2", "level2", "level2", "level1", "level2", "level2", "level1", "level1")
b.vector <- c(314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 317, 318, 318, 318, 318, 318, 318, 318, 319, 319, 319, 319, 319, 320, 320, 320, 320, 320, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321, 321)
dat <- data.frame(a.factor, b.vector)
plot(a.factor ~ b.vector, dat)

我不知道如何在基本的R中实现,但ggplot有geom_ribbongeom_area。你是否意识到你所绘制的期望结果与给定的数据并不完全匹配?在你的数据中,没有超过317的第3级别。 - Heroka
@Heroka 所绘制的期望结果只是幻想,用于说明我想要的情节类型。 - user1322720
2个回答

3

这里有一个使用ggplot和geom_area解决方案。为了正确地强制组合未在数据中出现的堆叠,需要进行一些聚合。

library(ggplot2)
library(data.table)
setDT(dat)

dat_agg <-as.data.table(table(dat)) #thanks @Maju116; sometimes I do things too complicated.


#plot
p1 <- ggplot(dat_agg, 
             aes(x = b.vector, y = N,group = a.factor)) +
  geom_area(aes(fill = a.factor), position = "stack")
p1

这里输入图像描述

编辑:仅使用基本R(不错的挑战)

dat <- data.frame(a.factor, b.vector)

需要将数据转换为一系列的x和y坐标,以便绘制多边形。它们需要按正确的顺序排列(在这个例子中,'lower'范围随着x的增加而增加,'upper'范围随着x的减小而减小)。

#calculate 'upper range' of each polygon
#using cumsum as they're stacked
max_points <- apply(table(dat),MARGIN=2,cumsum)

#lower range for first level is 0, for other levels 
#lower range is upper range of level below it.
min_points <- rbind(0, max_points[1:2,ncol(max_points):1]) #reverse order
rownames(min_points) <- rownames(max_points)

#combine
polydata <- cbind(max_points,min_points)

#x position
x_vector <- as.numeric(colnames(polydata))

#colors
mycols <- c("red","blue","green")

#plotting (empty plot first, then add polygons)
plot(x=b.vector, y=seq(0,100,length.out=length(b.vector)),type="n",
     ylab="frequency")
lapply(1:nrow(polydata),function(i){
  polygon(x=x_vector, y=as.numeric(polydata[i,]),col=mycols[i])
})
legend(x=320, y=100, legend=rownames(polydata),fill=mycols)

enter image description here


好的,谢谢。我会稍等一下,看看是否有人提出了基本的情节解决方案,否则这正是我想要的。 - user1322720
为什么需要使用基础R?ggplot的外观可以修改,在基础R中,您可能需要调整多边形。 - Heroka
因为我并不总是有可用的软件包(例如,如果我使用未连接到互联网的计算机,这种情况经常发生),而且我不喜欢ggplot2的外观,也不想学习如何调整它以使其看起来像基本图。例如,我不喜欢灰色背景和灰色刻度标签,希望有一个没有网格和黑色标签的白色背景。 - user1322720
3
我为你添加了一个基于R的解决方案(很好的挑战)。在ggplot中使用+ theme_bw()可以解决很多问题,但是没有网络就没有ggplot。 - Heroka
太棒了!非常感谢! - user1322720

0
你想要这样的吗?
dane<-data.frame(a.factor,b.vector)
dane<-as.data.frame(table(dane))
library(ggplot2)
ggplot(dane,aes(group=a.factor,x=b.vector,y=Freq,color=a.factor))+geom_point()+geom_line()

http://i.stack.imgur.com/rtj1Z.png


这并不真正符合所提供的期望输出。 - Heroka
虽然这不是我想要的累积形式,但它同样是数据的良好表示,我很高兴你提供了这个例子让我学习。最终我甚至可能会选择这样做。谢谢。 - user1322720

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接