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

я есть следующая проблема: я хотел бы представить дискретную и непрерывную переменную на блокпосте, в котором последний имеет несколько экстремально высоких значений. Это делает коробочный график бессмысленным (точки и даже «тело» диаграммы слишком малы), поэтому я хотел бы показать это в масштабе 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:

 daroczig15 янв. 2011 г., 18:00
@DWin: я тоже пробовал с кавычками, но результат точно такой же.
 daroczig15 янв. 2011 г., 17:33
Спасибо @hadley, я должен что-то пропустить, но, например.+ scale_y_continous(formatter=dollar) просто не работает. Я не могу видеть результат какого-либо заданного форматера, и я также получаю триIn max(x) : no non-missing arguments to max; returning -Inf Предупреждающие сообщения.
 42-15 янв. 2011 г., 17:56
@daroxzig: примеры, которые я видел для аргумента форматера, включали в себя все кавычки, так что, возможно,formatter="dollar"?
 hadley15 янв. 2011 г., 15:34
Это ошибка вcoord_trans - но вы можете указать собственные метки дляscale_y_log10...
 hadley15 янв. 2011 г., 18:42
Formatter не работает (пока), но вы все равно можете установить метки вручную ...

Ответы на вопрос(4)

Решение Вопроса

m + geom_boxplot() + scale_y_continuous(formatter='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", formatter = fmtExpLg10)

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

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

 pat-s12 июн. 2017 г., 12:08
scale_y_continuous(formatter = 'log10') сейчасscale_y_continuous(trans = 'log10') (ggplot2 v2.2.1)
 hadley15 янв. 2011 г., 18:44
Я подозреваю, что вы пытаетесь сделать что-то вродеggplot(diamonds, aes(color, log10(price))) + geom_boxplot() + scale_y_continuous(formatter = function(x) format(10 ^ x)) - вам нужно преобразовать данные и обратно преобразовать метки.
 daroczig15 янв. 2011 г., 17:37
Спасибо @DWin, но это не то, что я искал. Таким образом, метки оси y будут преобразованы в log10, но ось не будет преобразована. Что я хотел бы получить: одна трансформированная ось (y) с не научными метками.
 42-15 янв. 2011 г., 18:38
@daroczig: использовался «успешный эксперимент» с «долларизацией»fmtLg10dlr <- function(x) dollar(log10(x)); m + geom_boxplot() + scale_y_continuous(formatter='fmtLg10dlr') , но это просто выглядит "неправильно" для меня.
 42-15 янв. 2011 г., 17:52
@daroczig: посмотри, будет ли это более удовлетворительным. Я бы поклялся, что в первый раз, когда я запустил свое первое решение, у меня было даже десять степеней, но я не могу воспроизвести. Может быть, я был так сосредоточен на том, чтобы увидеть x-позиции, что я упустил очевидные проблемы

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

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 за мотивацию!

и этот масштаб работал для меня как шарм:

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))

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

 daroczig09 февр. 2011 г., 13:56
спасибо за то, что обратили мое внимание на это альтернативное решение, которое было бы завершено с указанием простогоdollar форматтер или написав пользовательский:+ scale_y_log10(breaks = breaks, labels = dollar(breaks))
 Susanne Oberhauser09 февр. 2011 г., 11:47
Я только что заметил этоочень похожая проблема имеет такое же решение.

Другое решение с использованием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())

 Crparedes22 окт. 2018 г., 04:54
Очень элегантный выход

Ваш ответ на вопрос