使用ggplot2将多个y值绘制为单独行的正确方法

Chr*_*eff 12 r ggplot2

我经常遇到一个问题,我有一个数据框,它有一个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)

  • @Chris - 或者,按照你的建议融化整个data.frame,然后在`ggplot()`调用中使用`subset()`作为数据参数,如果你计划绘制不同的东西并且不想重新融化` (2认同)
  • IDK 在 2011 年的情况是什么,但在 2018 年有了 R 3.6.1。您必须导入包 `library(reshape2)` 才能使用 `melt` 功能。 (2认同)

mic*_*str 8

随着 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)

图表是:

mtcars测试图