ggpot2: пространственная ось неравномерно тикает между равноудаленными значениями - PullRequest
2 голосов
/ 27 мая 2020

Я безрезультатно искал SO и другие онлайн-источники.

Есть ли способ масштабировать ось так, чтобы z-значения лучше отражали фактическую разницу от 0 до 1 и от 1 до 2 ( или любой другой равноотстоящий счет)?

Если у меня есть ось X с z-оценками в диапазоне от -3 до 3 и отметки оси на каждом целом числе между ними, есть ли способ иметь те отметки оси, которые ближе к 0 быть меньше, чем те, что дальше?

Пример:

-3        -2     -1  0  1      2          3
|----------|------|--|--|------|----------|

Мне не хватает какого-то метода масштабирования оси, который принимает как разрывы в качестве значений, так и положение разрывов относительно всей шкалы?

РЕДАКТИРОВАТЬ:

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

df <-
  data.frame(
    metric = c('metric1', 'metric2', 'metric3'),
    z_score = c(2, -1.5, 2.8)
  )

df %>%
  ggplot(aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  ylim(-4,4)

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

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

То, что вы описываете, похоже, соответствует преобразованию модуля, но я не знаю, как выбрать правильные параметры, чтобы получить точное преобразование, которое вы хотите.

Вот пример:

library(ggplot2)
library(scales)

df <- data.frame(
    metric = c('metric1', 'metric2', 'metric3'),
    z_score = c(2, -1.5, 2.8)
  )

ggplot(df, aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(trans = modulus_trans(2),
                     limits = c(-4, 4),
                     breaks = c(-3:3))

Создано 28.05.2020 с помощью пакета REPEX (v0.3.0)

2 голосов
/ 28 мая 2020

Уловка заключается в использовании нового объекта формации trans. Некоторые из них уже определены в scales::, и ближайший, который я нашел (хотя он в некотором смысле противоположен):

ggplot(df, aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(trans=scales::pseudo_log_trans(0.2, 2),
                     limits = c(-3, 3), breaks = -3:3)

pseudo log transform

Но у этого есть противоположное расширение, я думаю, вы хотите. Поскольку один из способов увидеть противоположность pseudo_log - это pseudo_exp, а я его не нашел, вот попытка:

pseudo_exp_trans <- function(pow = 2) {
  scales::trans_new(
    "pseudo_exp",
    function(x) sign(x) * abs(x^pow),
    function(x) sign(x) * abs(x)^(1/pow))
}

ggplot(df, aes(x = metric, y = z_score)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(trans=pseudo_exp_trans(),
                     limits = c(-3, 3), breaks = -3:3)

pseudo exp transform

Просто поиграйте с аргументом pow=, чтобы найти желаемую скорость роста на оси.

...