我正在研究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)))
我该如何解决这个问题?
答案 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)))
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)))