Я использую 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, потому что, как указал @Andew Gustar, в логарифмическом масштабе нет y=0. Можете ли вы привести пример с другими данными?
@ZéLoff Да, можем, как показано в ответе Георгия Саввы. Мне просто нужна горизонтальная линия на уровне 0. См. принятый ответ.
@AndrewGustar Нет, abline отображается не в -Inf, а в 1. Это значение по умолчанию (см. принятый ответ или мой график).
@ZéLoffr, ты также мог бы сделать это с помощью scale_y_continuous(trans= "log10", oob = scales::squish)
, а затем установить перехват на log(0)
.
@LulY В ответе Джорджа Саввы не отображается линия в точке log(0)
, а в точке asinh(0)
. Если вас устраивает разница между строками на последнем графике его ответа, обязательно сделайте это. Только не называйте это преобразованием журнала.
@ZéLoff Я четко заявил, что мне не нужно преобразование аргумента intercept= 0
, а горизонтальная линия фактически изображается в 0. Кроме того, в то же время я хочу логарифмическое преобразование оси, как это было достигнуто в ответе Джорджа Саввы.
Как отмечено в комментариях, 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
.
Интересный. Работает так, как ожидалось. К сожалению, я понятия не имею, что происходит под капотом. Но спасибо!
Глядя на код, преобразование выглядит следующим образом: asinh(x/(2 * sigma))/log(base)
с sigma
по умолчанию равным 1 и base
=e. Так что в данном случае asinh(x/2)
Я внес некоторые изменения, чтобы объяснить, что он делает.
y=0 отображается на уровне -бесконечности на логарифмически преобразованной оси, поэтому я не уверен, чего вы ожидаете!