【问题标题】:How do I change the y-axis into a dollar format and avoid scientific notation?如何将 y 轴更改为美元格式并避免使用科学记数法?
【发布时间】:2020-05-20 16:56:51
【问题描述】:

我正在尝试学习如何将美元格式分配给 Y 轴并避免使用科学记数法。我有options(scipen = 999)

  ggplot(diamonds, aes(y = cut_width(price, 2000, boundary = 0), x = carat)) +
    geom_boxplot(varwidth = TRUE) +
    scale_y_continuous(dollar_format()) +
    xlab("Carat") +
    ylab("Price")

以上返回:Error: Discrete value supplied to continuous scale。我尝试通过删除cut_width 来修改代码并简化情节但无济于事。我错过了什么?谢谢!

【问题讨论】:

  • 这些标签由cut(从cut_width调用)生成,因此您需要将格式化级别名称的向量传递给labels,或者在之后对它们进行一些字符串处理事实
  • 别乱用scipen 那几乎是专门用于在控制台中处理数字的。

标签: r ggplot2 dplyr tidyverse


【解决方案1】:

这不起作用的原因是cut_width 返回一个因子而不是一个数字。因此scales::dollar_format 不能工作,因为它不是一个数字。此外,您不能使用_scale_continuous 作为因子。

这是一种使用dig.lab = 然后使用stringr 中的str_replace_all 重新格式化y 轴标签的方法。

我们需要dig.lab = 来阻止科学记数法。见help(cut_width)

如您所知,我们可以要求ggplot 使用函数转换 y 轴标签,因此我们将利用这一点并定义一个匿名函数来在字符串中进行一些替换。使用stringr::str_replace_all,我们可以提供pattern = replacement 对的命名向量。因此,我们将([ 替换为$,将, 替换为- $,将] 替换为空。我们需要使用\\ 转义特殊的正则表达式字符。

library(ggplot2)
library(stringr)
ggplot(diamonds, aes(y = as.factor(cut_width(price, 2000, boundary = 0, dig.lab=10)), x = carat)) +
    geom_boxplot(varwidth = TRUE) +
    scale_y_discrete(labels = function(x) str_replace_all(x, regex(c("[\\(\\[]" = "$", "," = " - $", "\\]" = "")))) +
    xlab("Carat") +
    ylab("Price")

【讨论】:

  • 我不确定它与 ggplot 的集成程度如何,但 formattable 包是一种快速简便的方法,可以让数值看起来像 "$34,000,32" 。肯定能打败怪物regex :-)
  • 感谢您的提醒。我想以前有另一个包解决了这个问题。在使用 10 个新软件包回答问题或仅坚持使用 OP 已经使用的软件包之间,这是一个艰难的平衡。
  • 不幸的是,我不认为scales::label_dollarcut_width 的输出起作用。
  • 即使不把输出变成因子?
  • 查看它期望输入是数字的源。
【解决方案2】:

我想你想抢包scales。那里的概述说它旨在为ggplot 中的标签创建有用的字符串。引用label_dollar的帮助部分

标签函数旨在与标签参数一起使用 ggplot2 比例尺。这些示例演示了它们与 x 刻度的使用, 但它们在所有尺度上的工作方式都相似,包括那些产生 图例而不是轴。

【讨论】:

    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多