Zusammenfassung: Wenn ich eine "for" -Schleife zum Hinzufügen von Layern zu einem Violin-Plot (in ggplot) verwende, wird nur die Ebene hinzugefügt, die durch die letzte Loop-Iteration erstellt wurde . In explizitem Code, der den von der Schleife erzeugten Code nachahmt, werden jedoch alle Ebenen hinzugefügt."for" -Schleife fügt nur die finale ggplot-Ebene hinzu
Details: Ich versuche Violinendiagramme mit überlappenden Layern zu erstellen, um zu zeigen, inwieweit sich die geschätzten Verteilungen für mehrere Umfragefragen stratifiziert nach Ort oder nicht überschneiden. Ich möchte in der Lage sein, eine beliebige Anzahl von Orten einzuschließen, so dass ich für jeden Ort eine Spalte nach Datenrahmen habe und versuche, eine "for" -Schleife zu verwenden, um eine ggplot-Ebene pro Ort zu erzeugen. Die Schleife fügt jedoch nur die Ebene aus der letzten Iteration der Schleife hinzu.
Dieser Code zeigt das Problem, und einige Ansätze vorgeschlagen, die fehlgeschlagen:
library(ggplot2)
# Create a dataframe with 500 random normal values for responses to 3 survey questions from two cities
topic <- c("Poverty %","Mean Age","% Smokers")
place <- c("Chicago","Miami")
n <- 500
mean <- 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
# per http://stackoverflow.com/questions/15987367/how-to-add-layers-in-ggplot-using-a-for-loop , I tried
g <- ggplot(df, aes(factor(topic), df[,2]))
for (p in names(df)[-1]) {
cat(p,"\n")
g <- g + geom_violin(aes_string(y = p, colour = p), alpha = 0.3) # produced this error: Error in unit(tic_pos.c, "mm") : 'x' and 'units' must have length > 0
# g <- g + geom_violin(aes_string(y = p ), alpha = 0.3) # produced this error: Error: stat_ydensity requires the following missing aesthetics: y
}
g
# but that failed to produce any graphic, per the errors noted in the "for" loop above
, warum Sie nicht 'melt' den Datenrahmen zu langes Format? – baptiste