Geom_abline при наличии Scale_y_continous(trans="log10")

Я использую geom_abline с разными точками пересечения и наклонами, и это работает, как и ожидалось. Но добавление логарифмического масштаба к оси с помощью scale_y_continuous(trans= "log10") меняет не только саму ось, но и то, где на оси находится линия geom_abline. Глянь сюда:

df <- data.frame(x= -5:5, y= -5:5)

ggplot(data= df, mapping= aes(x= x, y= y)) +
  geom_point() +
  geom_abline(intercept= 0, slope= 0) +
  scale_y_continuous(trans= "log10")

Горизонтальная линия находится в точке y= 1, но я хочу, чтобы она находилась в точке y= 0 (как определено с помощью intercept= 0). Как это сделать?


Редактировать

График выше отсекает ось Y, так что мы не видим точку в левом нижнем углу. Поэтому я хотел изменить пределы оси с помощью scale_y_continuous(trans= "log10", limits = c(-5, 5)), но это тоже не работает, я получаю ошибку «от» должно быть конечным числом. Таким образом, использование trans= "log10", кажется, применимо ко всему, даже к аргументам в самом scale_y_continuous. Как предотвратить применение trans= "log10" ко всему (geom_abline, лимиты,...)?

y=0 отображается на уровне -бесконечности на логарифмически преобразованной оси, поэтому я не уверен, чего вы ожидаете!

Andrew Gustar 30.04.2024 12:07

У вас не может быть линии с y=0, потому что, как указал @Andew Gustar, в логарифмическом масштабе нет y=0. Можете ли вы привести пример с другими данными?

Zé Loff 30.04.2024 13:56

@ZéLoff Да, можем, как показано в ответе Георгия Саввы. Мне просто нужна горизонтальная линия на уровне 0. См. принятый ответ.

LulY 30.04.2024 14:05

@AndrewGustar Нет, abline отображается не в -Inf, а в 1. Это значение по умолчанию (см. принятый ответ или мой график).

LulY 30.04.2024 14:07

@ZéLoffr, ты также мог бы сделать это с помощью scale_y_continuous(trans= "log10", oob = scales::squish), а затем установить перехват на log(0).

George Savva 30.04.2024 14:09

@LulY В ответе Джорджа Саввы не отображается линия в точке log(0), а в точке asinh(0). Если вас устраивает разница между строками на последнем графике его ответа, обязательно сделайте это. Только не называйте это преобразованием журнала.

Zé Loff 30.04.2024 14:20

@ZéLoff Я четко заявил, что мне не нужно преобразование аргумента intercept= 0, а горизонтальная линия фактически изображается в 0. Кроме того, в то же время я хочу логарифмическое преобразование оси, как это было достигнуто в ответе Джорджа Саввы.

LulY 30.04.2024 14:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отмечено в комментариях, 0 не отображается на оси Y с логарифмическим преобразованием. Вы можете использовать псевдологарифм, который эффективно переключается на линейную шкалу, близкую к нулю, с помощью asinh.

df <- data.frame(x= -5:5, y= -5:5)

ggplot(data= df, mapping= aes(x= x, y= y)) +
  geom_point() +
  geom_abline(intercept= 0, slope= 0) +
  scale_y_continuous(trans= scales::pseudo_log_trans(), limits=c(0,5))

Или без ограничений:

ggplot(data= df, mapping= aes(x= x, y= y)) +
  geom_point() +
  geom_abline(intercept= 0, slope= 0) +
  scale_y_continuous(trans= scales::pseudo_log_trans(), breaks=-5:5)

pseudo_log_trans использует преобразование asinh(x/2), если вы сохраняете значения по умолчанию. Если мы построим график этой функции и запишем ее (красный), мы увидим, в чем разница:

plot(\(x) asinh(x/2), xlim=c(-10,10), ylab = "transformed x")
plot(\(x) log(x), add=TRUE, xlim=c(-10,10), col = "red")

Это имеет смысл, учитывая определение, поскольку обратная гиперболическая функция asinh определяется следующим образом:

asinh(x) = log(x + sqrt(x^2 + 1))

Что будет очень близко к log(2x) для большого x, а для маленького x будет очень близко к самому x.

Интересный. Работает так, как ожидалось. К сожалению, я понятия не имею, что происходит под капотом. Но спасибо!

LulY 30.04.2024 12:57

Глядя на код, преобразование выглядит следующим образом: asinh(x/(2 * sigma))/log(base) с sigma по умолчанию равным 1 и base =e. Так что в данном случае asinh(x/2)

George Savva 30.04.2024 13:03

Я внес некоторые изменения, чтобы объяснить, что он делает.

George Savva 30.04.2024 13:48

Другие вопросы по теме