9
9
# ' # Specifying function
10
10
# ' d + stat_summary2d(fun = function(x) sum(x^2))
11
11
# ' d + stat_summary2d(fun = var)
12
- stat_summary2d <- function (mapping = NULL , data = NULL , geom = " rect " , position = " identity" ,
12
+ stat_summary2d <- function (mapping = NULL , data = NULL , geom = NULL , position = " identity" ,
13
13
bins = 30 , drop = TRUE , fun = mean , ... ) {
14
+
14
15
StatSummary2d $ new(mapping = mapping , data = data , geom = geom , position = position ,
15
16
bins = bins , drop = drop , fun = fun , ... )
16
17
}
@@ -24,11 +25,24 @@ StatSummary2d <- proto(Stat, {
24
25
25
26
calculate <- function (. , data , scales , binwidth = NULL , bins = 30 , breaks = NULL , origin = NULL , drop = TRUE , fun = mean , ... ) {
26
27
28
+ data <- remove_missing(data , FALSE , c(" x" , " y" , " z" ), name = " stat_summary2d" )
29
+
27
30
range <- list (
28
31
x = scale_dimension(scales $ x , c(0 , 0 )),
29
32
y = scale_dimension(scales $ y , c(0 , 0 ))
30
33
)
31
34
35
+ # Determine origin, if omitted
36
+ if (is.null(origin )) {
37
+ origin <- c(NA , NA )
38
+ } else {
39
+ stopifnot(is.numeric(origin ))
40
+ stopifnot(length(origin ) == 2 )
41
+ }
42
+ originf <- function (x ) if (is.integer(x )) - 0.5 else min(x )
43
+ if (is.na(origin [1 ])) origin [1 ] <- originf(data $ x )
44
+ if (is.na(origin [2 ])) origin [2 ] <- originf(data $ y )
45
+
32
46
# Determine binwidth, if omitted
33
47
if (is.null(binwidth )) {
34
48
binwidth <- c(NA , NA )
@@ -48,29 +62,25 @@ StatSummary2d <- proto(Stat, {
48
62
49
63
# Determine breaks, if omitted
50
64
if (is.null(breaks )) {
51
- if (is.null(origin )) {
52
- breaks <- list (
53
- fullseq(range $ x , binwidth [1 ]),
54
- fullseq(range $ y , binwidth [2 ])
55
- )
56
- } else {
57
- breaks <- list (
58
- seq(origin [1 ], max(range $ x ) + binwidth [1 ], binwidth [1 ]),
59
- seq(origin [2 ], max(range $ y ) + binwidth [2 ], binwidth [2 ])
60
- )
61
- }
65
+ breaks <- list (
66
+ seq(origin [1 ], max(range $ x ) + binwidth [1 ], binwidth [1 ]),
67
+ seq(origin [2 ], max(range $ y ) + binwidth [2 ], binwidth [2 ])
68
+ )
69
+ } else {
70
+ stopifnot(is.list(breaks ))
71
+ stopifnot(length(breaks ) == 2 )
72
+ stopifnot(all(sapply(breaks , is.numeric )))
62
73
}
63
- stopifnot(is.list(breaks ))
64
- stopifnot(length(breaks ) == 2 )
65
- stopifnot(all(sapply(breaks , is.numeric )))
66
74
names(breaks ) <- c(" x" , " y" )
67
75
68
76
xbin <- cut(data $ x , sort(breaks $ x ), include.lowest = TRUE )
69
77
ybin <- cut(data $ y , sort(breaks $ y ), include.lowest = TRUE )
70
78
71
79
if (is.null(data $ weight )) data $ weight <- 1
72
- ans <- ddply(data.frame (data , xbin , ybin ), .(xbin , ybin ), function (d ) data.frame (value = fun(d $ z , ... )))
73
80
81
+ ans <- ddply(data.frame (data , xbin , ybin ), .(xbin , ybin ), function (d ) data.frame (value = fun(d $ z , ... )))
82
+ if (drop ) ans <- na.omit(ans )
83
+
74
84
within(ans ,{
75
85
xint <- as.numeric(xbin )
76
86
xmin <- breaks $ x [xint ]
0 commit comments