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

时间:2011-09-27 13:52:52

标签: 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"))

这感觉真的很多余。如果我首先融化mtcars,那么所有变量都会融化,然后我将最终绘制出我不想要的其他变量。

有没有人有这样做的好方法?

2 个答案:

答案 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()

图表是:

mtcarstestchart