2011-01-15 5 views
25

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

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

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

alt text

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

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

alt text

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

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

m + geom_boxplot() + scale_y_log10() 

alt text

Мой вопрос: кто-нибудь знает решение для построения boxplot с log10 шкалы на оси у которых метки могут быть свободно отформатированный с formatter функции, как в этом thread?


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

Что я действительно после того, как: один log10 трансформированной оси (у) с не научными этикетками. Я хотел бы обозначить его как доллар (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 

с неизмененными у меток осей:

alt text

+2

Т hat - ошибка в 'coord_trans' - но вы можете указать пользовательские метки для' scale_y_log10' ... – hadley

+0

Спасибо @hadley, я должен пропустить что-то, но, например.'+ scale_y_continous (formatter = dollar)' просто не работает. Я не могу видеть результат любого форматирования, и я также получаю три 'In max (x): отсутствие непустых аргументов до max; возвращая сообщения -Inf'. – daroczig

+0

@daroxzig: В примерах, которые я видел для аргумента форматирования, задействованы все цитированные имена, поэтому, возможно, 'formatter =" dollar "'? –

ответ

16

Проще всего просто дать форматер аргументу имени функции регистрации:

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

ED IT: Или, если вам не нравится, что то либо из них появляется, чтобы дать тот же результат:

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", formatter = fmtExpLg10) 

alt text

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

scale_y_continuous (форматировщик = 'log10') теперь scale_y_continuous ('log10' транс =) (ggplot2 v2.2.1)

+0

Спасибо @DWin, но это не тот, который я искал. Таким образом, метки y-оси будут преобразованы в log10, но ось не будет преобразована. То, что я хотел бы получить: одна трансформированная ось (y) с не научными метками. – daroczig

+0

@ daroczig: Посмотрите, является ли это более удовлетворительным. Я бы поклялся, что в первый раз, когда я запустил свое первое решение, у меня есть десять способностей, но я не могу воспроизвести. Может быть, я был настолько сосредоточен на том, чтобы видеть x-позиции, которые я упускал из виду очевидные проблемы. –

+0

Спасибо @DWin, я просто проверил ваши предложения, но, как я вижу, обе команды возвращают то же самое: первое изображение, которое я приложил к моему вопросу. То, что я хотел бы получить: последние сюжеты в моем вопросе (№ 3 и 4, как они то же самое) с настраиваемым форматированием меток. – daroczig

0

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

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

alt text

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

В любом случае, благодаря @DWin для мотивации!

12

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

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

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

enter image description here

+0

Я просто заметил, что эта [очень похожая проблема] (http://stackoverflow.com/questions/2906855/how-to-override-ggplot2s-axis-formatting) имеет то же решение. –

+2

Благодарим вас за то, что я обратил внимание на это альтернативное решение, которое было бы полным с указанием простого форматирования 'доллара' или путем написания пользовательского:' + scale_y_log10 (breaks = breaks, labels = dollar (breaks)) ' – daroczig