Как создать пользовательский масштаб по оси Y в базе R

#r #plot

#r #график

Вопрос:

Я пытаюсь выяснить, как создать график R с пользовательским масштабом по оси y. Для примера я хотел бы создать график с той же осью y, что и ниже. Вы можете, чтобы расстояние между отметками было одинаковым, даже если фактическое числовое расстояние не является.

введите описание изображения здесь

Чтобы добиться того же вида оси, я могу сделать следующее:

 set.seed(1)

n <- 10
x <- 1:n
y <- rnorm(n)

ticks <- c("1/30","1/10","1/3","1","3","10","30")


plot(x, y, axes = FALSE, ylim = c(-3,3))
axis(1)
axis(2, seq(-3,3,1), ticks)
  

что приводит к следующему:

введите описание изображения здесь

однако все данные на графике находятся в неправильных местах, поскольку они не соответствуют новому масштабу по оси y. Итак, я хочу получить любой масштаб, который я хочу, по оси y, а затем иметь возможность правильно отображать мои данные в соответствии с осью y.

Ответ №1:

Это немного странно. Ось y почти логарифмическая, но не совсем, поскольку отметки чередуются между 3 и 3,333 раза больше, чем показано ниже. Это не поддается прямому преобразованию. Тем не менее, мы можем сделать положения маркировки и построения точными за счет того, что метки расположены немного неравномерно, если мы будем регистрировать позиции оси y и сами значения y.

 set.seed(1)

n <- 10
x <- 1:n
y <- rnorm(n)

ticks <- c("1/30","1/10","1/3","1","3","10","30")

tick_nums <- c(1/30, 1/10, 1/3, 1, 3, 10, 30)

plot(x, log(y, 3), axes = FALSE, ylim = c(-3,3))
#> Warning in xy.coords(x, y, xlabel, ylabel, log): NaNs produced
axis(1)
axis(2, at = log(tick_nums, 3), ticks)
  

Мы можем показать, что эти точки находятся в правильном положении, выполнив:

 text(x = x, y = log(y * 1.3, 3), label = round(y, 3))
  

Обратите внимание, что ни одно из отрицательных значений не может быть нанесено на график в этом масштабе, поскольку «0» в логарифмическом масштабе, подобном этому, будет бесконечно далеко вниз, и поэтому отрицательные числа не определены.

Комментарии:

1. Для моих целей это работает. На самом деле у меня нет отрицательных чисел, и разница на расстоянии незначительна.