【问题标题】:Plot multiple rows on the same graph - few graphs on the same page在同一个图表上绘制多行 - 同一页面上的几个图表
【发布时间】:2016-05-30 11:51:25
【问题描述】:

这是我之前question的一点后续:

这次我想将我的图表导出为 pdf,并且我希望在同一页面上有 6 个图表。为什么是 6,因为我有 6 个不同的数据集:

df1 <- data.frame(matrix(rnorm(50), 10, 15))
df2 <- data.frame(matrix(rnorm(30), 10, 15))
df3 <- data.frame(matrix(rnorm(20), 10, 5))
df4 <- data.frame(matrix(rnorm(70), 10, 5))
df5 <- data.frame(matrix(rnorm(110), 10, 10))
df6 <- data.frame(matrix(rnorm(70), 10, 10))

我更改了 row.names 以使示例数据更类似于真实数据:

row.names(df1) <- c("Mark", "Tere", "Marcus", "Heidi", "Georg", "Tieme", "Joan", "Tytus", "Julius", "Crater")
df1$id <- rownames(df1)

我用于绘图的代码 (ggplot) 需要添加 id 列。

现在,进入正题。因此,如您所见,所有数据集都具有完全相同的row.names,但它们的顺序可能不同!指出我的期望可能更容易理解:

1.我想为每个数据集创建一个单独的图表,但所有数据集(总共 6 个)都应该在同一页面上。

2.每个图表应该有 3 个图(3 行 - 查看我创建的上一个线程)。

3. HeidiJoan 的绘图必须在所有图表上,并且还有一个(再次查看上一个线程)。这意味着该数据中的每个其他名称都应该有一页。

4.如果能使用ggplot 完成将不胜感激。

只是为了更容易理解:

总共 6 个图表。每个图表包含HeidiJoan + 任何其他(Marcus/Tieme/Georg/Julius/etc)。每个页面的名称不同。

这是我用于将每一行与 2 个常量一起绘制的代码:

pdf(file = sprintf("Df_plots.pdf", df1), paper='A4r')

lapply(1:length(df1$numb), function (i) {
  df1_melted.i <- df1_melted[df1_melted$numb %in% c(i, Heidi, Joan),]
  ggplot(data_plot2.i) +
    geom_line(aes(x = as.numeric(variable), y = value, colour = factor(id)))
})

dev.off()

这听起来很复杂,但对于有 R 经验的人来说应该很容易。

编辑:

df1$numb <- 1:length(row.names(df1))
df1_melted <- melt(df1, id.vars = c("id", "numb))

编辑:

用不同的列数编辑数据。

我想把情节安排成这样。您必须考虑到列数会有所不同 - 更多值。

【问题讨论】:

  • 什么是df_plot、tbl_plot、data_melted?
  • 稍微编辑了代码。这只是可以使用/编辑的代码示例。

标签: r plot


【解决方案1】:

我已尝试更好地匹配您的示例。

library(dplyr)
library(tidyr)
library(ggplot2)
library(grid)

df1 <- data.frame(matrix(rnorm(50), 10, 10))
df2 <- data.frame(matrix(rnorm(30), 10, 10))
df3 <- data.frame(matrix(rnorm(20), 10, 5))
df4 <- data.frame(matrix(rnorm(70), 10, 5))
df5 <- data.frame(matrix(rnorm(110), 10, 15))
df6 <- data.frame(matrix(rnorm(70), 10, 15))

data <- list(df1, df2, df3, df4, df5, df6)

all_names <- c("Mark", "Tere", "Marcus", "Heidi", "Georg", "Tieme", "Joan", "Tytus", "Julius", "Crater")

for (i in seq_along(data)){
  # Adding number of columns
  data[[i]]$n_col <- ncol(data[[i]])

  # Adding the random order row names
  data[[i]]$id <-sample(all_names, 10) 

  # Adding a data frame number column
  data[[i]] <- cbind(data[[i]], frame = i)
}

df <- plyr::rbind.fill(data) %>%
  gather(time, value, -id, -frame, -n_col) %>%
  filter(!is.na(value)) %>%
  mutate(time = gsub('X', '', time) %>% as.numeric)

plot_name <- function(name){
  df %>% 
    filter(id %in% c('Heidi', 'Joan', name)) %>%
    ggplot() +
    aes(x = time, y = value, group = id, colour = id) +
    geom_line() +
    geom_point() +
    facet_wrap(frame ~ n_col, scales = 'free_x', nrow = 3, ncol = 2) +
    theme(strip.background = element_blank(),
          strip.text.x = element_blank())
}

pdf(file = sprintf("Df_plots.pdf", df1), paper='A4r')

for (name in setdiff(all_names, c('Heidi', 'Joan'))){
  print(plot_name(name))
  #grid.newpage()
}

dev.off()

【讨论】:

  • 测试数据看起来不错。我将在一分钟内用我的真实数据进行测试。您是否每隔一页获得 pdf 空白?
  • 不,这是我的每一页。它是否适用于真实数据?
  • 它有效。我不得不稍微修改我的数据,但代码有效。仍然有空白页的问题。
  • 我当然可以试一试。给我一些时间!
  • 另外,我现在得到空白页 - 但这是因为情节大到足以占据一整页。删除 grid.newpage() 将解决这个问题
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多