我经常遇到一个问题,我有一个数据框,它有一个x变量,一个或多个facet变量,以及多个不同的其他变量.有时我想同时将不同的y变量绘制为单独的行.但它始终只是我想要的一个子集.我已经尝试使用融合来获取"变量"作为列并使用它,如果我想要原始数据集中的每一列,它都可以工作.通常我没有.
现在我一直在做的事情真的很迂回感觉就像.假设使用mtcars我想对mpg绘制disp,hp和wt:
ggplot(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"))
Run Code Online (Sandbox Code Playgroud)
这感觉真的很多余.如果我首先融化mtcars,那么所有变量都会融化,然后我将最终绘制出我不想要的其他变量.
有没有人有这样做的好方法?
koh*_*ske 15
ggplot总是喜欢长格式数据帧,所以melt它:
mtcars.long <- melt(mtcars, id = "mpg", measure = c("disp", "hp", "wt"))
ggplot(mtcars.long, aes(mpg, value, colour = variable)) + geom_line()
Run Code Online (Sandbox Code Playgroud)
随着 reshape2 被弃用,我使用包中的ivot_longertidyverse更新了@kohske答案。
此处解释了透视,并涉及指定要重塑的数据,第二个参数描述了哪些列需要重塑(使用 - 排除该列)。第三个是names_to,给出将从存储在列名中的数据创建的变量的名称。最后,values_to给出了将从单元格值中存储的数据创建的变量的名称,即计数。他们还有更复杂的示例,例如列名称中的数字,例如 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()
Run Code Online (Sandbox Code Playgroud)
图表是: