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

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

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

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

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

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

Спасибо!

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

Мой опыт в том, что люди, приходящие на 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) 

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

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

  • dplyr :: group_by_ с символьной строкой ввода нескольких имен переменных
  • Получение предупреждения: «« newdata »имеет 1 строку, но найденные переменные содержат 32 строки» в файле outlookа.lm
  • Как получить максимальное значение по группе
  • Почему использование обновления на lm внутри сгруппированных data.table потеряет данные модели?
  • Ошибка загрузки rJava в RStudio / R после «обновления» до OSX Yosemite
  • Как read.table () несколько файлов в одну таблицу в R?
  • ggplot2 3D Bar Plot
  • Субфигуры или субтитры с ножом?
  • Настроить тики x-axis
  • Выберите только первые строки для каждого уникального значения столбца в R
  • Как вы определяете пространство имен функции?
  • Давайте будем гением компьютера.