R:ggplot2和带有data.table

时间:2017-03-02 12:19:45

标签: r loops ggplot2 data.table

我必须制作4个图,这些图仅对yylab有所不同。 我从data.table dt开始,这是

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

每个绘图都应该是一个散点图,其行号为xy值。另外,我想在hline median(y) + h*mad(y)

处绘制一些h = c(0, -2, 2, -3, 3)

对于a的{​​{1}},cde列,应重复此图。

我想出了这段代码

dt

然后# 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 } 将从Cookbook for R投放到plots函数。

但是我的multiplot无法正常工作,因为它无法计算中值和疯值。 您有什么建议让代码有效吗?

1 个答案:

答案 0 :(得分: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
}