首页 > 解决方案 > 如何以 sqrt(x) 格式格式化 x 轴刻度标签?

问题描述

我正在研究ggplot2的coord_trans()的例子:

library(ggplot2)
library(scales)

set.seed(4747)    

df <- data.frame(a = abs(rnorm(26)),letters)
plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + coord_trans(x = "log10")
plot + coord_trans(x = "sqrt")

我修改了plot + coord_trans(x = "log10")以下代码并得到了我的预期:

plot + scale_x_log10(breaks=trans_breaks("log10", function(x) 10^x),
                     labels=trans_format("log10", math_format(10^.x)))

我将代码修改plot + coord_trans(x = "sqrt")如下,得到一个奇怪的 x 轴:

plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) sqrt(x)),
                   labels=trans_format("sqrt", math_format(.x^0.5)))

我该如何解决这个问题?

标签: rggplot2axis-labels

解决方案


我明白你为什么说这是一个奇怪/可怕的轴。even的文档trans_breaks在其第一行中警告您:

这些通常不会产生非常有吸引力的休息时间。

为了使它不那么吸引人,我会使用round(,2)这样我的轴标签只有 2 个小数点而不是默认的 8 或 9 - 使轴混乱。然后我会设置一个合理的范围,比如你的情况是 0 到 5 ( c(0,5))。

最后,您可以ntrans_breaks调用中指定轴的刻度数。

因此,将它们放在一起,您可以按照以下格式格式化 x 轴及其刻度标签scale_x_sqrt(x)

plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) round(sqrt(x),2), n=5)(c(0, 5)))

产生这个: 在此处输入图像描述

c(0,5)传递给pretty(),一个鲜为人知的 Base R 函数。从文档pretty中,执行以下操作:

计算大约 n+1 个等距“圆形”值的序列,这些值覆盖 x 中的值范围。

pretty(c(0,5))在我们的例子中简单地产生[1] 0 1 2 3 4 5

您甚至可以通过更改参数来微调您的轴。这里代码使用 3 个小数点 ( round(x,3)),我们要求 3 个刻度n=3

plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) round(sqrt(x),3), n=3)(c(0, 5)))

产生这个: 在此处输入图像描述

根据 OP 的附加评论进行编辑:要获得整数值,floor()round(x,0)工作,所以下面的代码:

plot <- ggplot(df,aes(a,letters)) + geom_point()
plot + scale_x_sqrt(breaks=trans_breaks("sqrt", function(x) round(sqrt(x),0), n=5)(c(0, 5)))

产生这个: 在此处输入图像描述


推荐阅读