Маркировка логарифмической шкалы дисплея в R - PullRequest
13 голосов
/ 01 августа 2011

При построении гистограммы, диаграмм рассеяния и других графиков с осями, масштабированными до логарифмической шкалы в R, как можно использовать метки, такие как 10 ^ -1 10 ^ 0 10 ^ 1 10 ^ 2 10 ^ 3 и т. Д. Вместона осях отображаются только -1, 0, 1, 2, 3 и т. д. Какие параметры следует добавить в такие команды, как hist (), plot () и т. д.?

Ответы [ 3 ]

17 голосов
/ 01 августа 2011

Помимо решения ggplot2 (см. Комментарий gsk3), я хотел бы добавить, что это происходит автоматически в plot (), а также при использовании правильных аргументов, например:

x <- 1:10
y <- exp(1:10)
plot(x,y,log="y")

Вы можете использовать параметр log="x" для оси X или log="xy" для обоих.

Если вы хотите отформатировать числа или у вас есть данные в формате журнала, вы можете обойти эту проблему, используя axis (). Несколько интересных функций:

  • axTicks(x) дает вам расположение отметок на оси X (x = 1) или оси Y (x = 2)
  • bquote() преобразует выражения в язык, но может заменить переменную ее значением. Подробнее о bquote() в вопросе Латекс и переменные в метке графика в R? .
  • as.expression() делает объект языка из bquote() выражением. Это позволяет axis() выполнять форматирование, как описано в ?plotmath. Это не может быть сделано с языковыми объектами.

Пример хорошего форматирования:

x <- y <- 1:10
plot(x,y,yaxt="n")
aty <- axTicks(2)
labels <- sapply(aty,function(i)
            as.expression(bquote(10^ .(i)))
          )
axis(2,at=aty,labels=labels)

Что дает

enter image description here

12 голосов
/ 05 февраля 2016

Вот другой способ нарисовать ось этого типа:

plot(NA, xlim=c(0,10), ylim=c(1, 10^4), xlab="x", ylab="y", log="y", yaxt="n")
at.y <- outer(1:9, 10^(0:4))
lab.y <- ifelse(log10(at.y) %% 1 == 0, at.y, NA)
axis(2, at=at.y, labels=lab.y, las=1)

enter image description here

РЕДАКТИРОВАТЬ: Это также решается в latticeExtra с scale.components

1 голос
/ 15 мая 2015

В ggplot2 вы можете просто добавить

... + 
scale_x_log10() + 
scale_y_log10(limits = c(1e-4,1), breaks=c(1e-4,1e-3,1e-2,0.1,1)) + ...

, чтобы масштабировать вашу ось, пометьте их и добавьте собственные разрывы.

...