Preserving comments on graphs for exploratory data analysis In performing exploratory data analysis, I will often print out the graphs and write out comments/annotations etc.
Do people have suggestions for a better electronic methodology? I am especially interested in python/R. 
I am looking for something 'quick (and dirty)' that doesn't slow down the exploratory work, but helps logging insights I have made.
What I could imagine is generating graphs as PDFs and then adding comments.
Ideally I would like the option to do this programmatically, so that if I redo the graphs I can 'automatically' add the comments back in.
 A: Here's an easy solution that many people have found useful. If you find it trivial, I won't disagree. This cuts across statistical software, operating system and other computing details. 
Just copy and paste your graphs into your favourite word or text processor and then add your own comments. That could mean MS Word, software supporting TeX, LaTeX, etc. 
That's it. Clearly the advantages are simplicity (nothing new to learn) and flexibility (add what you want in the way that you want it). 
This isn't an automated solution. But even automated solutions depend on being  fed information on the graphs and your comments, so what is that different? 
A: I highly recommend Jupyter Notebook, which lets you create documents that contain interspersed code blocks, plots, and notes/documentation. The document can include markdown and latex, which is automatically rendered (much like writing on CrossValidated). When you run a code block, any text output and plots that it generates are added inline to the document. You can change a code block and re-run to update the output/plots. This is nice for testing things interactively (e.g. tweaking code/parameters to see what happens). I think it's easier than having to export figures and and paste them into a traditional, static document, especially if you change anything. You can export a notebook to PDF, etc. to get a static copy.
It's open source and works with Python, R, and other languages. The interface is browser-based, so it's cross-platform and easy to share notebooks. You can run the backend on your own machine, or you can host notebooks on a website so you/others can edit/view/run them from anywhere (the code will run on the server). Apparently there's a way to configure the notebook as the frontend to a compute cluster for parallel computations. 
A: I tend to do more and more analyses in R notebooks within RStudio. This way, I can have code, annotations and graphs toghether in one place and don't have to produce pdfs all the time - which is a real time saver. You write text and code in an editor and by clicking on a button, the code is executed (and the graph drawn) in place. So text, code and plot stay neatly together. It is also very easy to convert into HTML or PDF by some mouse clicks.
I don't know, how well this works with Python, as I mostly use R.
A: It sounds like you want some kind of literate programming.  R affords Sweave, and Knitr that interface with LaTeX.  There are other options for different kinds of output formats, such as ODFweave for editable documents (like Word documents), and RMarkdown that can output multiple types (like HTML in addition to the above mentioned).  Other statistical software commonly have analogous features.  
(There is a bit of up-front work in using these.  I typically do one-off projects instead of longer-term projects that require regular, and similar, reports, so I typically use @NickCox's method of dumping or copying to a file and writing comments around it.)  
A: In R: Sometimes I add an extra plot to a pdf with some basic information. This is most useful if the annotations are short and relate to the plot data such that you can paste extra information. For example:
pdf("cars-plots.pdf")
plot(cars)
plot.new()
legend("center", bty = "n", legend =
           paste0("Data: 'cars'\n",
                  "cor = ", round(cor(cars)[1, 2], 2), "\n",
                  "N = ", nrow(cars), "\n",
                  Sys.Date()))
dev.off()

Alternatively, if you have longer annotations, producing a report using R Markdown might be a solution.
