Мне очень нравились скрипичные сюжеты, так как они дают мне гораздо лучшее представление о том, что ящики занимают место, когда у вас есть забавные раздачи. Мне нравится автоматизировать много вещей и, таким образом, столкнулся с проблемой: Когда одна переменная имеет 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 с разнородными типами данных (например, с положительным + перекосом или нет).