首页 > 解决方案 > 将千位分隔符添加到剪切功能中的级别

问题描述

我的 x 轴标签看起来像 [100000,250000],这使得乍一看很难理解数字,我希望它看起来像 [100.000,250.000],我知道 cut2 函数有一个 formatfun 参数,但我想我没有'不知道如何正确使用它。

标签: rggplot2

解决方案


让我们创建一个示例来处理:

x <- cut(seq(0,1,length.out=8) + 1e6, 3)

这是一个因素。虽然在底部它是一个数字数组,但您不想格式化它的值;你想格式化它的级别,这是与它的值相关联的字符串。这是示例中级别的样子(调用head以防止大量打印,以防x有许多不同的级别):

(head(levels(x)))
[1] "(1000000,1000000.3]"   "(1000000.3,1000000.7]" "(1000000.7,1000001]"  

要格式化关卡,我们需要将它们分成它们的数字组件(用逗号“,”分隔),格式化每个组件,然后重新组合结果。

这是一次性的分拣和格式化步骤,仅使用基本R功能。它在第一行调用gsuband strsplit(用于清除“(”和“]”字符并将每对数字字符串分成两个字符串)并prettyNum在第二行调用(用于格式化),它可以方便地格式化任何字符串看起来像一个数字:

s <- lapply(strsplit(gsub("]|[(]", "", levels(x)), ","),  
            prettyNum, big.mark=".", decimal.mark=",", input.d.mark=".", preserve.width="individual")

(您可能不需要该input.d.mark参数,但我这样做是因为我的语言环境使用“。”作为小数点,如您在上面看到的。文档说“个人”是设置输出宽度的默认值,但事实并非如此我系统上的情况:我必须明确指定它。)

这些paste*函数将执行重组,我们只需将其结果重新分配给 的级别x

levels(x) <- paste0("(", sapply(s, function(a) paste0(a, collapse="; ")), "]")

(由于每个数字可能已经包含“,”和“。”分隔符,我指定了第三个标点符号“;”来分隔数字本身——但当然,你可以使用你想要的。)

让我们显示新级别以验证结果:

(head(levels(x)))
[1] "(1.000.000; 1.000.000,3]"   "(1.000.000,3; 1.000.000,7]" "(1.000.000,7; 1.000.001]" 

推荐阅读