【问题标题】:ggplot boxplot: log10 y axis AND forced 0-100 rangeggplot boxplot:log10 y轴和强制0-100范围
【发布时间】:2016-09-09 17:10:35
【问题描述】:

我想绘制一些数据直方图样式。对数据进行了缩放,使得单个观察值的值为 100。但是,数据将按类别分解为文档的单独部分,因此大多数组的最大值不会是 100。

我希望我的绘图使用 log10 y 轴,并使用 固定的 0 到 100 比例

以下内容尊重日志转换,但忽略 0-100 范围并发出警告。我尝试了 coord_cartesian(ylim = c(0, 100)) 和 scale_y_continuous(trans = log10_trans()) 的其他排列,但还没有运气。

library(ggplot2)

toread <- "general  specific    satisfaction
fruit   apple   9
fruit   apple   8
fruit   banana  8
fruit   banana  7
fruit   pear    6
veg carrot  7
veg celery  4
veg turnip  3
veg turnip  2
veg turnip  1
grain   pasta   6
grain   quinoa  3
grain   brownrice   2
grain   brownrice   6" 

foodprefs <- read.table(textConnection(toread), header = TRUE) 
closeAllConnections() 

foodprefs$pct.max <- (foodprefs$satisfaction / max(foodprefs$satisfaction)) * 100

lapply(sort(unique(
  as.character(foodprefs$general))), function(one.cat) {

    temp <- foodprefs[foodprefs$general == one.cat , ]

    ggplot(temp, aes(x = specific, y = pct.max)) +
      geom_boxplot() +
      ylim(0, 100) +
      scale_y_log10() +
      coord_flip()
  })

【问题讨论】:

    标签: r ggplot2 histogram


    【解决方案1】:

    你的代码有两个问题:

    1. 调用ylim() 会为y 轴建立一个刻度,这就是为什么您会收到有关指定第二个刻度(对数刻度)的警告,这将覆盖第一个刻度。这就是为什么你的 ylims 没有“粘住”的原因。
    2. log10(0) = 无限大,无法绘制,因此该限制对对数刻度功能无效。

    顺便说一句,您的代码可以使用 plyr 包进行简化。以下代码使用scale_y_log10 指定限制,并解决了这两个问题。此外,plyr 的使用使代码更简洁。

    library(plyr)
    dlply(foodprefs, .(general), function(one.cat) {
    
        ggplot(one.cat, aes(x = specific, y = pct.max)) +
            geom_boxplot() +
            scale_y_log10(limits = c(1, 100)) +
            coord_flip()
    })
    

    我不确定在此处使用对数刻度是否能实现出色的可视化效果,但你去吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-05
      • 2022-08-03
      • 1970-01-01
      • 2021-05-17
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多