逐行绘制两个固定行。

时间:2016-05-11 07:19:58

标签: r ggplot2

正如标题所说,我想做一些线图。我们以mtcars为例。

我想从这个数据集中总共绘制10行。我选择了那些:

> dput(vec)
c("Mazda RX4", "Mazda RX4 Wag", "Datsun 710", "Hornet 4 Drive", 
"Hornet Sportabout", "Valiant", "Duster 360", "Merc 240D", "Merc 230", 
"Merc 280")

首先,我决定对整个数据集进行分组:

tbl_mtcars <- mtcars[row.names(mtcars) %in% vec, ]

并且我想绘制那些行,但假设在每个图上只有3行。 Merc 230和Merc 280的线应始终在图上,其余部分应逐一添加。

如果可以使用ggplot完成,那就太棒了:

下面的函数只是我经常用于绘图的代码示例。

ggplot(tbl_mtcars, aes(gear, carb, group=factor(Name))) +
  theme(legend.title=element_blank()) +
  geom_line(aes(color=factor(Name))) +
  ggtitle("Title")+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

2 个答案:

答案 0 :(得分:4)

首先,mtcars可能不是说明您需求的最佳数据集。相反,我创建了一个10行和5列的数据框(代表观察)。

问题是,ggplot需要一种特定形式的数据(而不是&#39;而不是&#39;宽&#39;),所以在我们绘制图表之前,我们需要首先修改数据。在这里,我使用melt包中的reshape2

现在我们可以生成图表,同时记住你提到的两个修复行(ID)。这里,最后两个ID是固定的。请注意,我只在这里展示香草型的情节,没有太多的化妆品。

(编辑/更新:根据@Paul Hiemstra的建议,将for循环替换为lapply并删除eval-parse组合,但仍保留grid.arrange方法)

# Generate data: 10 IDs each with 5 observations
df <- data.frame(matrix(rnorm(50), 10, 5))
df$id <- as.numeric(rownames(df))

# Melt the data
require(reshape2)
df2 <- melt(df, id.vars = "id")

# Generate plots
require(ggplot2)
plot.list <- lapply(1:(max(df2$id)-2), function(i) {
  df2.i <- df2[df2$id %in% c(i, 9, 10), ]
  ggplot(df2.i) +
    geom_line(aes(x = as.numeric(variable), y = value, colour = factor(id)))
})

# Combine plots
require(gridExtra)
do.call(grid.arrange, plot.list)

output: eight graphs

答案 1 :(得分:3)

在进行一些数据操作后,您可以使用与@zyurnaidi相同的数据集,但使用的是facetting而不是grid.arrange。诀窍是使用两个geom_linefacet_wrap。第一个geom_line绘制您想要看到的线,第二个是变化线。

library(dplyr)
library(tidyr)
df2 = as.data.frame(t(df)) %>% 
  gather(variable_id, value, -V9, -V10) %>% 
  gather(always_show_id, value_always, V9, V10) %>% 
  group_by(variable_id, always_show_id) %>% mutate(x_id = seq_len(length(variable_id)))
head(df2)
  variable_id       value always_show_id value_always x_id
1          V1 -0.89596500             V9   -0.1758441    1
2          V1  0.42307486             V9   -0.2183904    2
3          V1 -1.13538973             V9    0.3609882    3
4          V1 -0.05927355             V9   -0.3902112    4
5          V1 -0.69209362             V9    0.1045214    5
6          V2 -0.56098448             V9   -0.1758441    1

df2 %>% ggplot() + 
  geom_line(aes(x = x_id, y = value_always, group = always_show_id)) + 
  geom_line(aes(x = x_id, y = value), color = 'red') + 
  facet_wrap(~ variable_id)

enter image description here