@@ -33,27 +33,43 @@ StatAlign <- ggproto("StatAlign", Stat,
33
33
34
34
setup_params = function (data , params ) {
35
35
params $ flipped_aes <- has_flipped_aes(data , params , ambiguous = TRUE )
36
- x_name <- flipped_names(params $ flipped_aes )$ x
37
- y_name <- flipped_names(params $ flipped_aes )$ y
38
- x_cross <- dapply(data , " group" , function (d ) {
39
- pivots <- cumsum(rle(d [[y_name ]] < 0 )$ lengths )
40
- pivots <- pivots [- length(pivots )]
41
- cross <- vapply(pivots , function (i ) {
42
- y <- d [[y_name ]][c(i , i + 1 )]
43
- x <- d [[x_name ]][c(i , i + 1 )]
44
- - y [1 ]* diff(x )/ diff(y ) + x [1 ]
45
- }, numeric (1 ))
46
- data_frame(cross = cross )
47
- })
48
- unique_loc <- unique(sort(c(data [[x_name ]], x_cross $ cross )))
49
- adjust <- diff(range(unique_loc , na.rm = TRUE )) * 0.001
50
- adjust <- min(adjust , min(diff(unique_loc ))/ 3 )
51
- unique_loc <- sort(c(unique_loc - adjust , unique_loc , unique_loc + adjust ))
52
- params $ unique_loc <- unique_loc
53
- params $ adjust <- adjust
54
36
params
55
37
},
56
38
39
+ compute_panel = function (self , data , scales , flipped_aes , ... ) {
40
+ if (empty(data )) {
41
+ return (data_frame0())
42
+ }
43
+
44
+ names <- flipped_names(flipped_aes )
45
+ x <- data [[names $ x ]]
46
+ y <- data [[names $ y ]]
47
+
48
+ if (is_unique(data $ group )) {
49
+ # No need for interpolation
50
+ cross <- x [0 ]
51
+ } else {
52
+ # Find positions where 0 is crossed
53
+ pivot <- vec_unrep(data_frame0(group = data $ group , y = y < 0 ))
54
+ group_ends <- cumsum(vec_unrep(pivot $ key $ group )$ times )
55
+ pivot <- cumsum(pivot $ times )[- group_ends ]
56
+ cross <- - y [pivot ] * (x [pivot + 1 ] - x [pivot ]) /
57
+ (y [pivot + 1 ] - y [pivot ]) + x [pivot ]
58
+ }
59
+
60
+ unique_loc <- unique(sort(c(x , cross )))
61
+ adjust <- diff(range(unique_loc , na.rm = TRUE )) * 0.001
62
+ adjust <- min(adjust , min(diff(unique_loc )) / 3 )
63
+ unique_loc <- unique(sort(c(
64
+ unique_loc - adjust , unique_loc , unique_loc + adjust
65
+ )))
66
+
67
+ ggproto_parent(Stat , self )$ compute_panel(
68
+ data , scales , flipped_aes = flipped_aes , unique_loc = unique_loc ,
69
+ adjust = adjust , ...
70
+ )
71
+ },
72
+
57
73
compute_group = function (data , scales , flipped_aes = NA , unique_loc = NULL , adjust = 0 ) {
58
74
data <- flip_data(data , flipped_aes )
59
75
if (is_unique(data $ x )) {
0 commit comments