ggplot2 y轴标签小数精度

20

我正在使用循环绘制几个ggplot图表(我知道不应该用循环,应该使用plyr...但是)我想知道是否有一种方法可以将小数精度设置为例如一位小数(即0.0)。我正在使用以下比例转换。

p <- p + scale_y_log10()

希望能得到任何帮助。

1个回答

23

我原本认为一个小数点后一位(即1.2)是默认值,但如果你看到了更多的小数位数,你可以通过设置scale参数来指定格式:

fmt_dcimals <- function(decimals=0){
   # return a function responpsible for formatting the 
   # axis labels with a given number of decimals 
   function(x) as.character(round(x,decimals))
}

然后将比例尺添加到您的图表中:

ggplot( ... ) + scale_y_log10(labels = fmt_dcimals(2))

现在我想到了一个问题,如果你真的要编写自己的格式化程序,你应该使用 format 函数来完成工作,而不是进行四舍五入和强制转换。这样可能更安全和“更好”。

例如,要强制保留小数点后两位,你可以将此格式化函数更改为以下内容:

fmt_dcimals <- function(decimals=0){
    function(x) format(x,nsmall = decimals,scientific = FALSE)
}

你可以通过对format函数的nsmalldigits参数进行进一步调整来获得你想要的结果。以下是一个使用它的示例:

df <- data.frame(x = 1:5,y = rexp(5))
ggplot(df,aes(x = x,y=y)) + 
    geom_point() + 
    scale_y_log10(labels = fmt_dcimals(2))

输入图像描述


谢谢。为了保持轴的外观一致,即使数字四舍五入到一位小数,我仍希望始终有两位小数。有没有办法使round函数始终返回两个小数(例如round(22.50,2)返回22.5而不是22.50)? - MikeTP
为什么你在一个函数内部还有一个函数? - naught101
较新版本的ggplot进行了重写,以便大多数scale_*函数的labels参数接受一个_函数_作为值。在相关的scales包中,您会找到许多格式化函数,实际上返回用于格式化标签的函数。简而言之,将其包装在fmt()中使得我们在scale_*中的代码比将整个函数作为scale_*的参数写出来更加简洁。 - joran
2
@joran:我无法理解这个。为什么你不直接使用 fmt<-function(x){format(x,nsmall = 2,scientific = FALSE)} ; ggplot(df,aes(x = x,y=y)) + scale_y_log10(labels = fmt) ?(请注意,scale调用中缺少 ())。它完全做同样的事情,但直接将函数传递给ggplot,而不是传递一个传递函数的函数。 - naught101
4
对于这个特定的例子,你是正确的,它并不太重要。但这只是因为我们不需要通过任何参数传递。考虑 date_format。如果我们像你描述的那样做,我们如何传递不同的日期格式呢?现在考虑一个更复杂的例子,比如 math_format。所以我只是遵循传统格式,仅此而已。 - joran
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接