@@ -128,7 +128,19 @@ toBasic <-
128
128
},line = function (g ){
129
129
g $ data <- g $ data [order(g $ data $ x ),]
130
130
group2NA(g , " path" )
131
- },ribbon = function (g ){
131
+ },
132
+ histogram = function (g ) {
133
+ bin_start <- min(g $ data $ xmin )
134
+ bin_end <- max(g $ data $ xmax )
135
+ xdim <- g $ aes [[" x" ]]
136
+ g $ data <- NULL
137
+ g $ data $ x <- g $ plot [[xdim ]]
138
+ g $ plot <- NULL
139
+ g $ params $ xstart <- bin_start
140
+ g $ params $ xend <- bin_end
141
+ g
142
+ },
143
+ ribbon = function (g ){
132
144
stop(" TODO" )
133
145
})
134
146
@@ -182,6 +194,22 @@ geom2trace <-
182
194
type = " scatter" ,
183
195
mode = " lines" ,
184
196
line = paramORdefault(params , aes2line , line.defaults ))
197
+ },
198
+ histogram = function (data , params ) {
199
+ L <- list (x = data $ x ,
200
+ name = params $ name ,
201
+ text = data $ text ,
202
+ type = " histogram" ,
203
+ fillcolor = toRGB(params $ fill ))
204
+ if (is.null(params $ binwidth )) {
205
+ L $ autobinx <- TRUE
206
+ } else {
207
+ L $ autobinx <- FALSE
208
+ L $ xbins = list (start = params $ xstart ,
209
+ end = params $ xend ,
210
+ size = params $ binwidth )
211
+ }
212
+ L
185
213
}
186
214
)
187
215
@@ -197,7 +225,8 @@ markLegends <-
197
225
path = c(" linetype" , " size" , " colour" ),
198
226
polygon = c(" colour" , " fill" , " linetype" , " size" , " group" ),
199
227
bar = c(" fill" ),
200
- step = c(" linetype" , " size" , " colour" ))
228
+ step = c(" linetype" , " size" , " colour" ),
229
+ histogram = c(" colour" , " fill" ))
201
230
202
231
markUnique <- as.character(unique(unlist(markLegends )))
203
232
@@ -239,17 +268,19 @@ gg2list <- function(p){
239
268
p $ layers [[layer.i ]]$ data <- p $ data
240
269
}
241
270
}
242
- geom_type <- p $ layers [[layer.i ]]$ geom
243
- geom_type <- strsplit(capture.output(geom_type ), " geom_" )[[1 ]][2 ]
244
- geom_type <- strsplit(geom_type , " : " )[[1 ]]
271
+
272
+ geom_type <- p $ layers [[layer.i ]]$ geom $ objname
245
273
# # Barmode.
246
274
layout $ barmode <- " group"
247
275
if (geom_type == " bar" ) {
248
276
stat_type <- capture.output(p $ layers [[layer.i ]]$ stat )
249
277
stat_type <- strsplit(stat_type , " : " )[[1 ]]
250
- if (! grepl(" identity" , stat_type )) {
251
- stop(" Conversion not implemented for " , stat_type )
278
+ if (grepl(" bin" , stat_type )) {
279
+ geom_type <- " histogram"
280
+ warning(" You may want to use geom_histogram." )
252
281
}
282
+ }
283
+ if (geom_type == " bar" || geom_type == " histogram" ) {
253
284
pos <- capture.output(p $ layers [[layer.i ]]$ position )
254
285
if (grepl(" identity" , pos )) {
255
286
layout $ barmode <- " overlay"
@@ -260,6 +291,12 @@ gg2list <- function(p){
260
291
261
292
# # Extract data from built ggplots
262
293
built <- ggplot2 :: ggplot_build(p )
294
+
295
+ if (geom_type == " histogram" ) {
296
+ # Need actual data (distribution)
297
+ trace.list $ plot <- built $ plot $ data
298
+ }
299
+
263
300
ranges <- built $ panel $ ranges [[1 ]]
264
301
for (i in seq_along(built $ plot $ layers )){
265
302
# # This is the layer from the original ggplot object.
@@ -306,7 +343,7 @@ gg2list <- function(p){
306
343
}
307
344
308
345
# # This extracts essential info for this geom/layer.
309
- traces <- layer2traces(L , df , misc )
346
+ traces <- layer2traces(L , df , misc , trace.list $ plot )
310
347
311
348
# # Do we really need to coord_transform?
312
349
# #g$data <- ggplot2:::coord_transform(built$plot$coord, g$data,
@@ -412,6 +449,7 @@ gg2list <- function(p){
412
449
if (length(trace.list ) == 1 ){
413
450
stop(" No exportable traces" )
414
451
}
452
+ trace.list $ plot <- NULL
415
453
trace.list
416
454
}
417
455
@@ -421,9 +459,10 @@ gg2list <- function(p){
421
459
# ' @param misc named list.
422
460
# ' @return list representing a layer, with corresponding aesthetics, ranges, and groups.
423
461
# ' @export
424
- layer2traces <- function (l , d , misc ){
462
+ layer2traces <- function (l , d , misc , plot = NULL ){
425
463
g <- list (geom = l $ geom $ objname ,
426
- data = d )
464
+ data = d ,
465
+ plot = plot )
427
466
# # needed for when group, etc. is an expression.
428
467
g $ aes <- sapply(l $ mapping , function (k ) as.character(as.expression(k )))
429
468
@@ -438,6 +477,10 @@ layer2traces <- function(l, d, misc){
438
477
data.vec <- l $ data [[col.name ]]
439
478
if (inherits(data.vec , " POSIXt" )){
440
479
data.vec <- strftime(data.vec , " %Y-%m-%d %H:%M:%S" )
480
+ } else if (inherits(data.vec , " factor" )) {
481
+ # # Re-order data so that Plotly gets it right from ggplot2.
482
+ g $ data <- g $ data [order(g $ data [[a ]]),]
483
+ data.vec <- data.vec [match(g $ data [[a ]], as.numeric(data.vec ))]
441
484
}
442
485
g $ data [[a ]] <- data.vec
443
486
}
@@ -532,9 +575,9 @@ layer2traces <- function(l, d, misc){
532
575
for (data.i in seq_along(data.list )){
533
576
data.params <- data.list [[data.i ]]
534
577
tr <- do.call(getTrace , data.params )
535
- for (v.name in c(" x" , " y" )){
578
+ for (v.name in c(" x" , " y" )) {
536
579
vals <- tr [[v.name ]]
537
- if ( is.na(vals [length(vals )])){
580
+ if (length( vals ) > 0 && is.na(vals [length(vals )])) {
538
581
tr [[v.name ]] <- vals [- length(vals )]
539
582
}
540
583
}
0 commit comments