2017-06-05 81 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