Преобразовать только одну ось в масштаб Log10 с GGPLOT2
-
11-10-2019 - |
Вопрос
У меня есть следующая проблема: я хотел бы визуализировать дискретную и непрерывную переменную на коробке, на котором последний имеет несколько крайних высоких значений. Это делает ящик бессмысленным (точки и даже «тело» диаграммы слишком маленькие), поэтому я хотел бы показать это в масштабе Log10. Я знаю, что я мог бы исключить экстремальные значения из визуализации, но я не намерен.
Давайте посмотрим простой пример с данными Diamonds:
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 (y) с не научными этикетками. Я хотел бы назвать это как доллар (formatter=dollar)
или любой пользовательский формат.
Если я попробую предложение @Хэдли, я получу следующие предупреждения:
> 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:
Решение
Самое простое - просто дать «транс» (ранее «форматер» аргумент имени функции журнала:
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()
EDIT2 & 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_continoury (formatter = 'log10') теперь scale_y_continoury (trans = 'log10') (ggplot2 v2.2.1)
Другие советы
У меня была похожая проблема, и эта шкала сработала для меня, как очарование:
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))
После выполнения ::
Другое решение с использованием 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())
Я думаю, что получил это наконец, выполнив некоторые ручные преобразования с данными перед визуализацией:
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 за мотивацию!