r语言 - 将一个大块图拆分为较小的子图,以便在 ggplot 中更好地可视化



我有关于500多只狗的生存/采样日期的数据,每只狗至少被采样过一次,有几只狗被采样了三到四次。例如

Microchip_number    Date       Sampling_occasion
White notched fatso 20,11,2018 First
White notched fatso 28,12,2018 Second
White notched fatso 09,04,2019 Third
White notched fatso 23,10,2019 Fourth
Tuttu Jeevan        06,12,2018 First
Tuttu Jeevan        03,01,2019 Second
Tuttu Jeevan        04,05,2019 Third
Tuppy               22,10,2018 First
Tuppy               20,11,2018 Second
Tuppy               17,04,2019 Third
Tuppy               31,07,2019 Lost to study

我已经设法在ggplot中绘制了这个,但这是一个非常大的图像,需要放大和滚动才能查看每只狗的采样时间。

所有狗的结果图

我发现了根据某个变量(例如月(拆分大型数据帧或使用facet_wrap的建议,但就我而言,我没有任何这样的变量可以使用。有没有办法将此大图拆分为多个不需要放大即可清楚地查看所有详细信息的较小图,如下所示(无需单独绘制数据帧的子集(?

我希望每个分裂/子情节如何出现

这是我正在使用的代码

outcomes <- read_xlsx("Dog outcomes.xlsx", col_types = c("text", "date", "text"))
outcomes$Microchip_number<- as.factor(outcomes$Microchip_number)
outcomes$Sampling_occasion<- factor(outcomes$Sampling_occasion,
levels = c("First", "Second", "Third", "Fourth", "Lost to study", "Died"))
g<- ggplot(outcomes)
g + geom_point(aes(x = Date, y = Microchip_number, colour = Sampling_occasion, shape = Sampling_occasion)) +
geom_line(aes(x = Date, y = Microchip_number, group = Microchip_number, colour = Sampling_occasion)) +
theme_bw()

非常感谢,Jrm FRL,添加countersubgroup列的代码正是我所需要的!正如 Gregor 所提到的,facet_wrap只是让事情更难查看,所以我使用 for 循环使用subgroup绘制每个 pdf 页面(或任何其他设备(50 只狗。这是我使用的代码,它运行良好,尽管出于某种原因,"Microchip_number"以相反的顺序/字母顺序(68481、68480、68479 等(显示,尽管在主数据帧"结果"中以相反的方式组织。然而,小狡辩!这使得可视化特定个人的结果变得更加容易。干杯!

outcomes2 <- outcomes %>% 
mutate(counter = 1 + cumsum(c(0,as.numeric(diff(Microchip_number))!=0)), # this counter starting at 1 increments for each new dog
subgroup = as.factor(ceiling(counter/50)))
pdf(file = "All_outcomes_50.pdf") # 
for (i in 1:length(unique(outcomes2$subgroup))) {
outcomes2 %>%
filter(subgroup == i) -> df
ggplot(df) + geom_point(aes(x = Date, y = Microchip_number, colour = Sampling_occasion, shape = Sampling_occasion)) +
geom_line(aes(x = Date, y = Microchip_number, group = Microchip_number, colour = Sampling_occasion)) + 
theme_bw() -> wow
print(wow)
}
dev.off()

使用"for"循环后的新情节

您可以简单地将 dasatet 划分为包含相同数量狗(例如 10 只(的子组。 添加一个中间counter列,以克服每只狗不一定有相同行数的小困难。

我建议:

library('dplyr')
outcomes <- outcomes %>% 
mutate(counter = 1 + cumsum(c(0,as.numeric(diff(Microchip_number))!=0)), # this counter starting at 1 increments for each new dog
subgroup = as.factor(ceiling(counter/10)))

您将获得一个新数据集,其中包含每 10 只狗的值不同的因子subgroup列。然后只需在您的情节中添加一个+ facet_wrap(.~subgroup)

希望这会有所帮助。

最新更新