2017-06-05 76 views
2

是否可以使用因子变量在R中的ggplot2中的散点图之下或旁边使用直方图来构面(使得直方图是x和y数据的组成部分)?使用因子变量在R中的散点图上刻画直方图

我之所以会问这是否可以用因子变量来完成,是因为faceting看起来比解决这个问题的可用包更普遍,例如在faceting中可以打开或关闭facet标签,并且在出版物可能会成为关注点时,刻面也具有更标准的外观。 (默认情况下也可以使用相同的轴)。

到目前为止,我还没有能够得到这个工作,因为它好像所有分面数据必须具有相同的维数(例如,散点图数据是2D,直方图数据是1D)。

回答

1

尼克和布赖恩,

感谢您与代码的帮助。我问周围,并能够得到我正在寻找的设置。基本上它是这样的,如下所示。 (但愿这可能是你和别人有用的未来,因为我觉得这是图的普通型):

rm(list = ls()) 
library(ggplot2) 
library(gridExtra) 

df <- data.frame(
    x = rnorm(100), 
    y = rnorm(100) 
) 

xrange <- range(pretty(df$x)) 
yrange <- range(pretty(df$y)) 

p.left <- ggplot(df, aes(y)) + 
    geom_histogram() + 
    lims(x = yrange) + 
    coord_flip() + 
    theme_light() + 
    theme(
    axis.title.x = element_blank(), 
    axis.text.x = element_blank(), 
    axis.ticks.x = element_blank(), 
    panel.grid.major.x = element_blank(), 
    plot.margin = unit(c(1, 0.05, 0.05, 1), "lines") 
) 

p.blank <- ggplot() + 
    theme_void() + 
    theme(plot.margin = unit(rep(0, 4), "lines")) 

p.main <- ggplot(df, aes(x, y)) + 
    geom_point() + 
    lims(x = xrange, y = yrange) + 
    theme_light() + 
    theme(
    axis.title = element_blank(), 
    axis.text = element_blank(), 
    axis.ticks = element_blank(), 
    plot.margin = unit(c(1, 1, 0.05, 0.05), "lines") 
) 

p.bottom <- ggplot(df, aes(x)) + 
    geom_histogram() + 
    lims(x = xrange) + 
    theme_light() + 
    theme(
    axis.title.y = element_blank(), 
    axis.text.y = element_blank(), 
    axis.ticks.y = element_blank(), 
    panel.grid.major.y = element_blank(), 
    plot.margin = unit(c(0.05, 1, 1, 0.05), "lines") 
) 

lm <- matrix(1:4, nrow = 2) 

grid.arrange(
    p.left, p.blank, p.main, p.bottom, 
    layout_matrix = lm, 
    widths = c(1, 5), 
    heights = c(5, 1), 
    padding = unit(0.1, "line") 
) 

Scatterplot with histograms of x- and y-components of the data.

1

我不确定是否完全理解这个问题,因为因子变量的直方图对我来说并不合理。另外,如果没有样本数据,我只需要使用mtcars。像这样的东西可能会有所帮助。除了ggplot2之外,我还使用grid.extra以便使地块具有定制的网格布置。

library(gridExtra) 
library(ggplot2) 


s_plot <- ggplot(data = mtcars, aes(x = hp, y = mpg)) + geom_point() 

h1 <- ggplot(data = mtcars, aes(x = hp)) + geom_histogram() 

h2 <- ggplot(data = mtcars, aes(x = mpg)) + geom_histogram() 

grid.arrange(s_plot, h1, h2, layout_matrix = cbind(c(1, 1), c(2, 3))) 

enter image description here

注意的是,在grid.arrangelayout_matrix说法,我使用cbind(c(1,1), c(2, 3)),因为我希望第一个情节是全部由自己一列,然后我想其他两个地块占据各行在网格的第二列。

+0

我想你会想'H2 < - H2 + coord_flip ()',然后更改布局矩阵,将它们排列为左上角,右上角,左下角和右下角空白。 – Brian