Как для geom_violin указывается общая площадь всех скрипок?

При вызове geom_violin внутри ggplot2 вы можете указать, что площадь каждой скрипки должна быть пропорциональна количеству наблюдений, составляющих эту скрипку, указав scale="count".

Я предполагаю, что это работает внутренне, беря некоторую общую площадь (назовем эту сумму X) и пропорционально разделяя ее между всеми скрипками, которые нужно нанести на график. Это то, что я хочу, за исключением того, что это может привести к довольно узким скрипкам, если между группами существует достаточно существенное различие в N, так что некоторые группы имеют относительно низкое N. В моем случае это просто делает цвет заливки трудно увидеть.

Я думаю, что это можно в значительной степени решить, по крайней мере, в моем случае, просто немного расширив X, чтобы действительно маленькие скрипки получили достаточно места, чтобы их можно было прочитать. Другими словами, я хочу сохранить разницу в площади между скрипками в зависимости от количества наблюдений, но увеличить "пул" общей площади, разделенной между скрипками, чтобы каждая из них стала немного больше.

Кто-нибудь знает, как это можно сделать? Для этого должен быть переключатель. Я пытался возиться с аргументами geom_violin, такими как width, size, violinwidth и т. д., но пока безуспешно...

РЕДАКТИРОВАТЬ: код для скучного, но воспроизводимого набора данных «образец», с которым можно экспериментировать.

y = runif(100, 1, 10)
x = as.factor(rep(c(1,2), times=50))
z = as.factor(c(rep(1, 10), rep(2, 90)))
df=data.frame(x, y, z)
ggplot(df, aes(x=x, y=y, fill=z)) + geom_violin(scale="count")

person Bajcz    schedule 03.08.2016    source источник
comment
Пожалуйста, предоставьте небольшой воспроизводимый пример, чтобы облегчить тестирование потенциальных решений.   -  person Roland    schedule 03.08.2016
comment
Добавлено что-то скучное, но, надеюсь, достаточно образцовое, чтобы быть полезным.   -  person Bajcz    schedule 03.08.2016
comment
@Bajcz Вы уже нашли какое-нибудь решение?   -  person Marek Židek    schedule 11.07.2017
comment
@MarkSeygan Нет, не пробовал, но, может быть, на этой неделе я попытаюсь поковыряться в коде geom_violin и посмотреть, что смогу выяснить.   -  person Bajcz    schedule 12.07.2017
comment
Я обнаружил, что могу сделать это через width в скобках geom_violin.   -  person Marek Židek    schedule 12.07.2017
comment
Можете ли вы расширить это? width отмечен в справке как вычисляемая переменная; другие в этом списке, такие как count и violinwidth, игнорируются, когда я включаю их в вызов geom_violin. Итак, я не уверен, почему width не игнорируется, поскольку это не аргумент функции. Кроме того, мне непонятно, что делает width... для меня значения выше ~ 1,5 меняют не только форму моих скрипок, но и их положение и ориентацию на графике. Есть идеи, что там происходит?   -  person Bajcz    schedule 13.07.2017


Ответы (1)


Вы можете сделать это, настроив параметр width внутри geom_violin. Но не забудьте также использовать position_dodge, чтобы избежать перекрытия графиков.

Использование ваших данных

ggplot(df, aes(x=x, y=y, fill=z)) + geom_violin(scale="count", width=2)

даст следующий сюжет введите здесь описание изображения

позволяя некоторый разрыв между графиками с помощью position_dodge

ggplot(df, aes(x=x, y=y, fill=z)) + geom_violin(scale="count", width=2, position=position_dodge(width=0.5))

Это даст вам следующий непересекающийся график введите здесь описание изображения

person MaMu    schedule 05.09.2017
comment
Отличный ответ, спасибо! Можете ли вы объяснить, если можете, почему width является вычисляемой переменной, которую модель принимает в качестве аргумента, когда другие такие переменные, такие как count и violinwidth, игнорируются? Я думаю, именно поэтому я предположил, что width не может быть правильным манипулированием... - person Bajcz; 06.09.2017