[英]Using a for loop with ggplot2 to plot multiple graphs within a data frame
[英]Multiple ggplot2 graphs with shared Data
在回收数据时,如何制作相同数据的多个图表,但不同因素(列)的颜色不同? 这是什么gridExtra
与cowplot
不同之cowplot
?
目标:我的目标是在视觉上比较有效聚类相同数据的不同结果。 我目前认为,直观地比较2-4个聚类算法的最简单方法是将它们彼此相邻绘制。
因此,如何以不同的颜色并排绘制相同的数据?
挑战/规格:性能非常重要。 我有大约30,000个图表,每个图表有450 - 480点。 数据被“回收”至关重要。
我可以使用包cowplot
和gridExtra
并排绘制它们。 我今天刚开始使用gridExtra
,但它似乎回收数据并且比我的目的更好。 更新:如果我在绘图前收集了列,u / eipi10演示了facet_wrap
可以工作。
设定
#Packages
library(ggplot2)
library(cowplot)
library(gridExtra)
library(pryr) #memory profile
#Data creation
x.points <- c(1, 1, 1, 3, 3, 3, 5, 5, 5)
y.points <- c(1, 3, 5, 1, 3, 5, 1, 3, 5)
cl_vert <- c("A", "A", "A", "B", "B", "B", "C", "C", "C")
cl_hoz <- c("A", "B", "C", "A", "B", "C", "A", "B", "C")
cl_cent <- c("A","A","A","A", "B", "A","A","A","A")
df <- data.frame(x.points, y.points, cl_vert, cl_hoz, cl_cent)
绘制图形
#Graph function and individual plots
graph <- function(data = df, Title = "", color.by, legend.position = "none"){
ggplot(data, aes(x = `x.points`, y = `y.points`)) +
geom_point(aes(color = as.factor(color.by))) + scale_color_brewer(palette = "Set1") +
labs(subtitle = Title, x = "log(X)", y = "log(Y)", color = "Color" ) +
theme_bw() + theme(legend.position = legend.position)
}
g1 <- graph(Title = "Vertical", color.by = cl_vert)
g2 <- graph(Title = "Horizontal", color.by = cl_hoz)
g3 <- graph(Title = "Center", color.by = cl_cent)
#Cowplot
legend <- get_legend(graph(color.by = cl_vert, legend.position = "right")) #Not a memory waste
plot <- plot_grid(g1, g2, g3, labels = c("A", "B", "C"))
title <- ggdraw() + draw_label(paste0("Data Ex ", "1"), fontface = 'bold')
plot2 <- plot_grid(title, plot, ncol=1, rel_heights=c(0.1, 1)) # rel_heights values control title margins
plot3 <- plot_grid(plot2, legend, rel_widths = c(1, 0.3))
plot3
#gridExtra
plot_grid.ex <- grid.arrange(g1, g2, g3, ncol = 2, top = paste0("Data Ex ", "1"))
plot_grid.ex
与pryr一起使用内存
#Comparison
object_size(plot_grid) #315 kB
object_size(plot3) #1.45 MB
#Individual objects
object_size(g1) #756 kB
object_size(g2) #756 kB
object_size(g3) #756 kB
object_size(g1, g2, g3) #888 kB
object_size(legend) #43.6 kB
其他问题:在写完这个问题并提供样本数据之后,我只记得gridExtra
,尝试过它,它似乎占用的内存少于其组件图的组合数据。 我认为除了着色分配外,g1,g2和g3共享相同的数据,这就是为什么各个组件和总对象大小之间存在大约130 kB的差异。 plot_grid如何占用甚至更少的空间? ls.str(plot_grid)
似乎没有显示g1,g2和g3的任何合并。 我最好的选择是使用lineprof()
并逐行进行比较吗?
来源我已经浏览/阅读/咨询过:
请耐心等待我,因为我是一名新程序员(刚刚开始编写脚本12月); 我还不了解所有技术细节,但我想。
如果你的性能提升,请不要使用任何这些软件包,包括ggplot2。 gridExtra,cowplot和其他人总会让事情变得更慢,他们不会在任何意义上“回收”数据(目前还不清楚你的意思)。
我建议在ggplot2之外进行所有耗时的数据处理,并绘制已经更接近最终映射的结果(即已分配颜色组等)。 您可能会发现ggplot2对您的应用程序来说变得过度和缓慢(格子通常更快,基本情节也是如此)。
如果你真的想要共享数据 ,我会认为像d3.js这样的东西可能会让你最接近这个目标,尽管它只会让浏览器的数据重复在渲染时完成。 一旦数据点在屏幕上呈现,它们必须是独立的并且是重复的,所以问题在于管道中最方便和最有效的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.