第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“for”循環(huán)只添加最終的ggplot圖層

“for”循環(huán)只添加最終的ggplot圖層

滄海一幻覺 2019-08-23 09:58:15
“for”循環(huán)只添加最終的ggplot圖層簡介:當我使用“for”循環(huán)將圖層添加到小提琴圖(在ggplot中)時,添加的唯一圖層是由最終循環(huán)迭代創(chuàng)建的圖層。然而,在模擬循環(huán)將生成的代碼的顯式代碼中,添加了所有層。詳細信息:我正在嘗試創(chuàng)建具有重疊層的小提琴圖,以顯示估計分布對于多個調(diào)查問題響應重疊或不重疊的程度,按地點分層。我希望能夠包含任意數(shù)量的地方,因此每個地方我都有一列數(shù)據(jù)框,并且我嘗試使用“for”循環(huán)來為每個地方生成一個ggplot圖層。但是循環(huán)只會從循環(huán)的最后一次迭代中添加該層。此代碼說明了問題,以及一些失敗的建議方法:library(ggplot2) # Create a dataframe with 500 random normal values for responses to 3 survey questions from two citiestopic <- c("Poverty %","Mean Age","% Smokers")place <- c("Chicago","Miami")n <- 500mean <- c(35,  40,58,  50, 25,20)var  <- c( 7, 1.5, 3, .25, .5, 1)df <- data.frame( topic=rep(topic,rep(n,length(topic)))                 ,c(rnorm(n,mean[1],var[1]),rnorm(n,mean[3],var[3]),rnorm(n,mean[5],var[5]))                 ,c(rnorm(n,mean[2],var[2]),rnorm(n,mean[4],var[4]),rnorm(n,mean[6],var[6]))                )names(df)[2:dim(df)[2]] <- place  # Name those last two columns with the corresponding place name.head(df) # This "for" loop seems to only execute the final loop (i.e., where p=3)g <- ggplot(df, aes(factor(topic), df[,2]))for (p in 2:dim(df)[2]) {  g <- g + geom_violin(aes(y = df[,p], colour = place[p-1]), alpha = 0.3)}g# But mimicing what the for loop does in explicit code works fine, resulting in both "place"s being displayed in the graph.g <- ggplot(df, aes(factor(topic), df[,2]))g <-   g + geom_violin(aes(y = df[,2], colour = place[2-1]), alpha = 0.3)g <-   g + geom_violin(aes(y = df[,3], colour = place[3-1]), alpha = 0.3)g## per http://stackoverflow.com/questions/18444620/set-layers-in-ggplot2-via-loop , I tried g <- ggplot(df, aes(factor(topic), df[,2]))for (p in 2:dim(df)[2]) {  df1 <- df[,c(1,p)]  g <- g + geom_violin(aes(y = df1[,2], colour = place[p-1]), alpha = 0.3)}g# but got the same undesired result
查看完整描述

3 回答

?
qq_遁去的一_1

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


查看完整回答
反對 回復 2019-08-23
?
胡子哥哥

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


查看完整回答
反對 回復 2019-08-23
  • 3 回答
  • 0 關(guān)注
  • 1348 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號