ggplot:3D矩阵:在一个图形中绘制多条线,并在同一页面上绘制多条图形

时间:2019-12-20 19:40:14

标签: r ggplot2 data-visualization data-manipulation

我有一个形状为[1:1000,1:221,1:2]的3D数据矩阵(df),

可重现的示例如下:

d <- as.data.frame( matrix( 1:(5*2*3), 10, 3))
df = array( unlist(d), dim=c(5, 2, 3)) 
df
, , 1

     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

, , 2

     [,1] [,2]
[1,]   11   16
[2,]   12   17
[3,]   13   18
[4,]   14   19
[5,]   15   20

, , 3

     [,1] [,2]
[1,]   21   26
[2,]   22   27
[3,]   23   28
[4,]   24   29
[5,]   25   30

第一个维度是足迹,第二个维度是结果,第三个维度是人。

对于每个人,我都希望获得如下图(第一个人的excel图df [,, 1])

enter image description here

我想为在同一页面上显示的每个人绘制这样的图,但是我对如何使用ggplot实现这一图感到困惑。

1 个答案:

答案 0 :(得分:0)

使用数据,您可以首先在数据框中重新组织数组(实现这一部分可能有更简单的方法):

final_df = NULL
nb_person = 3
trail = NULL
person = NULL
for(i in 1:nb_person) {
  final_df = rbind(final_df, df[,,i])
  trail = c(trail, 1:dim(df[,,i])[1])
  person = c(person,rep(i,dim(df[,,i])[1]))
}
final_df = data.frame(final_df)
colnames(final_df) = c("start","end")
final_df$trail = trail
final_df$person = person

   start end trail person
1      1   6     1      1
2      2   7     2      1
3      3   8     3      1
4      4   9     4      1
5      5  10     5      1
6     11  16     1      2
7     12  17     2      2
8     13  18     3      2
9     14  19     4      2
10    15  20     5      2
11    21  26     1      3
12    22  27     2      3
13    23  28     3      3
14    24  29     4      3
15    25  30     5      3

然后,您可以使用pivot_longer软件包中的tidyr函数对它进行整形(如果安装并加载tidyverse,则tidyrggplot2都将安装并加载)。

library(tidyverse)
final_df_reshaped <- final_df %>% pivot_longer(., -c(trail,person),names_to = "Variable",values_to = "value")

# A tibble: 30 x 4
   trail person Variable value
   <int>  <int> <chr>    <int>
 1     1      1 start        1
 2     1      1 end          6
 3     2      1 start        2
 4     2      1 end          7
 5     3      1 start        3
 6     3      1 end          8
 7     4      1 start        4
 8     4      1 end          9
 9     5      1 start        5
10     5      1 end         10
# … with 20 more rows

gather的较早版本替代使用tidyr 如果您使用的是tidyr的旧版本(低于1.0.0),则应使用gather而不是pivot_longer。 (更多信息在这里:https://cmdlinetips.com/2019/09/pivot_longer-and-pivot_wider-in-tidyr/

final_df_reshaped <- final_df %>% gather(., -c(trail,person), key = "Variable",value = "value") 

并使用以下代码进行绘制:

ggplot(final_df_reshaped, aes(x = Variable, y = value, group = as.factor(trail), color = as.factor(trail)))+
  geom_point()+
  geom_line() +
  facet_grid(.~person)+
  scale_x_discrete(limits = c("start","end"))

enter image description here

它回答了您的问题吗?

如果您必须针对220个不同的人执行此操作,那么我不确定它是否会构成一个真实的情节。也许您应该考虑另一种方法来绘制它或提取有用的信息。