Ggplot2 geom_violin с 0 дисперсией

Мне очень нравились скрипичные сюжеты, так как они дают мне гораздо лучшее представление о том, что ящики занимают место, когда у вас есть забавные раздачи. Мне нравится автоматизировать много вещей и, таким образом, столкнулся с проблемой: Когда одна переменная имеет 0-дисперсию, boxplot просто дает вам строку в этой точке. Однако Geom_violin заканчивается ошибкой. Какое поведение мне бы хотелось? Ну, либо введите строку, либо ничего, но, пожалуйста, дайте мне распределения для других переменных.

Хорошо, быстрый пример:

dff=data.frame(x=factor(rep(1:2,each=100)),y=c(rnorm(100),rep(0,100)))
ggplot(dff,aes(x=x,y=y)) + geom_violin()

дает

Error in `$<-.data.frame`(`*tmp*`, "n", value = 100L) : 
  replacement has 1 row, data has 0

Однако, что работает:

ggplot(dff,aes(x=x,y=y)) + geom_boxplot()

Обновление

Проблема разрешена по состоянию на вчера: https://github.com/hadley/ggplot2/issues/972

Обновление 2: (от автора вопроса) Вау, сам Хэдли ответил! geom_violin теперь ведет себя последовательно с geom_density и базой R density.

Однако, я не думаю, что поведение является оптимальным.

(1) Задача "нуль"

Просто запустите его с помощью моего оригинального примера:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rnorm(100), rep(0,100)))
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE)

Упрощение: введите описание изображения здесь

Является ли график справа подходящим представлением "всех нулей"? Я так не думаю. Лучше иметь обрезку, которая создает одну строку, чтобы показать, что нет никаких изменений в данных. Обходное решение: добавьте + geom_boxplot()

(2) Я действительно хочу TRIM=TRUE.

Пример:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rgamma(100,1,1), rep(0,100)  ))
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE)

Теперь у меня есть ненулевые данные, и стандартные оценки плотности ядра не справляются с этим правильно. С помощью trim=T я могу быстро увидеть, что данные строго положительны.

Я не утверждаю, что текущее поведение является "неправильным", поскольку оно соответствует другим функциям. Тем не менее, geom_violin может использоваться в разных контекстах для изучения различных data.frames с разнородными типами данных (например, с положительным + перекосом или нет).

Ответ 1

Три варианта решения этой проблемы до устранения проблемы ggplot2:

  • В качестве быстрого взлома вы можете установить одно из значений y равным 0,0001 (вместо нуля) и geom_violin.
  • Откажитесь от пакета vioplot, если вы не используете его ggplot2. vioplot не выдает ошибку, когда вы подаете ей кучу одинаковых значений.
  • Пакет Hmisc включает в себя функцию panel.bpplot (box-percentile plot), которая может создавать графики скриптов с помощью функции bwplot из пакета lattice. См. Раздел "Примеры" ?panel.bpplot. Он генерирует одну строку, когда вы кормите ее вектором одинаковых значений.