我有一个形状为[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])
我想为在同一页面上显示的每个人绘制这样的图,但是我对如何使用ggplot实现这一图感到困惑。
答案 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
,则tidyr
和ggplot2
都将安装并加载)。
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"))
它回答了您的问题吗?
如果您必须针对220个不同的人执行此操作,那么我不确定它是否会构成一个真实的情节。也许您应该考虑另一种方法来绘制它或提取有用的信息。