【问题标题】:Create bar plot with logarithmic scale in R在 R 中创建具有对数刻度的条形图
【发布时间】:2020-07-30 20:08:47
【问题描述】:

我正在尝试创建一个对数刻度的条形图,因为我的数据从 3.92 变化到 65700。

这是我目前使用的代码:

beach <- c(PlasticsBlue=3.92, PlasticsGrey=65700, FoamsOrange=17.9, FoamsWhite=51300, RopesGreen=9.71, RopesGreen=3140)
beach
par(mar = c(10, 5, 10, 5))

barplot(beach, names.arg=c("Plastics/Blue", "Plastics/Grey", "Foams/Orange", "Foams/White", "Ropes/Green", "Ropes/Green"), col=c("red2", "slateblue4", "red2", "slateblue4", "red2", "slateblue4", "red2"), legend.text = c("Lowest", "Highest"), args.legend=list(cex=0.75,x="topright"), ylim=c(1,100000), log = ("y"), las=2, ylab = expression("mg g"^-1)) 

谁给了我这张图graph

这正是我正在寻找的,除了使用的 log 函数意味着下一个刻度线将是 1000000,这太大了,因此目前 y 轴仅编号为 10000,这不包含我最大的价值观。有什么办法可以让 y 轴编号为 100000,同时仍然使用 log 函数,因为当我第一次在 excel 中制作图表时这似乎有效(参见 graph2 链接)graph2

提前致谢,阿利斯泰尔

【问题讨论】:

    标签: r bar-chart


    【解决方案1】:

    如果你愿意摆弄 R 中的细节,你总能得到什么。在这种情况下,绕过 R 的有用日志轴并构建自己的日志轴会更容易:

    options(scipen=8)
    out <- barplot(log10(beach), names.arg=c("Plastics/Blue", "Plastics/Grey", "Foams/Orange",
          "Foams/White", "Ropes/Green", "Ropes/Green"), col=c("red2", "slateblue4", "red2",
          "slateblue4", "red2", "slateblue4", "red2"), legend.text = c("Lowest", "Highest"),
           args.legend=list(cex=0.75,x="topright"), ylim=c(0, 5), las=2, yaxt="n",
           ylab = expression("mg g"^-1))
    yval <- c(1, 10, 100, 1000, 10000, 100000)
    ypos <- log10(yval)
    axis(2, ypos, yval, las=1)
    text(out, log10(beach), beach, pos=3, xpd=NA)
    

    第一行只是防止 R 切换到 100000 值的科学计数法。条形图的不同之处在于我们使用log10() 转换原始数据,根据log10 值设置ylim,并抑制y 轴。然后我们在 y 轴上创建一个我们想要标记的位置向量并获取它们的 log10 位置。最后我们打印轴。最后一行使用来自 barplot 的值 out,它返回条在 x 轴上的位置,以便我们可以在条的顶部打印值。

    【讨论】:

    • 也非常感谢!这正是我试图做的,但只是无法从其他帖子中弄清楚。非常有帮助:)
    【解决方案2】:

    使用 ggplot2 和 company 可能如下所示:

    library(dplyr)
    library(ggplot2)
    library(tibble)
    library(scales)
    
    beach <- c(PlasticsBlue = 3.92, PlasticsGrey = 65700, FoamsOrange = 17.9, FoamsWhite = 51300, RopesGreen = 9.71, RopesGreen = 3140) %>%
      enframe() %>%
      mutate(colorID = rep(c('Lowest', 'Highest'), 3))
    
    plot <- beach %>%
      ggplot(aes(x = 1:nrow(beach), y = value, label = value, fill = colorID)) +
      geom_col(stat = 'identity') +
      scale_y_continuous(trans = "log10", labels = label_number(), breaks = c(1, 10, 100, 1000, 10000, 100000)) +
      scale_x_discrete(labels = beach$name, breaks = 1:nrow(beach), limits = 1:nrow(beach)) +
      geom_text(vjust = -1) +
      theme_minimal() +
      theme(panel.background = element_blank(),
            panel.grid.major = element_blank(),
            panel.grid.minor = element_blank(),
            axis.line.y = element_line(colour = 'black'),
            legend.position = 'right',
            legend.title = element_blank()) +
      labs(y = expression("mg g"^-1),
           x = 'Category/Sample colour') +
      scale_fill_manual(values = rep(c('slateblue4', 'red2'), 3))
    

    这给了我们:

    【讨论】:

    • 非常感谢!我早些时候尝试涉足 ggplot 但无济于事,这太棒了。
    • 抱歉这是个错误。你的回答很有用!
    猜你喜欢
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2012-12-07
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多