The reason this happens is ggplot "lazy rating". This is a common problem when ggplot used in this way (making layers separately in a loop, instead of having ggplot for you, as in the @hrbrmstr solution).
ggplot stores aes(...) arguments as expressions and evaluates them only when rendering the graph. So, in your loops, something like
aes(y = df[,p], colour = place[p-1])
It is stored as is and evaluated when rendering the graph after the completion of the cycle. At this point, p = 3, so all graphs are displayed with p = 3.
So the “right” way to do this is to use melt(...) in the reshape2 package to convert your data from wide format and let ggplot manage the layers for you. I put “correctly” in quotation marks, because in this particular case there is subtlety. When calculating distributions for the violin using a frame of molten data, ggplot uses the total amount (for both Chicago and Miami) as a scale. If you want the violins to scale individually in frequency, you need to use loops (unfortunately).
The way around the lazy evaluation problem is to reference the loop index in the definition of data=... This is not saved as an expression, the actual data is stored in the schedule definition. So you can do this:
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

which gives the same result as yours. Note that the p index does not appear in aes(...) .
Update: note on scale="width" (mentioned in the comment). This leads to the fact that all the violins have the same width (see below), which is not the same scaling as in the OP source code. IMO is not a great way to visualize data, as it suggests that the Chicago group has a lot more data.
ggplot(gg) +geom_violin(aes(x=topic,y=value,color=variable), alpha=0.3,position="identity",scale="width")
