ggplot boxplot:log10 y轴AND强制0-100范围

时间:2016-09-09 17:10:36

标签: r ggplot2 histogram

我想绘制一些数据直方图样式。缩放数据,以便单个观察值为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()
  })

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题:

  1. 调用ylim()建立y轴的比例,这就是为什么你得到关于指定第二个比例(对数比例)的警告,它将覆盖第一个比例。这就是为什么你的ylims不会坚持&#34;。
  2. log10(0) =无限,无法绘制,因此对于日志比例功能,限制无效。
  3. 另外,使用 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()
    })
    

    enter image description here

    我不确定日志比例是否能在这里实现出色的可视化效果,但是你去了。