1

I have to make 4 plots which differ only for y and ylab. I start from a data.table dt which is

set.seed(123)
dt <- data.table(a = rnorm(20),
                 b = rnorm(20), 
                 c = rnorm(20), 
                 d = rnorm(20), 
                 e = rnorm(20))

Every single plot should be a scatterplot with row numbers as x vs y values. Additionally, I want to plot some hline at median(y) + h*mad(y) where h = c(0, -2, 2, -3, 3)

This plot should be repeated for columns a, c, d and e of dt.

I came up with this bit of code

# Defining y labels #
ylabels <- c(bquote(phantom(.)^100*A~"/"*phantom(.)^200*A),
             bquote(phantom(.)^101*C~"/"*phantom(.)^201*B),
             bquote(phantom(.)^102*D~"/"*phantom(.)^202*D),
             bquote(phantom(.)^103*E~"/"*phantom(.)^202*E))

# Selecting columns of dt    
ydata <- names(dt)[c(1, 3, 4, 5)]


h <- c(0, -2, 2, -3, 3)
hcol <- c("#009E73", "#E69F00", "#E69F00", "red", "red")

# The for cycle should create the 4 plots and assign them to a list 
plots <- list()
for (i in seq_along(ydata)) {

    p1 <- ggplot(dt, aes_string(x = seq(1, dt[, .N]), y = ydata[i])) +
                     geom_point() +
                     geom_hline(aes_string(yintercept = median(ydata[i]) + 
                                       h * mad(ydata[i])), color = hcol) +
                     xlab("Replicate") + 
                     ylab(ylabels[i]) +
                     scale_x_continuous(breaks = seq(1, dt[,.N])))

     plots[[i]] <- p1  # add each plot into plot list
     }

Then plots will be fed to the multiplot function from Cookbook for R.

However my loop doesn't work properly because it fails to calculate the median and mad values. Do you have any suggestions to make the code work?

1 Answer 1

1
# data.table with the median +- h* mad values
hline.values <- dt[, lapply(.SD, function(x) median(x) + h * mad(x)),
                   .SDcols = ydata]

# new empty list
plots <- list()

for (i in seq_along(ydata)) {

       p1 <- ggplot(dt, aes_string(x = seq(1, dt[, .N]), y = ydata[i])) +
             geom_point() +
             geom_hline(data = hline.values, 
                        aes_string(yintercept = ydata[i])) +
             # Axis labels and theme
             xlab("Replicate") +
             ylab(ylabels[[i]]) +
             scale_x_continuous(breaks = seq(1, dt[, .N]))

        plots[[i]] <- p1
}
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.