如何格式化sqrt(x)格式的x轴刻度标签?

时间:2018-05-08 08:26:19

标签: r ggplot2 axis-labels

我正在研究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)))

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

  

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

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

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

所以把它放在一起,这里是你如何用scale_x_sqrt(x)格式格式化你的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)))

产生这个: enter image description here

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)))

产生这个: enter image description here

编辑基于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)))

产生这个: enter image description here