Вопрос:

Преобразуйте только одну ось в log10 масштаб с помощью ggplot2

r ggplot2 boxplot scaletransform

87256 просмотра

4 ответа

23051 Репутация автора

У меня есть следующая проблема: я хотел бы представить дискретную и непрерывную переменную на блокпосте, в котором последний имеет несколько экстремально высоких значений. Это делает коробочный график бессмысленным (точки и даже «тело» диаграммы слишком малы), поэтому я хотел бы показать это в масштабе log10. Я осознаю, что могу исключить крайние значения из визуализации, но я не собираюсь этого делать.

Давайте посмотрим на простой пример с данными о бриллиантах:

m <- ggplot(diamonds, aes(y = price, x = color))

альтернативный текст

Проблема здесь несерьезная, но я надеюсь, что вы можете себе представить, почему я хотел бы видеть значения в масштабе log10. Давай попробуем:

m + geom_boxplot() + coord_trans(y = "log10")

альтернативный текст

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

Проблема не возникает с scale_log, но это не вариант для меня , так как я не могу использовать пользовательский форматер таким образом. Например:

m + geom_boxplot() + scale_y_log10() 

альтернативный текст

Мой вопрос: кто-нибудь знает решение для построения коробчатого графика с масштабом log10 по оси Y, метки которого можно свободно форматировать с помощью formatterфункции, как в этой теме ?


Редактирование вопроса, чтобы помочь ответчикам на основе ответов и комментариев:

То, что я действительно после: одна log10 трансформированная ось (у) с не научными метками. Я хотел бы обозначить его как доллар (formatter=dollar)или любой другой формат.

Если я попробую предложение @ hadley, я получу следующие предупреждения:

> m + geom_boxplot() + scale_y_log10(formatter=dollar)
Warning messages:
1: In max(x) : no non-missing arguments to max; returning -Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In max(x) : no non-missing arguments to max; returning -Inf

С неизменными метками оси Y:

альтернативный текст

Автор: daroczig Источник Размещён: 15.01.2011 12:07

Ответы (4)


25 плюса

220363 Репутация автора

Решение

Самое простое - просто дать аргументу «trans» (ранее «formatter») имя функции журнала:

m + geom_boxplot() + scale_y_continuous(trans='log10')

РЕДАКТИРОВАТЬ: Или, если вам это не нравится, то любой из них, кажется, дает тот же результат:

m <- ggplot(diamonds, aes(y = price, x = color), log="y")
m + geom_boxplot() 
m <- ggplot(diamonds, aes(y = price, x = color), log10="y")
m + geom_boxplot()

РЕДАКТИРОВАТЬ 2 и 3: Дальнейшие эксперименты (после отказа от того, который попытался успешно поставить знаки «$» перед зарегистрированными значениями):

fmtExpLg10 <- function(x) paste(round_any(10^x/1000, 0.01) , "K $", sep="")
ggplot(diamonds, aes(color, log10(price))) + 
  geom_boxplot() + 
  scale_y_continuous("Price, log10-scaling", trans = fmtExpLg10)

альтернативный текст

Примечание добавлено в середине 2017 года в комментарии об изменении синтаксиса пакета:

scale_y_continuous (formatter = 'log10') теперь является scale_y_continuous (trans = 'log10') (ggplot2 v2.2.1)

Автор: 42- Размещён: 15.01.2011 02:35

0 плюса

23051 Репутация автора

Я думаю, что наконец-то получил его, выполнив некоторые ручные преобразования с данными перед визуализацией:

d <- diamonds
# computing logarithm of prices
d$price <- log10(d$price)

И разработайте форматер для последующего вычисления «назад» логарифмических данных:

formatBack <- function(x) 10^x 
# or with special formatter (here: "dollar")
formatBack <- function(x) paste(round(10^x, 2), "$", sep=' ') 

И нарисуйте сюжет с заданным форматером:

m <- ggplot(d, aes(y = price, x = color))
m + geom_boxplot() + scale_y_continuous(formatter='formatBack')

альтернативный текст

Извините, что беспокою вас вопросом, который я мог бы решить раньше! Самое смешное: я усердно работал над тем, чтобы этот сюжет работал месяц назад, но мне это не удалось. Спросив здесь, я получил это.

В любом случае, спасибо @DWin за мотивацию!

Автор: daroczig Размещён: 15.01.2011 05:47

14 плюса

317 Репутация автора

У меня была похожая проблема, и этот масштаб работал для меня как шарм:

breaks = 10**(1:10)
scale_y_log10(breaks = breaks, labels = comma(breaks))

так как вам нужны промежуточные уровни (10 ^ 3.5), вам нужно настроить форматирование:

breaks = 10**(1:10 * 0.5)
m <- ggplot(diamonds, aes(y = price, x = color)) + geom_boxplot()
m + scale_y_log10(breaks = breaks, labels = comma(breaks, digits = 1))

После выполнения ::

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

Автор: Susanne Oberhauser Размещён: 09.02.2011 10:30

4 плюса

11843 Репутация автора

Другое решение, использующее scale_y_log10с trans_breaks, trans_formatиannotation_logticks()

library(ggplot2)

m <- ggplot(diamonds, aes(y = price, x = color))

m + geom_boxplot() +
  scale_y_log10(
    breaks = scales::trans_breaks("log10", function(x) 10^x),
    labels = scales::trans_format("log10", scales::math_format(10^.x))
  ) +
  theme_bw() +
  annotation_logticks(sides = 'lr') +
  theme(panel.grid.minor = element_blank())

Автор: Tung Размещён: 08.08.2018 04:42
Вопросы из категории :
32x32