2016-08-03 4 views
4

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

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

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

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

EDIT: Код для скучных, но воспроизводимых данных «образца» установить, что можно экспериментировать с ,

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") 
+1

Просьба представить небольшой воспроизводимый пример, облегчающий тестирование потенциальных решений. – Roland

+1

Добавил что-то скучное, но, надеюсь, достаточно образцовое, чтобы быть полезным. – Bajcz

+0

@Bajcz Вы нашли решение? –

ответ

1

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

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

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

даст следующий участок enter image description here

обеспечивает некоторую щель между участками с помощью position_dodge

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

Это даст вам следующие не перекрывающихся график enter image description here

+0

Отличный ответ, спасибо! Можете ли вы объяснить, если вы можете, почему 'width' - это вычисленная переменная, которую модель принимает в качестве аргумента, когда другие такие переменные, как' count' и 'violinwidth', игнорируются? Я думаю, именно поэтому я предполагал, что «ширина» не может быть правильной, чтобы манипулировать ... – Bajcz

Смежные вопросы