Question: Plotting linear trend using the ggplot2 for multiple columns elements
0
gravatar for mohammedtoufiq91
10 weeks ago by
mohammedtoufiq9190 wrote:

Hi,

I have a question, I am using the ggplot2 package for plotting the linear trend using the data frame. The rows contains different timepoints (1, 2, 3) and the columns contain values under the headers (A, B. C, D,.....Z). Using the below code, I can plot only one column per run and save and export it. Is there a way to use or looping all the columns (B, C, D, E,......Z) corresponding to the Timepoints to plot and save it locally on the machine. I have hundreds of columns like this.

Example of a dataframe:

Timepoints  A   B
1   -1.6774235  2.6583222
2   -1.80880562 2.868172
3   -1.8716294  2.8304835

Code:

library(ggplot2)
library(hrbrthemes)
p3 <- ggplot(dataframe, aes(x=Timepoints, y=A)) +
    geom_point() +
    geom_smooth(method=lm , color="red", fill="#69b3a2", se=TRUE) +
    theme_ipsum()

Thank you,

Toufiq

R looping ggplot2 linear save • 163 views
ADD COMMENTlink modified 10 weeks ago by Kevin Blighe52k • written 10 weeks ago by mohammedtoufiq9190
2
gravatar for Kevin Blighe
10 weeks ago by
Kevin Blighe52k
Kevin Blighe52k wrote:

Hey, here is one way to do it via lapply() and aes_string()

Create random data

ggdata <- data.frame(
  Timepoints = c(1:5),
  matrix(rexp(20, rate=.1), ncol=4))
colnames(ggdata) <- c('Timepoints', 'A', 'B', 'C', 'D')

ggdata
  Timepoints         A        B         C         D
1          1  4.989092 5.805021 30.899651 16.831086
2          2 19.720387 8.898303 12.004030 17.947039
3          3  1.007443 3.966031  5.839473  4.721005
4          4 12.472524 8.367984  3.200908 21.200863
5          5 38.603744 2.362598  6.056351 10.085905

Use lapply() over the column names to create a separate plot, and return to a list object, p

library(ggplot2)
library(hrbrthemes)

p <- lapply(
  colnames(ggdata)[2:5],
  function(col) ggplot(ggdata, aes_string(x = 'Timepoints', y = col)) +
    geom_point() +
    geom_smooth(method=lm , color="red", fill="#69b3a2", se=TRUE) +
    theme_ipsum())

Plot the data

require(cowplot)
plot_grid(
  p[[1]], p[[2]], p[[3]], p[[4]],
  ncol = 4,
  labels = colnames(ggdata)[2:5])

ffff

There is also a way via facet_grid() and facet_wrap() (not shown here).

Kevin

ADD COMMENTlink modified 10 weeks ago • written 10 weeks ago by Kevin Blighe52k

Thank you so much @Kevin Blighe. This resolved the issue and was very helpful.

Another related query is, I would like to export each of these plots to the .pdf file format to the local drive since I have more elements in the object. i.e

p[[1]], p[[2]], p[[3]], p[[4]], ........, p[[100]]

Is this something possible?

ADD REPLYlink modified 10 weeks ago • written 10 weeks ago by mohammedtoufiq9190
1

Hey, yes, you can modify the code somewhat so that it will work with any number of plots. Here, I do it for 50 groups:

ggdata <- data.frame(
  Timepoints = c(1:5),
  matrix(rexp(250, rate=.1), ncol=50))
colnames(ggdata) <- c('Timepoints', paste0('Group', 1:50))

library(ggplot2)
library(hrbrthemes)

p <- lapply(
  colnames(ggdata)[2:ncol(ggdata)],
  function(col) ggplot(ggdata, aes_string(x = 'Timepoints', y = col)) +
    geom_point() +
    geom_smooth(method=lm , color="red", fill="#69b3a2", se=TRUE) +
    theme_ipsum())

require(cowplot)
margin <- theme(
  plot.margin = unit(c(0.2, 0.2, 0.2, 0.2), 'cm'),
  plot.title = element_blank(),
  plot.subtitle = element_blank(),
  plot.caption = element_blank())
plots <- lapply(p, '+', margin)

cairo_pdf('out.pdf', width =24, height = 14)
  plot_grid(
    do.call(plot_grid, c(plots, ncol = 10, nrow = 5)),
    ncol = 1)
dev.off()

jjj

Note that the margin part is not required - it just helps to save space. You may also want to break up the plot numbers across multiple pages. Simply run separate plot_grid() commands for that.

ADD REPLYlink written 10 weeks ago by Kevin Blighe52k
1

Thank you so much Kevin.

ADD REPLYlink written 10 weeks ago by mohammedtoufiq9190
Please log in to add an answer.

Help
Access

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.
Powered by Biostar version 2.3.0
Traffic: 1413 users visited in the last hour