Обозначения осевых меток форматирования на грань в 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_* вы хотели использовать, и я уверен, что это не то, что вы хотели задумать, но, по крайней мере, это иллюстрирует принцип.

  • Создайте матрицу диаграмм рассеяния (пар () эквивалентных) в ggplot2
  • Как выбрать переменные в фрейме данных R, чьи имена содержат определенную строку?
  • Построить ручную легенду для сложного сюжета
  • Объединить много кадров данных из файлов csv, когда подразумевается столбец идентификатора?
  • R: подсчитывать последовательные вхождения значений в одном столбце
  • Как создать ряд наиболее отличительных цветов в R?
  • ggplot2: цвет полосы facet_wrap на основе переменной в наборе данных
  • Как удалить все пробелы из строки?
  • определять интервалы последовательных целых последовательностей
  • Заменить бары в geom_bar ggplot2
  • расплавить / переделать в excel с помощью VBA?
  • Давайте будем гением компьютера.