【问题标题】:Plot factor as line or area instead of rectangle将因子绘制为线或区域而不是矩形
【发布时间】:2015-11-19 07:37:34
【问题描述】:

我有一个因子和一个数值向量。当我绘制这些使用

plot(factor ~ vector, data)

看起来像这样:

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

y 轴代表(累积)频率。

问题是,当我告诉 R 使用线条绘图时,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 绘制的理想结果只是幻想来说明我想要什么样的情节。

标签: r plot


【解决方案1】:

这是一个使用 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

编辑:仅使用 base-R(不错的挑战)

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

需要将数据转换为一系列 x 和 y 坐标来绘制多边形。它们需要按正确的顺序排列(在本例中,x 增加的“下”范围和 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)

【讨论】:

  • 很好,谢谢。我会稍等一下,看看是否有人提出了基本情节解决方案,否则这正是我想要的。
  • @what 为什么需要base-R? ggplot 的外观可以修改,在基础 R 中你可能需要摆弄多边形。
  • 因为我并不总是有可用的软件包(例如,如果我在一台未连接到互联网的计算机上,这很常见),而且因为我不喜欢 ggplot2s 的外观和外观不想学习如何摆弄它以使其看起来像一个基本情节。例如。我不喜欢 gey 背景和灰色刻度标签,想要没有网格和黑色标签的白色背景。
  • @what 我为您添加了一个 base-R 解决方案(很好的挑战)。 [+ theme_bw() in ggplot' 虽然解决了很多问题,但没有互联网就没有互联网就没有 ggplot。
  • 漂亮!非常感谢!
【解决方案2】:

你想要这样的东西吗?

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

【讨论】:

  • 这与提供的所需输出不匹配。
  • 虽然这不是累积的,但正如我所愿,它也是数据的良好表示,我很高兴您提供了这个示例供我学习。我什至可能最终选择这样做。谢谢。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多