Подтвердить что ты не робот

Обозначения осевых меток форматирования на грань в ggplot/R

У меня есть dataframe, фиксирующий несколько мер со временем, которые я хотел бы визуализировать фасет 3x1. Тем не менее, каждая мера содержит различные единицы/шкалы, которые выиграют от пользовательских преобразований и схем маркировки.

Итак, мой вопрос: Если единицы и шкалы различны для разных сторон, как я могу указать пользовательский форматтер или преобразование (т.е. log10) на определенную ось внутри грани?

Например, скажем, у меня есть данные:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100))
melted.df = melt(df, measure.var=c("dollars", "counts"))

Как можно было бы настроить факс 2x1, показывающий доллары и рассчитывать по индексу с labels=dollars и scale_y_continuous(trans = "log10", ...) для данных df$dollars?

Спасибо!

4b9b3361

Ответ 1

Как вы обнаружили, это нелегкое решение, но оно очень много. Поскольку такого рода вопросы задают так часто, я считаю полезным объяснить, почему это сложно, и предложить потенциальное решение.

Мой опыт заключается в том, что люди, приходящие на ggplot2 или решетку, принципиально неправильно понимают цель огранки (или решетки, в решетке). Эта особенность была разработана с учетом очень конкретной идеи: визуализация данных по нескольким группам, которые имеют общий масштаб. Это происходит от чего-то, называемого принципом малых кратных, поддерживаемых Туфтом и другими.

Размещение панелей рядом друг с другом с очень разными масштабами - это то, что специалисты по визуальному дизайну будут стараться избегать, потому что это может быть в лучшем случае ошибочным. (Я не ругаю вас здесь, просто объясняя обоснование...)

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

Одним из следствий этого является то, что некоторые вещи трудно реализовать просто из-за первоначального намерения проекта. Вероятно, это один из таких экземпляров.

Хорошо, достаточно объяснений. Здесь мое решение.

Хитрость здесь заключается в том, что вы не рисуете графики, которые имеют масштаб. Для меня это означает, что вы даже не должны думать об использовании огранки вообще. Вместо этого сделайте каждый график отдельно и расположите их вместе на одном графике:

library(gridExtra)

p1 <- ggplot(subset(melted.df,variable == 'dollars'),
                aes(x = value)) + 
            facet_wrap(~variable) + 
            geom_density() + 
            scale_x_log10(labels = dollar_format())

p2 <- ggplot(subset(melted.df,variable == 'counts'),
                aes(x = value)) + 
            facet_wrap(~variable) + 
            geom_density()

grid.arrange(p1,p2)

enter image description here

Я только догадываюсь, что вам нужно использовать geom_*, и я уверен, что это не то, что вы хотели бы построить, но, по крайней мере, это иллюстрирует принцип.