2016-12-07 106 views
1

我正在嘗試使用顯示兩個容器內容和梯度的各個容器進行2D直方圖。數據是兩個軸中從0到4(僅)的整數。使用ggplot對stat_bin2d進行計數和座標軸標記

我試過與this answer一起工作,但最後我遇到了一些問題。首先,幾個箱子最終沒有漸變。在下面的MWE中,130和60的左下角框似乎是空白的。其次,兩個軸箱中的箱體移動到0以下。對於這個軸的問題,我發現我可以簡單地爲x和y添加一個0.5。最後,我還希望軸標籤位於一個bin中,並加上0.5不能解決這個問題。

library(ggplot2) 

# Construct the data to be plotted 
x <- c(rep(0,190),rep(1,50),rep(2,10),rep(3,40)) 
y <- c(rep(0,130),rep(1,80),rep(2,30),rep(3,10),rep(4,40)) 
data <- data.frame(x,y) 

# Taken from the example 
ggplot(data, aes(x = x, y = y)) + 
    geom_bin2d(binwidth=1) + 
    stat_bin2d(geom = "text", aes(label = ..count..), binwidth=1) + 
    scale_fill_gradient(low = "snow3", high = "red", trans = "log10") + 
    xlim(-1, 5) + 
    ylim(-1, 5) + 
    coord_equal() 

enter image description here

有什麼明顯我做錯了兩種顏色的漸變和軸標籤?如果有更好的方法可以使用其他包/命令來完成,我也不會與ggplot或stat_bin2d結婚。提前致謝!

回答

1

stat_bin2d使用cut函數來創建箱。默認情況下,cut會創建左側打開並關閉右側的容器。 stat_bin2d也設置include.lowest=TRUE,這樣最低的區間也會在左邊關閉。我沒有看過stat_bin2d的代碼,試圖弄清楚到底發生了什麼問題,但好像它與breakscut的選擇方式有關。在任何情況下,您都可以通過將分隔符明確設置爲從-1開始來獲得所需的行爲。例如:

ggplot(data, aes(x = x, y = y)) + 
    geom_bin2d(breaks=c(-1:4)) + 
    stat_bin2d(geom = "text", aes(label = ..count..), breaks=c(-1:4)) + 
    scale_fill_gradient(low = "snow3", high = "red", trans = "log10") + 
    xlim(-1, 5) + 
    ylim(-1, 5) + 
    coord_equal() 

enter image description here

要居中的整數格點的地磚,設置休息,以半整數值:

ggplot(data, aes(x = x, y = y)) + 
    geom_bin2d(breaks=seq(-0.5,4.5,1)) + 
    stat_bin2d(geom = "text", aes(label = ..count..), breaks=seq(-0.5,4.5,1)) + 
    scale_fill_gradient(low = "snow3", high = "red", trans = "log10") + 
    scale_x_continuous(breaks=0:4, limits=c(-0.5,4.5)) + 
    scale_y_continuous(breaks=0:4, limits=c(-0.5,4.5)) + 
    coord_equal() 

enter image description here

或者,強調值是離散的,將箱設置爲半個單位寬:

ggplot(data, aes(x = x, y = y)) + 
    geom_bin2d(breaks=seq(-0.25,4.25,0.5)) + 
    stat_bin2d(geom = "text", aes(label = ..count..), breaks=seq(-0.25,4.25,0.5)) + 
    scale_fill_gradient(low = "snow3", high = "red", trans = "log10") + 
    scale_x_continuous(breaks=0:4, limits=c(-0.25,4.25)) + 
    scale_y_continuous(breaks=0:4, limits=c(-0.25,4.25)) + 
    coord_equal() 

enter image description here

+0

完美!這是非常豐富的。對此,我真的非常感激。乾杯! –