我经常遇到一个问题,我有一个数据框,它有一个x变量,一个或多个facet变量,以及多个不同的其他变量。有时我想同时将不同的y变量绘制为单独的行。但它始终只是我想要的一个子集。我已经尝试使用融合来获取“变量”作为列并使用它,如果我想要原始数据集中的每一列,它都可以工作。通常我没有。
现在,我一直在做的事情真是迂回感觉。假设使用mtcars我想对mpg:
绘制disp,hp和wtggplot(mtcars, aes(x=mpg)) +
geom_line(aes(y=disp, color="disp")) +
geom_line(aes(y=hp, color="hp")) +
geom_line(aes(y=wt, color="wt"))
这感觉真的很多余。如果我首先融化mtcars,那么所有变量都会融化,然后我将最终绘制出我不想要的其他变量。
有没有人有这样做的好方法?
答案 0 :(得分:13)
ggplot总是更喜欢长格式的数据框,所以melt
它:
mtcars.long <- melt(mtcars, id = "mpg", measure = c("disp", "hp", "wt"))
ggplot(mtcars.long, aes(mpg, value, colour = variable)) + geom_line()
答案 1 :(得分:1)
不建议使用reshape2,我使用tidyverse
软件包中的 pivot_longer 更新了@kohske答案。
说明旋转here,涉及指定要重塑的数据,第二个参数描述需要重塑的列(使用-排除该列)。第三是 names_to 给出将从存储在列名称中的数据创建的变量的名称。最后, values_to 给出将从存储在单元格值(即count)中的数据创建的变量的名称。它们还具有更复杂的示例,例如列名中的数字,例如wk1 wk2等。
# new suggestion
library(tidyverse)
# I subset to just the variables wanted so e.g. gear and cab are not included
mtcars.long <- mtcars %>%
select("mpg","disp", "hp", "wt") %>%
pivot_longer(-mpg, names_to = "variable", values_to = "value")
head(mtcars.long)
# # A tibble: 6 x 3
# mpg variable value
# <dbl> <chr> <dbl>
# 1 21 disp 160
# 2 21 hp 110
# 3 21 wt 2.62
# 4 21 disp 160
# 5 21 hp 110
# 6 21 wt 2.88
ggplot(mtcars.long, aes(mpg, value, colour = variable)) + geom_line()
图表是: