2016-08-30 13 views
2

私は同じX座標とY座標を持つ点の数を表す点のサイズを持つggplotの散布図を作成する関数を書いています。ggplotカスタムジオメトリ関数を書く

私が働く機能を持っている:

require(dplyr) 
plot_size_bubbles <- function(x,y) { 
    dd = data.frame(x,y) %>% 
    group_by(x,y) %>% 
    summarise(n=n()) %>% 
    ungroup() 
    ggplot(dd, aes(x,y)) + geom_point(aes(size=n)) 
} 

X = sample(1:3,10,replace = T) 
Y = sample(1:3,10,replace = T) 
plot_size_bubbles(X,Y) 

私はgeom_pointから継承されたカスタムジオメトリ関数としてggplotのスタイルでそれをしたいのですが。たぶん私はいくつかの統計関数を使用することができます、確かに。基本的には、ggplotにデータフレームを渡し、xとyをマップし、ポイントサイズを事前に計算することなくこのプロットを作成したいと思います。同様に

ggplot(data.frame(X,Y), aes(X,Y)) + geom_sizebubble() 

さらに、元のデータフレームからx軸ラベルとy軸ラベルを持つことは素晴らしいことです。

希望はありますか、私は何かを欠いています。

答えて

3
stat_accum <- function(mapping = NULL, data = NULL, 
         geom = "point", position = "stack", 
         ..., 
         show.legend = NA, 
         inherit.aes = TRUE) { 

    layer(
    data = data, 
    mapping = mapping, 
    stat = StatAccum, 
    geom = geom, 
    position = position, 
    show.legend = show.legend, 
    inherit.aes = inherit.aes, 
    params = list(
     na.rm = na.rm, 
     ... 
    ) 
) 
} 

StatAccum <- ggproto("StatAccum", Stat, 
    compute_layer = function(data, scales, params) { 
    odat <- dplyr::distinct(data, x, y, .keep_all=TRUE) 
    data <- dplyr::count(data, x, y) 
    data <- dplyr::left_join(data, odat, by=c("x", "y")) 
    data$size <- data$n 
    data$n <- NULL 
    data 
} 
) 

set.seed(12) 
dplyr::data_frame(
    X = sample(1:5, 100, replace = TRUE), 
    Y = sample(1:5, 100, replace = TRUE) 
) -> xdf 

ggplot(xdf, aes(X, Y)) + geom_point() 

enter image description here

ggplot(xdf, aes(X, Y)) + geom_point(stat="accum") 

enter image description here

+0

ありがとうございました!これはまさに私が必要としていたものです。私はあなたがそれを出版したときあなたの答えを忘れましたが、それはまだ価値があります。 – yuk