使用ggplot2以给定的x值绘制数据帧的每一行

时间:2017-11-05 11:48:29

标签: r ggplot2

使用matplot,我可以在给定的 x 值下为数据帧的每一行绘制一条线。例如

set.seed(1)
df <- matrix(runif(20, 0, 1), nrow = 5)

matplot(t(df), type = "l", x = c(1, 3, 7, 9)) # c(1, 3, 7, 9) are the x-axis positions I'd like to plot along
# the line colours are not important

我想使用ggplot2代替,但我不确定如何最好地复制结果。使用melt我可以将列重命名为所需的x值,如下所示。但是,我缺少一种“更清洁”的方法吗?

df1 <- as.data.frame(df)
names(df1) <- c(1, 3, 7, 9) # rename columns to the desired x-axis values
df1$id <- 1:nrow(df1)
df1_melt <- melt(df1, id.var = "id")
df1_melt$variable <- as.numeric(as.character(df1_melt$variable)) # convert x-axis values from factor to numeric

ggplot(df1_melt, aes(x = variable, y = value)) + geom_line(aes(group = id))

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

autoplot.zoo可以做矩阵数据的ggplot图形。如果需要单独的面板,请省略facet参数。输入在最后的注释中定义。

library(ggplot2)
library(zoo)

z <- zoo(t(m), x)  # use t so that series are columns

autoplot(z, facet = NULL) + xlab("x")

screenshot

注意:使用的输入:

set.seed(1)

m <- matrix(runif(20, 0, 1), nrow = 5)
rownames(m) <- c("a", "b", "c", "d", "e")

x <- c(1, 3, 7, 9)

答案 1 :(得分:2)

由于ggplot2越来越多地被用作tidyverse系列软件包的一部分,我想我会发布tidy方法。

# generate data
set.seed(1)
df <- matrix(runif(20, 0, 1), nrow = 5) %>% as.data.frame

# put x-values into a data.frame
x_df <- data.frame(col=c('V1', 'V2', 'V3', 'V4'), 
                   x=c(1, 3, 7, 9))

# make a tidy version of the data and graph
df %>%
    rownames_to_column %>%
    gather(col, value, -rowname) %>%
    left_join(x_df, by='col') %>%
    ggplot(aes(x=x, y=value, color=rowname)) +
        geom_line()

关键的想法是将gather()数据整理成整齐的格式,以便数据不是5行×4列,而是20行×1 value列以及其他一些标识符列(colrowname,最后x)在此特定情况下)。