3 回答
TA贡献1725条经验 获得超7个赞
发生这种情况的原因是由于ggplot
“懒惰评估”。当ggplot
以这种方式使用时,这是一个常见的问题(将这些层分别放在一个循环中,而不是ggplot
像你在@ hrbrmstr的解决方案中那样使用它)。
ggplot
将参数存储aes(...)
为表达式,并仅在渲染绘图时对其进行求值。所以,在你的循环中,类似于
aes(y = df[,p], colour = place[p-1])
按原样存储,并在循环完成后渲染绘图时进行评估。此时,p = 3,因此所有图都以p = 3呈现。
因此,执行此操作的“正确”方法是melt(...)
在reshape2
包中使用,以便将数据从宽格式转换为长格式,并让您ggplot
管理图层。我把“正确”放在引号中,因为在这种特殊情况下有一个微妙之处。在使用融合数据框计算小提琴的分布时,ggplot
使用总计(芝加哥和迈阿密)作为比例。如果你想要基于单独缩放频率的小提琴,你需要使用循环(遗憾地)。
延迟评估问题的方法是在data=...
定义中对循环索引进行任何引用。这不是作为表达式存储的,实际数据存储在绘图定义中。所以你可以这样做:
g <- ggplot(df,aes(x=topic))for (p in 2:length(df)) { gg.data <- data.frame(topic=df$topic,value=df[,p],city=names(df)[p]) g <- g + geom_violin(data=gg.data,aes(y=value, color=city))}g
这会产生与你相同的结果。请注意,索引p
不会显示在aes(...)
。
更新:关于scale="width"
(在评论中提到)的说明。这导致所有小提琴具有相同的宽度(见下文),这与OP的原始代码中的缩放不同。IMO这不是一个可视化数据的好方法,因为它表明芝加哥集团有更多的数据。
ggplot(gg) +geom_violin(aes(x=topic,y=value,color=variable), alpha=0.3,position="identity",scale="width")
TA贡献1825条经验 获得超6个赞
你可以做到没有循环:
df.2 <- melt(df)
gg <- ggplot(df.2, aes(x=topic, y=value))
gg <- gg + geom_violin(position="identity", aes(color=variable), alpha=0.3)
gg
- 3 回答
- 0 关注
- 1283 浏览
添加回答
举报