在 ggplot2 中创建散点图矩阵(pairs() 等效)

问题描述 投票:0回答:5

是否可以使用

ggplot2
绘制散点图矩阵,使用
ggplot
的良好功能,例如将其他因素映射到颜色、形状等并添加平滑器?

我正在考虑类似于

base
函数
pairs
的东西。

r ggplot2 visualization
5个回答
259
投票

我一直想这样做,但绘图矩阵很糟糕。 Hadley 建议 使用 GGally 包。它有一个函数,ggpairs,这是一个大大改进的对图(允许您在数据框中使用非连续变量)。它根据变量类型在每个方块中绘制不同的图:

library(GGally)
ggpairs(iris, aes(colour = Species, alpha = 0.4))

enter image description here


40
投票

您可能想尝试plotmatrix:

  library(ggplot2)
  data(mtcars)
  plotmatrix(mtcars[,1:3])

对我来说,mpg(mtcars 中的第一列)不应该成为一个因素。我还没有检查过,但没有理由说它应该是一个。不过我得到了散点图:)


注意:为了将来参考,

plotmatrix()
函数已被
ggpairs()
包中的
GGally
函数取代,正如 @naught101 在下面的另一个回答中建议的那样。


23
投票
如果想要获得一个

ggplot

 对象(而不是像 
ggmatrix
 那样的 
ggpairs()
),解决方案是熔化数据两次,然后使用分面 
ggplot
。如果提供了 
facet_wrap
 参数,
facet_grid
 会比 
scales = 'free'
 更好地限制绘制区域。

require(ggplot2) require(dplyr) require(tidyr) gatherpairs <- function(data, ..., xkey = '.xkey', xvalue = '.xvalue', ykey = '.ykey', yvalue = '.yvalue', na.rm = FALSE, convert = FALSE, factor_key = FALSE) { vars <- quos(...) xkey <- enquo(xkey) xvalue <- enquo(xvalue) ykey <- enquo(ykey) yvalue <- enquo(yvalue) data %>% { cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars, na.rm = na.rm, convert = convert, factor_key = factor_key), select(., !!!vars)) } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars, na.rm = na.rm, convert = convert, factor_key = factor_key) } iris %>% gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% { ggplot(., aes(x = .xvalue, y = .yvalue, color = Species)) + geom_point() + geom_smooth(method = 'lm') + facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)), scales = 'free', labeller = label_both) + scale_color_brewer(type = 'qual') }

enter image description here


5
投票
尝试

scatterPlotMatrix。它非常灵活,可以生成漂亮的交互式图表。

library(scatterPlotMatrix) scatterPlotMatrix(iris, zAxisDim = "Species")

enter image description here


0
投票
稍后,我附上一个不使用 dplyr 的替代方案:

library("ggplot2") library("reshape") # what vars to plot vars_to_plot <- c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") # melt the table melted <- melt(iris[, c("Species", vars_to_plot)]) # define empty vector final_all <- vector() # for each interesting variable for (a_var in vars_to_plot) { # get it's actual values temp <- iris[, a_var] # replicate them for each variable temp_col <- rep(temp, length(unique(melted$variable))) # rbind them final_all <- rbind.data.frame(final_all, cbind(melted, var=rep(a_var, length(temp_col)), temp_col)) # remove the variable that was just added to the final table melted <- melted[-which(melted$variable==a_var), ] } # remove duplicate comparisons, if needed final_no_dup <- final_all[-which(final_all$variable==final_all$var), ] # plot ggplot_pairs <- ggplot(final_no_dup, aes(x=value, y=temp_col, fill=Species)) + geom_point(shape=21, size=5, color="black", stroke=3) + facet_wrap(variable~var, scales='free', labeller=label_wrap_gen(multi_line=FALSE)) + xlab("") + ylab("") + guides(fill=guide_legend(override.aes=list(shape=21))) + theme_bw() plot(ggplot_pairs)
    
© www.soinside.com 2019 - 2024. All rights reserved.