【问题标题】:How can I flip and then zoom in on a boxplot?如何翻转然后放大箱线图?
【发布时间】:2017-02-01 07:23:35
【问题描述】:

考虑以下代码:

library(ggplot2)
ggplot(diamonds, aes("", price)) + geom_boxplot() + coord_flip()

翻转箱线图后,如何将价格(即新的 x 轴)放大到c(0,7000)

我觉得它与coord_cartesian(ylim=c(0, 7000)) 有一些关系,但这似乎与 coord_flip() 不兼容。

【问题讨论】:

    标签: r ggplot2 boxplot


    【解决方案1】:

    这是我的解决方案:

    ggplot(diamonds, aes("", price)) + 
      geom_boxplot() + 
      coord_flip(ylim=c(0, 7000))
    

    只需将ylim 命令作为参数组合到coord_flip() 中即可。

    【讨论】:

      【解决方案2】:

      你可以使用scale_y_continuous():

      library(ggplot2)
      ggplot(diamonds, aes("", price)) + 
        geom_boxplot() + 
        coord_flip() +
        scale_y_continuous(limits = c(0, 7000))
      

      记住 coord_flip() 只是旋转绘图,因此您在 y 轴上调用 scale_,这是您指定的 price 。出于这个原因,我通常喜欢将其称为最后一个:以帮助减少对哪个轴是哪个轴的混淆!

      【讨论】:

      • 这会输出不同的箱线图。例如,上部铰链现在低于 5,000。
      • @JanVanhove 不错。请参阅this question & answers,详细了解铰链发生变化的原因以及如何避免它
      • scale_* 不会放大绘图,只有 coord_*ylimxlim 参数会放大。有关更多信息,请参阅此post
      【解决方案3】:

      我认为您需要手动计算箱线图统计数据并绘制这些数据。

      # Compute summary statistics with max (y100) set to cutoff (7000)
      df <- data.frame(x = 1,
                   y0 = min(diamonds$price),
                   y25 = quantile(diamonds$price, 0.25),
                   y50 = median(diamonds$price),
                   y75 = quantile(diamonds$price, 0.75),
                   y100 = 7000
                   )
      
      ggplot(df, aes(x)) +
        geom_boxplot(aes(ymin = y0, lower = y25, middle = y50, upper = y75, ymax = y100),
                stat = "identity") +
        coord_flip()
      

      【讨论】:

      • 这可能会提供所需的解决方案(我不确定提问者到底想要什么),但生成的可视化将是对数据的轻微歪曲,因为某些数据已被人为“隐藏” " 并且显示的统计数据(例如中位数、IQR)不是所显示数据的统计数据,而是一些其他数据的统计数据,并非所有这些数据都显示在可视化中。
      • 我同意。对 x 轴进行对数转换可能是解决潜在问题的更好方法。
      • 或者我今天从 Thomas Pedersen 那里看到的这个:twitter.com/thomasp85/status/779289579232821248 尚未发布但值得一看!
      • 请注意,在翻转箱线图上转换数据的日志会引入其自身的复杂性,因为 ggplot 会错误地计算统计数据。见这里stackoverflow.com/questions/38753628/…
      • 另外,我应该指出,您在此处使用的统计数据对于箱线图是不正确的(晶须不会扩展到最大值和最小值)。您应该使用boxplot.stats() 来计算统计数据和异常值。
      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-28
      • 1970-01-01
      • 2014-11-05
      相关资源
      最近更新 更多