使用ggplot进行简单箱线图时如何解决不一致的绘图?

How to solve inconsistant ploting while using ggplotly for simple boxplot?

我正在尝试利用新的 ggplot2(开发版)功能使我的绘图具有交互性。我也安装了 plotly-dev 版本。

但是,对我来说,它似乎没有像承诺的那样工作。考虑一下,

gg <- ggplot(data = mtcars, aes(x = factor(mtcars$cyl), y = mtcars$hp)) + 
  geom_boxplot(aes(fill = factor(mtcars$cyl), color = factor(mtcars$cyl), alpha = 1/2 )) 

gg 

ggplotly(gg)

如果您注意到,您会发现异常值在 ggploty() 中的标记不同。 我怎样才能摆脱它,使其看起来 'same' 为 ggplot(第一个图)?

那么,我如何add/edit ggplotly 上的图例。

时隔一年多来回答有点尴尬。但希望它对以后搜索相同问题的人有所帮助,因为我最近遇到了类似的问题(当我无法隐藏 geom_boxplot 中的异常值时)。

参考 R or Python 中的 plotly boxplot,您可能在这些 c('all', False, 'suspectedoutliers','outliers') 之一中有 boxpoints,显示异常值的方式不同。选择'suspectedoutliers'时,可以调整标记的样式。在这里,差异来自 标记 之外。

我还没有找到在 ggplotly 中轻松做到这一点的方法,但在 plotly_build 中通过一些努力是可行的。 (你正在深入它存储数据的结构)

首先,

    gg <- ggplot(data = mtcars, aes(x = factor(mtcars$cyl), y = mtcars$hp)) + 
        geom_boxplot(aes(fill = factor(mtcars$cyl), color = factor(mtcars$cyl), alpha = 1/2 ))
    ggly <- plotly_build(gg)

你可以看看ggly$x$data。您可能会看到一个包含 3 个项目的列表,它们对应于图表上的 3 个框。

接下来,

    for (i in 1:length(ggly$x$data)) {
        # ggly$x$data[[i]]$boxpoints <- "outliers"
        ggly$x$data[[i]]$marker$line <- NULL
        ggly$x$data[[i]]$line$width <- 1
    }
    rm(i)
    ggly

因为它没有 $boxpoints 参数并且有 markerline 的参数,我删除了标记外的线,然后更改框线的宽度。 这将修复离群值的外观。如果你也想修复图例,也许你可以查看$legendgroup,但是,我还没有一个好的解决方案。

顺便说一句,如果有人正在寻找 hide/disable 异常值的方法,例如 in geom_boxplot,您可以使用 'suspectedoutliers' 并通过将其不透明度设置为 0 来设置异常值的样式。(我这样做是为了稍后绘制另一层抖动。)

    for (i in 1:length(ggly$x$data)) {
        ggly$x$data[[i]]$boxpoints <- "suspectedoutliers"
        ggly$x$data[[i]]$marker$opacity <- 0
    }
    rm(i)
    ggly

再说一次,希望对你有帮助。