【问题标题】:ggplot2 y axis label decimal precisionggplot2 y轴标签小数精度
【发布时间】:2012-04-05 20:48:18
【问题描述】:

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

p <- p + scale_y_log10()

任何帮助将不胜感激。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    我的印象是一个小数(即 1.2)是默认值,但如果您看到的小数位数多于这个数,您可以将自己的格式传递给刻度:

    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 的nsmall 和digits 参数来获得您想要的东西。它的使用示例:

    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 抱歉耽搁了。我认为我的编辑解决了您的问题。
    • 为什么函数里面有函数?
    • @joran:这对我来说毫无意义。你为什么不直接fmt&lt;-function(x){format(x,nsmall = 2,scientific = FALSE)} ; ggplot(df,aes(x = x,y=y)) + scale_y_log10(labels = fmt)? (注意在规模调用中缺少())。它做的事情完全一样,但是它直接将函数传递给ggplot,而不是传递一个传递函数的函数。
    • @naught101 对于这个特定的例子,你是对的,这并不重要。但这只是因为我们不需要传递任何参数。考虑date_format。如果我们按照您所描述的那样做,我们如何传递不同的日期格式?现在考虑一个更复杂的例子,比如math_format。所以我只是坚持使用传统格式,仅此而已。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多