如何在 R 中使用 ggplot2 绘制的绘图的 y 轴刻度中准确显示数字的 SI 前缀?

Posted

技术标签:

【中文标题】如何在 R 中使用 ggplot2 绘制的绘图的 y 轴刻度中准确显示数字的 SI 前缀?【英文标题】:How to accurately display SI prefix for numbers in y-axis scale of plot made with ggplot2 in R? 【发布时间】:2014-01-10 13:26:49 【问题描述】:

我有以下情节,使用此代码生成

plt <- ggplot(d2, aes_string(x=names(same_df)[1],y= "value")) + 
    geom_point(aes(color = variable), size = 1)+ theme_bw()+
    theme(legend.text=element_text(size=14), legend.title=element_text(size=14))+
    theme(axis.text=element_text(size=20)) +
    theme(axis.title=element_text(size=20,face="bold")) + scale_color_discrete(name = "title", labels = c("1", "2", "3", "4","5","6","7","8","9")) + labs(x = "x", y = "y")+ guides(colour = guide_legend(override.aes = list(size=4),ncol=2,title.hjust=0.5))+theme(plot.margin=unit(c(0,0,0,0),"mm"))

但是,我需要 y 轴上的数字使用 SI 前缀表示法,以便我执行以下步骤,

library("sos")

使用sitools包中的findFn

findFn("SI prefix") 

然后我使用标签中的 f2si 将浮点数数字转换为带有 SI 前缀的数字

plt2 <- plt + scale_y_continuous(labels=f2si)

生成的图如下所示,

虽然 f2si 将 -1e^-0.8 的 y 轴准确地更改为 -10 n,但它不能准确地显示 0 和 1e^-0.8 的值,它们分别为 0 和 10 n。有人可以建议在这里应该更正什么,以便数字显示应该始终如一。

谢谢。

【问题讨论】:

见here。 【参考方案1】:

我无法重现您的行为。看到这个:

df <- data.frame(x=runif(100), y=(runif(100)-1/2)/1e8)
p <- ggplot(df, aes(x, y)) + geom_point()
p + scale_y_continuous(labels=f2si)

我还有found另一个类似的功能,如果你不喜欢“0 n”标签:

  format_si <- function(...) 
  # Based on code by Ben Tupper
  # https://stat.ethz.ch/pipermail/r-help/2012-January/299804.html

  function(x) 
    limits <- c(1e-24, 1e-21, 1e-18, 1e-15, 1e-12,
                1e-9,  1e-6,  1e-3,  1e0,   1e3,
                1e6,   1e9,   1e12,  1e15,  1e18,
                1e21,  1e24)
    prefix <- c("y",   "z",   "a",   "f",   "p",
                "n",   "µ",   "m",   " ",   "k",
                "M",   "G",   "T",   "P",   "E",
                "Z",   "Y")

    # Vector with array indices according to position in intervals
    i <- findInterval(abs(x), limits)

    # Set prefix to " " for very small values < 1e-24
    i <- ifelse(i==0, which(limits == 1e0), i)

    paste(format(round(x/limits[i], 1),
                 trim=TRUE, scientific=FALSE, ...),
          prefix[i])
  


p + scale_y_continuous(labels=format_si())

【讨论】:

感谢您的建议,它现在可以工作了,我猜您的意思是代码的最后一行中的 p + scale_y_continuous(labels=format_si()) 删除了接近 0 的 n。 我真的很喜欢您编写的 format_si() 函数,因为它很容易定制,比如如果需要的话,可以用“B”代替“G”来代表数十亿。 @coip 谢谢,我的荣幸。

以上是关于如何在 R 中使用 ggplot2 绘制的绘图的 y 轴刻度中准确显示数字的 SI 前缀?的主要内容,如果未能解决你的问题,请参考以下文章

R绘图 第五篇:绘制点图(ggplot2)

R:ggrepel,ggplot2 绘图区域上方的标签

数据可视化 | 使用R语言绘制专业图表(Ⅰ)——ggplot2 图形语法基础

如何在不改变绘图宽度的情况下使用 ggplot2 在 R 中添加可变大小的 y 轴标签?

R语言绘图(ggplot2、ggpurb)从入门到精通06--柱状图美化之宽度调节

R ggplot2绘制具有不等长度矢量的循环