2017-08-09 21 views
0

我想做一個氣泡圖,我有多個z值爲每個xy座標。我想geom_point的大小是每個XY平均Z值座標/ interaction-我的預期輸出會是這樣的:Rggplot氣泡圖的大小由組的平均值

enter image description here

我試圖通過x和y值的交互分組,但不能得到ggplot採取該組的意思。相反,我得到的是整個數據集的平均值,或者是在同一個xy位置繪製多個點,每個點都具有由z值設置的自己的大小。這裏是我試過前:

library(ggplot2) 

z <- seq(1,20, length.out = 18) 
xy <- expand.grid(c(1,2,3),c(1,2,3)) 
xyz <- data.frame(xy, z) 
names(xyz) <- c("x", "y", "z") 

ggplot(xyz, aes(x, y, group = interaction(x,y)))+ 
    geom_point(size = z, position = position_jitter(width = 0.2, height = 0)) 

其中給出該地塊(抖動顯示該所描繪的多個點):

enter image description here

所以 - 是有可能按XY位置和通過每個位置的平均值設置大小?當然,如果需要,我可以首先找到意思,但是我想知道ggplot本身是否有一種方法。

在此先感謝,請讓我知道是否需要澄清任何事情。

+1

我縮小你最接近的內置ggplot賭注將是'stat_bin_2d',它會做2d組的點,但它不支持你想要的幾何和美學。只要先進行數據轉換並將彙總數據傳遞給ggplot即可。 – Gregor

+0

@Gregor足夠公平,如果不能這樣做就是這樣。你說得對,'stat_bin_2d'不能讓我滿足我的需要。謝謝! –

+0

'ggplot'是一個繪圖軟件包。爲了方便起見,它有能力進行一些基本的聚合,但是在'data.table'或'dplyr'中使用簡單的一行或兩行時,獲取繪圖軟件包可以爲您執行數據操作並沒有真正的好處。 – Gregor

回答

0

感謝@Gregor指着我stat_bin_2d這讓我的解決方案,最終爲我工作:

library(ggplot2) 

z <- runif(81, min = 4, max = 10) 
xy <- expand.grid(c(1,2,3),c(1,2,3)) 
xyz <- data.frame(xy, z) 
names(xyz) <- c("x", "y", "z") 

ggplot(xyz, aes(x, y, z = z), col = "black")+ 
    stat_summary_2d(aes(size = ..value..), geom = "point")+ 
    scale_size(range = c(4, 15))+ 
    guides(fill = FALSE) 

,其輸出是這樣的:

enter image description here

Alt根據格雷戈爾和尼古拉斯的說法,這在技術上可以做到我想要的 - 這很少會成爲這樣做的正確方法。

2

這會讓你在那裏。儘管我寧願先樞轉/彙總數據,然後ggplot彙總的df。

ggplot(data = (xyz %>% group_by(x, y) %>% summarise(z.mean = mean(z))), 
     aes(x, y, size = z.mean)) + 
geom_point(position = position_jitter(width = 0.2, height = 0)) 

enter image description here

+0

+1對於肯定能夠工作的解決方案,但我特別想知道如何使用ggplot分組機制來完成此任務,而不是尋找合併/彙總的方法。感謝你的回答! –