This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Continuously add lines to ggplot with for loop

Hi there,

I have an object called gPlot and I want to continuously add geom_lines to the gPlot object.

# df is a dataframe
sstart ssend
167    2637
552    8273

My following code is :

gPlot<-ggplot() + geom_line(aes(x=1:6549, y=1, colour="red")) + geom_line(aes(x=295:1218, y=.99, colour="blue")) + geom_line(aes(x=3084:4340, y=.99, colour="green"))+coord_cartesian(xlim = c(0, 6549), ylim = c(0,1)) +  xlab("coordinates") + ylab("regions")

geomLine <- NULL
for(i in 1:nrow(df)){
  rowDF<-df[i,]
  dfstart <-rowDF$sstart
  dfend<-rowDF$send
  geomLine<-gPlot+geom_line(aes(x=dfstart:dfend, y=.95, colour="black"))
}

However, when I plot the new ranges from the df, the plot does not add all the ranges but, just puts the last number range. Any help would be appreciated.

Thanks!

r ggplot2

did you find the reason why this happen in the for loop?

2 answers

I finally solved the above question after staring at the computer. Using aes_string() made it work.

for(i in 1:nrow(stool_polyketide_analysis_df_vfam)){
  rowDF<-stool_polyketide_analysis_df_vfam[i,]
  dfstart <-rowDF$sstart
  dfend<-rowDF$send
  gPlot<-gPlot+geom_line(aes_string(x=dfstart:dfend, y=.95-.005*i))
}

Believe it or not, this is the best answer to solving the looping problem with ggplot. Most of the answers have a lot of elaborate schemes that I was not able to get to work. This simple one works!! Thanks

thank you, one-week struggle finally solved

"after staring at the computer" ... lfmao

I think the answer is very simple, do not use an aes call. The updated code should look as below:

gPlot<-ggplot() + geom_line(aes(x=1:6549, y=1, colour="red")) + geom_line(aes(x=295:1218, y=.99, colour="blue")) + geom_line(aes(x=3084:4340, y=.99, colour="green"))+coord_cartesian(xlim = c(0, 6549), ylim = c(0,1)) +  xlab("coordinates") + ylab("regions")

geomLine <- NULL
for(i in 1:nrow(df)){
  rowDF<-df[i,]
  dfstart <-rowDF$sstart
  dfend<-rowDF$send
  geomLine<-gPlot + 
  geom_line(x=dfstart:dfend, y=.95, colour="black") # new addition
}

Log in to answer this question.