ggplot рисует несколько графиков по уровням переменной - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть образец набора данных

d=data.frame(n=rep(c(1,1,1,1,1,1,2,2,2,3),2),group=rep(c("A","B"),each=20),stringsAsFactors = F)

И я хочу нарисовать две отдельные гистограммы на основе групповой переменной.

Я попробовал этот метод, предложенный @jenesaisquoi в отдельном посте здесь. Генерация нескольких графиков в ggplot по фактору

ggplot(data=d)+geom_histogram(aes(x=n,y=..count../sum(..count..)),binwidth = 1)+facet_wrap(~group)

Histogram output

Он добился цели, но если вы внимательно посмотрите, пропорции неправильные. Он не рассчитывал пропорцию для каждой группы, а скорее большую пропорцию. Я хочу, чтобы эта пропорция составляла 0,6 для числа 1 для каждой группы, а не 0,3.

Затем я попробовал пакет dplyr, и он даже не создал два графика. Он игнорировал команду group_by. За исключением того, что пропорция верна на этот раз

d%>%group_by(group)%>%ggplot(data=.)+geom_histogram(aes(x=n,y=..count../sum(..count..)),binwidth = 1)

dplyr output

Наконец я попробовал факторинг с color

ggplot(data=d)+geom_histogram(aes(x=n,y=..count../sum(..count..),color=group),binwidth = 1)

Но результат далек от идеального. Я собирался принять один вывод, но с лотками рядом, а не друг над другом.

color=group output

В заключение я хочу нарисовать две отдельные гистограммы с правильными пропорциями, рассчитанными в каждой группе. Если нет простого способа сделать это, я могу жить с одним графиком, но рядом с ячейками и с правильными пропорциями для каждой группы. В этом примере число 1 должно иметь 0,6 в качестве своей доли.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Вы на самом деле имеете правильное разделение диаграмм на переменные Особенно с ggplot вам иногда нужно рассматривать масштабы графика отдельно от фигуры. Facet_wrap применяет новый слой к вашим данным независимо от масштаба. Он будет вести себя одинаково, независимо от того, какие у вас оси. Вы также можете попробовать добавить scale_y_log10() в качестве слоя, и вы заметите, что общая форма и стиль вашего графика одинаковы, вы просто изменили оси.

Что вам действительно нужно, так это исправление ваших весов. Понятно - частотные графики могут сбивать с толку. ..count../sum(..count..)) рассматривает каждый контейнер как независимую единицу независимо от его значения. См. Хорошее объяснение этого здесь: Показывать% вместо количества в диаграммах категориальных переменных

То, что вы хотите, это ..density.., который в основном представляет собой число, деленное на общее количество Разница в принципе невелика, но важный момент в том, что значение на оси х имеет значение. Экстремальный случай этого см. Здесь: Нормализация оси Y на гистограммах в графике R ggplot к пропорции , где крошечные значения оси X дают огромные плотности.

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

ggplot(data=d)+geom_histogram(aes(x=n,y=..density..,)binwidth = 1)+facet_wrap(~group)

Если вы все еще не уверены в плотности, значит, много людей. Хэдли Уикхем написал об этом длинную статью, которую вы можете найти здесь: http://vita.had.co.nz/papers/density-estimation.pdf

0 голосов
/ 26 апреля 2018

Изменив ..count ../ sum (.. count ..) на ..density .., вы получите желаемую пропорцию

ggplot (data = d) + geom_histogram (aes (x = n, y = .. плотность ..), ширина полосы = 1) + facet_wrap (~ группа)

...