使用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))
非常感谢任何帮助。感谢
答案 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")
注意:使用的输入:
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
列以及其他一些标识符列(col
,rowname
,最后x
)在此特定情况下)。