@@ -1004,12 +1004,12 @@ gg2list <- function(p, width = NULL, height = NULL,
1004
1004
# justification of legend boxes
1005
1005
theme $ legend.box.just <- theme $ legend.box.just %|| % c(" center" , " center" )
1006
1006
# scales -> data for guides
1007
- gdefs <- ggfun( " guides_train " )( scales , theme , plot $ guides , plot $ labels )
1008
- if (length( gdefs ) > 0 ) {
1009
- gdefs <- ggfun( " guides_merge " )( gdefs )
1010
- gdefs <- ggfun( " guides_geom " )( gdefs , layers , plot $ mapping )
1007
+ gdefs <- if (inherits( plot $ guides , " ggproto " )) {
1008
+ get_gdefs_ggproto( npscales $ scales , theme , plot , layers )
1009
+ } else {
1010
+ get_gdefs( scales , theme , plot , layers )
1011
1011
}
1012
-
1012
+
1013
1013
# colourbar -> plotly.js colorbar
1014
1014
colorbar <- compact(lapply(gdefs , gdef2trace , theme , gglayout ))
1015
1015
nguides <- length(colorbar ) + gglayout $ showlegend
@@ -1461,8 +1461,9 @@ getAesMap <- function(plot, layer) {
1461
1461
}
1462
1462
1463
1463
# ------------------------------------------------------------------
1464
- # Handle compatibility for changes in ggplot2 >v3.4.2 (#5144),
1465
- # which removed these functions in favor of scale/plot methods
1464
+ # Handle compatibility for changes in ggplot2 >v3.4.2 (specifically #5144),
1465
+ # which moved away from scales_transform_df(), scales_train_df(), etc
1466
+ # towards ggproto methods attached to `scales`
1466
1467
# ------------------------------------------------------------------
1467
1468
scales_transform_df <- function (scales , df ) {
1468
1469
if (is.function(scales $ transform_df )) {
@@ -1495,3 +1496,35 @@ scales_add_missing <- function(plot, aesthetics) {
1495
1496
ggfun(" scales_add_missing" )(plot , aesthetics , plot $ plot_env )
1496
1497
}
1497
1498
}
1499
+
1500
+ # -------------------------------------------------------------------------
1501
+ # Handle compatibility for changes in ggplot2 >v3.4.2 (specifically #4879),
1502
+ # which away from guides_train(), guides_merge(), guides_geom()
1503
+ # towards ggproto methods attached to `plot$guides`
1504
+ # -------------------------------------------------------------------------
1505
+ get_gdefs_ggproto <- function (scales , theme , plot , layers ) {
1506
+ guides <- plot $ guides $ setup(scales )
1507
+ guides $ train(scales , theme $ legend.direction , plot $ labels )
1508
+ if (length(guides $ guides ) > 0 ) {
1509
+ guides $ merge()
1510
+ guides $ process_layers(layers )
1511
+ }
1512
+ # Add old legend/colorbar classes to guide params so that ggplotly() code
1513
+ # can continue to work the same way it always has
1514
+ for (i in which(vapply(guides $ guides , inherits , logical (1 ), " GuideColourbar" ))) {
1515
+ guides $ params [[i ]] <- prefix_class(guides $ params [[i ]], " colorbar" )
1516
+ }
1517
+ for (i in which(vapply(guides $ guides , inherits , logical (1 ), " GuideLegend" ))) {
1518
+ guides $ params [[i ]] <- prefix_class(guides $ params [[i ]], " legend" )
1519
+ }
1520
+ guides $ params
1521
+ }
1522
+
1523
+ get_gdefs <- function (scales , theme , plot , layers ) {
1524
+ gdefs <- ggfun(" guides_train" )(scales , theme , plot $ guides , plot $ labels )
1525
+ if (length(gdefs ) > 0 ) {
1526
+ gdefs <- ggfun(" guides_merge" )(gdefs )
1527
+ gdefs <- ggfun(" guides_geom" )(gdefs , layers , plot $ mapping )
1528
+ }
1529
+ gdefs
1530
+ }
0 commit comments