ggplot2: отбрасывать неиспользованные факторы на диаграмме граненых полос, но не иметь разную ширину полос между фасетами
6643 просмотра
3 ответа
df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L,
5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L), .Label = c("1",
"2", "3", "4", "5", "6", "7"), class = "factor"), TYPE = structure(c(1L,
2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L,
1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L,
5L, 6L, 1L, 2L, 3L), .Label = c("1", "2", "3", "4", "5", "6",
"7", "8"), class = "factor"), TIME = structure(c(2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L,
1L, 1L, 1L), .Label = c("1", "5", "15"), class = "factor"), VAL = c(0.937377670081332,
0.522220720537007, 0.278690102742985, 0.967633064137772, 0.116124767344445,
0.0544306698720902, 0.470229141646996, 0.62017166428268, 0.195459847105667,
0.732876230962574, 0.996336271753535, 0.983087373664603, 0.666449476964772,
0.291554537601769, 0.167933790013194, 0.860138458199799, 0.172361251665279,
0.833266809117049, 0.620465772924945, 0.786503327777609, 0.761877260869369,
0.425386636285111, 0.612077651312575, 0.178726130630821, 0.528709076810628,
0.492527724476531, 0.472576208412647, 0.0702785139437765, 0.696220921119675,
0.230852259788662, 0.359884874196723, 0.518227979075164, 0.259466265095398,
0.149970305617899, 0.00682218233123422, 0.463400925742462, 0.924704828299582,
0.229068386601284)), .Names = c("ID", "TYPE", "TIME", "VAL"), row.names = c(NA,
-38L), class = "data.frame")
Если я создам следующий сюжет:
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack") +
coord_flip()
Затем я решаю, что в идеале я бы хотел исключить любые факторы, отображаемые в фасете, где у них нет данных. Я ссылался на различные вопросы и ответы, в которых говорится, что scale="free"
метод - это путь (в отличие от drop=TRUE
которого будут отбрасываться пустые фасеты, соответствующие неиспользуемым значениям в TIME
), поэтому далее:
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~TIME, ncol=1, scale="free") +
geom_bar(position="stack") +
coord_flip()
Мой вопрос заключается в том, как предотвратить изменение масштаба стержней, которое происходит для фасета, который имеет 4 стержня, по сравнению с фасетом с 3 столбцами. В этом надуманном примере эффект едва заметен, гораздо хуже с моими фактическими данными. Идеальный результат - иметь нижний фасет с коэффициентами ID 1,4 и 6 на вертикальной оси, а столбцы имеют ширину, равную ширине верхнего фасета, и поэтому общий вертикальный размер фасета будет уменьшен.
Бонусные баллы, если вы можете помочь мне с тем, почему счетчики суммируются вместо числовых значений (Исправлено сейчас)
Обновление награды:
Как уже упоминалось в моем Последующие вопрос , похоже , лучшее решение , может включать в себя использование ggplot_build
и ggplot_table
и модификации gtable объекта. Я почти уверен, что смогу со временем разобраться, но я надеюсь, что щедрость может побудить кого-то другого помочь мне. Кошке опубликовал несколько примеров этого .
Ответы (3)
15 плюса
Как насчет этого:
df$w <- 0.9
df$w[df$TIME == 5] <- 0.9 * 3/4
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~TIME, ncol=1, scale="free") +
geom_bar(position="stack",aes(width = w),stat = "identity") +
coord_flip()
Не уверен, что у меня тут есть арифметика, но вы поняли идею.
Автор: joran Размещён: 02.07.2012 10:4011 плюса
Если вы в порядке с вертикальными полосами, facet_grid работает отлично:
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_grid(.~TIME, scale="free_x", space = "free_x") +
geom_bar(position="stack")
Чтобы пойти немного дальше, вы можете повернуть все элементы графика. Теперь у вас есть то, что вы хотите, если повернуть голову на 90 ° :-)
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
facet_grid(.~TIME, scale="free_x", space = "free_x") +
geom_bar(position="stack") +
opts(legend.text = theme_text(angle=90),
legend.title = theme_text(angle=90),
strip.text.x = theme_text(angle=90),
axis.text.x = theme_text(angle=90),
axis.text.y = theme_text(angle=90),
axis.title.x = theme_text(angle=90)
)
5 плюса
Более пяти лет с момента первоначального вопроса, поэтому я подумал, что он должен предоставить более актуальную и более чистую версию этого. Это в целом следует совету, данному здесь: http://ggplot2.tidyverse.org/reference/facet_grid.html
Два ключевых аргумента - это то, space="free_y"
что позволяет высоте каждой панели быть пропорциональной длине шкалы и scales="free_y"
позволяет варьировать шкалы для каждого столбца.
coord_flip()
позволяет наносить столбцы горизонтально, и в качестве личного предпочтения метка к фасету поворачивается в theme
опциях.
ggplot(df, aes(x=ID, y=VAL, fill=TYPE)) +
geom_bar(stat="identity") +
coord_flip() +
facet_grid(TIME~., scales = "free_y", space = "free_y") +
theme(strip.text.y = element_text(angle = 0))
Автор: Michael Harper
Размещён: 29.10.2017 05:20
Вопросы из категории :
- r Как получить доступ к последнему значению в векторе?
- r Пакеты оптимизации для R
- r Есть ли у R такие операторские операции, как Perl qw ()?
- r Библиотека / инструмент для рисования тройных / треугольных графиков
- r Участки без заголовков / надписей в R
- r Расчет скользящей средней
- r Режим Emacs ESS - вкладка для области комментариев
- r Преобразование данных из многих строк во многие столбцы
- r Проверить, содержит ли вектор данный элемент
- r Поиск всех позиций для нескольких элементов в векторе
- ggplot2 Графики рядом с ggplot2
- ggplot2 Поворотные и интервальные метки на оси ggplot2
- ggplot2 используя stat_function и facet_wrap вместе в ggplot2 в R
- ggplot2 Boxplot schmoxplot: Как изобразить средние и стандартные ошибки, обусловленные коэффициентом R?
- ggplot2 Установите количество столбцов (или строк) в граненом графике
- ggplot2 Используя ggplot2, как я могу представить точку и линию в легенде
- ggplot2 Построить два графика на одном графике в R
- ggplot2 How to add texture to fill colors in ggplot2
- ggplot2 График с двумя осями y, одной осью y слева и другой осью y справа
- ggplot2 Изменить порядок дискретной шкалы х