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

  • Извлечь p-значение из aov
  • Разреженная matrix к кадру данных в R
  • inst и extdata в R Packaging
  • Найти индексы дублированных строк
  • dplyr: выберите имена столбцов, содержащие пробел
  • Как объединить факторы, не превращая их в целые уровни?
  • data.table join, затем добавьте столбцы в существующий файл data.frame без повторной копии
  • Изменить несколько значений сразу
  • Укажите пользовательский формат даты для аргумента colClasses в read.table / read.csv
  • Чтение файла Excel непосредственно из сценария R
  • Преобразование вектора даты в юлианский день в R
  • Давайте будем гением компьютера.