是否可以使用
ggplot2
绘制散点图矩阵,使用 ggplot
的良好功能,例如将其他因素映射到颜色、形状等并添加平滑器?
我正在考虑类似于
base
函数 pairs
的东西。
您可能想尝试plotmatrix:
library(ggplot2)
data(mtcars)
plotmatrix(mtcars[,1:3])
对我来说,mpg(mtcars 中的第一列)不应该成为一个因素。我还没有检查过,但没有理由说它应该是一个。不过我得到了散点图:)
注意:为了将来参考,
plotmatrix()
函数已被ggpairs()
包中的GGally
函数取代,正如 @naught101 在下面的另一个回答中建议的那样。
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')
}
scatterPlotMatrix。它非常灵活,可以生成漂亮的交互式图表。
library(scatterPlotMatrix)
scatterPlotMatrix(iris, zAxisDim = "Species")
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)