是否可以选择将“,”设置为ggplot中轴标签的默认小数点?

Is there an option to set "," as default decimal point for axis labels in ggplot?

制作图表时,ggplot2 有很多合理的比例默认值,当尝试使用 scales 获得相同结果时需要额外的工作。

一个例子:

library("ggplot2")
ggplot(mtcars, aes(drat, mpg)) + geom_point()

请注意,此图在小数点后有一位数字。

但是,我住在荷兰,我们习惯使用逗号作为小数点。这很容易在 scale_x_continuous:

内完成
ggplot(mtcars, aes(drat, mpg)) + 
  geom_point() + 
  scale_x_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ","))

这个解决方案让我感到困扰的是,这也会增加数字的数量:每个标签的末尾都有一个额外的、相当不必要的 0。当然,这也可以在 scales::label_number() 内通过设置 accuracy = 0.1 来解决,但这需要迭代(绘制和重新绘制以设置更合理的位数)。

是否有修复 ggplot 使用的默认小数点的选项?我正在寻找

的解决方案
ggplot(mtcars, aes(drat, mpg)) + 
  geom_point()

returns与

相同的情节
ggplot(mtcars, aes(drat, mpg)) + 
  geom_point() + 
  scale_x_continuous(labels = scales::label_number(
    big.mark = ".", 
    decimal.mark = ",",
    accuracy = 0.1
  ))

关键似乎是 format(来自 base R)和 scales::number 使用不同的规则。我们可以恢复使用 format ...

myf <- function(x, ...) format(x, big.mark = ".", decimal.mark = ",", ...)
ggplot(mtcars, aes(drat, mpg)) +
  geom_point() +
  scale_x_continuous(labels = myf)

如果你想让这些标签成为全局默认标签,我想你可以这样做:

scale_x_continuous <- function(..., labels = myf) {
  do.call(ggplot2::scale_x_continuous, c(list(...), labels = labels))
}

不特定于 ggplot2 但您可以使用 options(OutDec = ",").

全局设置输出小数点字符

来自帮助页面:

OutDec: character string containing a single character. The preferred character to be used as the decimal point in output conversions, that is in printing, plotting, format and as.character but not when deparsing nor by sprintf nor formatC (which are sometimes used prior to printing.)

library(ggplot2)

options(OutDec= ",")

ggplot(mtcars, aes(drat, mpg)) + 
  geom_point()

一个更通用的解决方案是编写一个 {scales} 兼容的标签函数 label_format(),在后台调用 base::format(),然后制作一个具有荷兰标点符号约定的专用版本。

library(ggplot2)
library(scales)

ggplot(mtcars, aes(drat, mpg)) + 
  geom_point()

# Use base::format as a {scales}-compatible labels function
label_format <- function(...) {
  function(x) do.call(format, c(list(x = x), list(...)))
}

# Specialized version for Dutch punctuation
label_format_NL <- function(...) {
  label_format(big.mark = ".", decimal.mark = ",", ...)
}

ggplot(mtcars, aes(drat, mpg)) + 
  geom_point() + 
  scale_x_continuous(labels = label_format_NL())

如果您不喜欢为每个轴指定标签,您可以像这样覆盖 ggplot2::continuous_scale,例如

continuous_scale <- function(...) {
  do.call(
    ggplot2::continuous_scale, 
    c(list(labels = label_format_NL()), list(...))
  )
}

ggplot(mtcars, aes(drat, mpg)) + 
  geom_point()

就我个人而言,我会使用明确的 scale_AESTHETIC_continous(labels = label_format_NL()),因为这样可以使您的更改本地化。覆盖 options()continuous_scale() 在道德上等同于全局变量,不推荐。