3 回答

TA貢獻1725條經(jīng)驗 獲得超8個贊
發(fā)生這種情況的原因是由于ggplot
“懶惰評估”。當ggplot
以這種方式使用時,這是一個常見的問題(將這些層分別放在一個循環(huán)中,而不是ggplot
像你在@ hrbrmstr的解決方案中那樣使用它)。
ggplot
將參數(shù)存儲aes(...)
為表達式,并僅在渲染繪圖時對其進行求值。所以,在你的循環(huán)中,類似于
aes(y = df[,p], colour = place[p-1])
按原樣存儲,并在循環(huán)完成后渲染繪圖時進行評估。此時,p = 3,因此所有圖都以p = 3呈現(xiàn)。
因此,執(zhí)行此操作的“正確”方法是melt(...)
在reshape2
包中使用,以便將數(shù)據(jù)從寬格式轉(zhuǎn)換為長格式,并讓您ggplot
管理圖層。我把“正確”放在引號中,因為在這種特殊情況下有一個微妙之處。在使用融合數(shù)據(jù)框計算小提琴的分布時,ggplot
使用總計(芝加哥和邁阿密)作為比例。如果你想要基于單獨縮放頻率的小提琴,你需要使用循環(huán)(遺憾地)。
延遲評估問題的方法是在data=...
定義中對循環(huán)索引進行任何引用。這不是作為表達式存儲的,實際數(shù)據(jù)存儲在繪圖定義中。所以你可以這樣做:
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
這會產(chǎn)生與你相同的結(jié)果。請注意,索引p
不會顯示在aes(...)
。
更新:關(guān)于scale="width"
(在評論中提到)的說明。這導致所有小提琴具有相同的寬度(見下文),這與OP的原始代碼中的縮放不同。IMO這不是一個可視化數(shù)據(jù)的好方法,因為它表明芝加哥集團有更多的數(shù)據(jù)。
ggplot(gg) +geom_violin(aes(x=topic,y=value,color=variable), alpha=0.3,position="identity",scale="width")

TA貢獻1825條經(jīng)驗 獲得超6個贊
你可以做到?jīng)]有循環(huán):
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 關(guān)注
- 1348 瀏覽
添加回答
舉報