2016-08-18 68 views
1

使用diamonds的網格,我想繪製carat VS pricecut 4級(FairGoodVery GoodPremimum)。ggplot:如何常見的X和Y標籤添加到地塊

我沒有讓facet_wrap()來控制座標軸的斷點,而是用四個圖來控制座標軸的斷點。

library(ggplot2) 
library(egg) 
library(grid) 
f1 <- 
ggplot(diamonds[diamonds$cut=="Fair",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_x_continuous(limits = c(0,4), breaks=c(0, 1, 2, 3, 4))+ 
    scale_y_continuous(limits = c(0,10000), breaks=c(0, 2500, 5000, 7500, 10000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 


f2 <- 
ggplot(diamonds[diamonds$cut=="Good",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_y_continuous(limits = c(0,5000), breaks=c(0, 1000, 2000, 3000, 4000, 5000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 


f3 <- 
    ggplot(diamonds[diamonds$cut=="Very Good",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_x_continuous(limits = c(0,1), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1))+ 
    scale_y_continuous(limits = c(0,1000), breaks=c(0, 200, 400, 600, 800, 1000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 

f4 <- 
    ggplot(diamonds[diamonds$cut=="Premium",], aes(carat, price))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol =2)+ 
    scale_x_continuous(limits = c(0,1.5), breaks=c(0, 0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4))+ 
    scale_y_continuous(limits = c(0, 3000), breaks=c(0, 500, 1000, 1500, 2000, 2500, 3000))+ 
    labs(x=expression(" "), 
     y=expression(" ")) 

fin_fig <- ggarrange(f1, f2, f3, f4, ncol =2) 
fin_fig 

RESULT

每個情節具有一定範圍的不同的y值

enter image description here

QUESTION

在所有方面中,x軸和y軸的 是相同的。唯一的區別是最小,最大和休息。我想爲此圖添加x和y標籤。我可以在任何文檔或圖像編輯器中手動執行此操作。無論如何要直接在R中執行它?

+1

看看'網:: textGrob'和'GGPLOT2 :: annotation_custom' – shayaa

+1

你可以使用'gridExtra',它具有'left'和'bottom'參數。 :'p < - ggplot(); g < - gridExtra :: arrangeGrob(p,p,p,p,ncol = 2,bottom = grid :: textGrob(「bottom lab」),left = grid :: textGrob(「left lab」,rot = 90)) ; grid :: grid.newpage(); grid :: grid.draw(g)' – user20650

回答

4

除了使用功能從gridExtra包(如@ user20650建議),你也可以通過的cut水平分割diamonds數據幀,並使用mapply創建用更少的代碼你的地塊。

下面的答案還包括評論中後續問題的解決方案。我們展示瞭如何佈置四個地塊,添加適用於所有地塊的單個x和y標籤(包括使其變爲粗體並控制其顏色和大小),併爲每個地塊獲取單個圖例而不是單獨的圖例。

library(ggplot2) 
library(gridExtra) 
library(grid) 
library(scales) 

刪除行,其中cut"Ideal"

dat = diamonds[diamonds$cut != "Ideal",] 
dat$cut = droplevels(dat$cut) 

創建四個地塊,一爲的cut其餘每個級別和存儲在列表中。我們使用mapply(而不是lapply),因此我們可以爲cut的每個級別提供單獨的數據幀,並提供自定義ymax值的矢量,以分別爲每個繪圖設置y軸上的最高值。我們還以創建顏色圖例添加color=clarity

pl = mapply(FUN = function(df, ymax) { 
    ggplot(df, aes(carat, price, color=clarity))+ 
    geom_point()+ 
    facet_wrap(~cut, ncol=2)+ 
    scale_x_continuous(limits = c(0,4), breaks=0:4)+ 
    scale_y_continuous(limits = c(0, ymax), labels=dollar_format()) + 
    labs(x=expression(" "), 
     y=expression(" ")) 
}, df=split(dat, dat$cut), ymax=c(1e4,5e3,1e3,3e3), SIMPLIFY=FALSE) 

好了,我們有我們的四個地塊,但每個人都有自己的傳奇。所以現在我們要安排只有一個整體圖例。我們通過提取其中一個傳奇作爲單獨的grob來完成此操作(gr aphical ob ject),然後從四個圖中刪除圖例。

使用小助手功能提取傳說作爲一個單獨的GROB:

# Function to extract legend 
# https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs 
g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend) } 

# Extract legend as a grob 
leg = g_legend(pl[[1]]) 

現在,我們需要安排在一個2x2格的四個地塊,然後將傳奇的地方,這個網格的右側。我們使用arrangeGrob來繪製圖(並且注意我們如何使用lapply在渲染之前從每個圖中刪除圖例)。這與我們在回答的早期版本中使用grid.arrange所做的基本相同,只是arrangeGrob創建了2x2繪圖網格對象而不繪製它。然後,我們通過在grid.arrange內包裝整個東西,在2x2陰謀網格旁邊佈置圖例。 widths=c(9,1)將90%的水平空間分配給2×2格子圖和10%圖例。呼!

grid.arrange(
    arrangeGrob(grobs=lapply(pl, function(p) p + guides(colour=FALSE)), ncol=2, 
       bottom=textGrob("Carat", gp=gpar(fontface="bold", col="red", fontsize=15)), 
       left=textGrob("Price", gp=gpar(fontface="bold", col="blue", fontsize=15), rot=90)), 
    leg, 
    widths=c(9,1) 
) 

enter image description here

+0

感謝您的時間和幫助。請檢查更新以查看我無法使用「少代碼」的原因。我不得不製作四個不同的地塊,因爲它們都具有不同的y和x值範圍,但它們仍然具有相同的單位。 – aelwan

+1

查看更新。我已經改爲'mapply',這樣我們可以包含一個參數來爲每個plot分別設置y軸的頂部。 – eipi10

+0

感謝您的時間和幫助。 任何建議如何改變標籤的大小和臉(粗體)? – aelwan

相關問題