2017-03-09 82 views
0

在我的理解中,ggplot的stat方法取值爲數組並計算可以通過某些美學顯示的新值。我希望點的大小與每個組內的數值變量的總和成比例(獨特的x, y組合)。我很驚訝,每當一組中有多個值時,繪製了多個點,而不是代表所有點的總和。這裏是一個最小的工作示例:如何將ggplot stat_sum映射爲尺寸美學?

ex_data <- data.frame(
    a = sort(rep(letters[1:4], 5)), 
    b = rep(letters[6:7], 10), 
    c = rnorm(20, 1000, 500), 
    d = rep(c('h', 'h', 'i', 'i'), 5) 
) 

p <- ggplot(ex_data, 
    aes(x = b, y = a, size = log10(c), color = d, shape = d)) + 
    geom_point(stat = 'sum', alpha = 0.33) + 
    scale_radius(guide = guide_legend(title = 'c (log)')) + 
    scale_color_manual(values = c('cyan', 'magenta'), 
        guide = guide_legend(title = 'd'), 
        labels = c('h', 'i')) + 
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw() 

print(p) 

由於低阿爾法它是可見的,對於例如在c-fa-f相同顏色的多個點被繪製在彼此之上。我如何能夠在每個位置獲得每種顏色的一個點,這些標記的大小代表該組中所有變量值的總和?

+0

哪有一點,如果你正在映射兩種顏色在那個座標上?該點有什麼顏色?什麼形狀? – Axeman

+0

我指的是每種顏色的一個點,但不是同一位置的相同顏色的兩個點 – deeenes

+1

一般來說,我發現'stat_summary'對'y'美學中的簡單彙總函數很有用。這聽起來像是你想將數據集總結到每個'a' /'b' /'d'組合的'c'的單個值。在ggplot之外,這可能是最簡單的,使用匯總數據集來創建所需的圖。 – aosmith

回答

0

看起來stat='sum'是隻能與y美學一起工作,因此我們需要彙總數據纔去ggplot應用統計。這是dplyr的一個工作示例。 (注:堆棧溢出審稿並沒有讓我來編輯MAK77的答覆,並接受它,這是我寫一個新的答案的唯一原因。)

require(dplyr) 
require(ggplot2) 

ex_data <- data.frame(
    a = sort(rep(letters[1:4], 5)), 
    b = rep(letters[6:7], 10), 
    c = rnorm(20, 1000, 500), 
    d = rep(c('h', 'h', 'i', 'i'), 5) 
) 

ex_data_2 <- ex_data %>% 
     group_by(a, b, d) %>% 
     mutate(csum = sum(c)) %>% 
     summarise_all(first) 

p <- ggplot(ex_data_2, 
      aes(x = b, y = a, size = log(csum), color = d, shape = d)) + 
    geom_point(alpha = 0.33) + 
    scale_radius(guide = guide_legend(title = 'c (log)')) + 
    scale_color_manual(values = c('cyan', 'magenta'), 
        guide = guide_legend(title = 'd'), 
        labels = c('h', 'i')) + 
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw() 
p 
1

我相信你需要以某種方式重塑數據。這是我的例子(與data.tabledplyr

ex_data_2 <- data.table(ex_data) %>% 
    .[, list(c = sum(c), 
      d = which.max(table(d))), by = list(a, b)] %>% 
    .[, d := c('c', 'd')[d]] 
p <- ggplot(ex_data_2, 
      aes(x = b, y = a, size = log(c), color = d, shape = d)) + 
    geom_point(stat = 'sum', alpha = 0.33) + 
    scale_radius(guide = guide_legend(title = 'c (log)')) + 
    scale_color_manual(values = c('cyan', 'magenta'), 
         guide = guide_legend(title = 'd'), 
         labels = c('h', 'i')) + 
    scale_shape_manual(values = c(15, 18), guide = FALSE) + 
    theme_bw() 
p 
+0

'sort.list(y)中的錯誤:'x'對於'sort.list'必須是原子的。 您是否在列表中調用了'sort'? – Axeman

+0

感謝您的回答!我運行代碼,每個點都會降低一層'd',所以我有青色或洋紅色(我猜是由於'which_max(table(d))'。另一件事是這樣'stat'確實沒有意義,足以將尺寸傳遞給主美學,所以ggplot的這種便利性不能被利用。 – deeenes