3 回答

TA貢獻1725條經驗 獲得超8個贊
發生這種情況的原因是由于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 關注
- 1352 瀏覽
添加回答
舉報