Как отформатировать метку оси X в формате sqrt (x)? - PullRequest
0 голосов
/ 08 мая 2018

Я изучаю примерordin_trans () из ggplot2:

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 голосов
/ 08 мая 2018

Я понимаю, почему вы сказали, что это странная / ужасная ось. Документация для trans_breaks даже предупреждает вас об этом в первой строке:

Они часто не дают очень привлекательных перерывов.

Чтобы сделать его менее привлекательным, я бы использовал round(,2), чтобы метки моей оси имели только 2 десятичных знака вместо стандартных 8 или 9 - загромождая ось. Тогда я бы установил разумный диапазон, скажем, в вашем случае от 0 до 5 (c(0,5)).

Наконец, вы можете указать количество тактов для вашей оси, используя n в вызове trans_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)))

Производит это: 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

РЕДАКТИРОВАТЬ на основе дополнительных комментариев ОП: Чтобы получить округленные целые значения, 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

...