Фильтруйте график плотности ggplot2 по количеству наблюдений - PullRequest
3 голосов
/ 20 мая 2011

Можно ли отфильтровать подмножества данных, которые имеют небольшое количество наблюдений в вызове ggplot2?

Например, возьмите следующий график: qplot(price,data=diamonds,geom="density",colour=cut)

Density plot

Сюжет немного занят, и я хотел бы исключить значения cut с небольшим количеством наблюдений, т. Е.

> xtabs(~cut,diamonds)
cut
     Fair      Good Very Good   Premium     Ideal 
     1610      4906     12082     13791     21551

Fair и Good качеств фактора cut.

Мне нужно решение, которое могло бы соответствовать произвольному набору данных и, если возможно, иметь возможность выбирать не только по пороговому количеству наблюдений, но, например, по первой тройке.

Ответы [ 4 ]

11 голосов
/ 20 мая 2011
ggplot(subset(diamonds, cut %in% arrange(count(diamonds, .(cut)), desc(freq))[1:3,]$cut),
  aes(price, colour=cut)) + 
  geom_density() + facet_grid(~cut)
  1. count подсчитывает каждый элемент в data.frame.
  2. arrange заказывает data.frame на основе указанного столбца.
  3. descразрешает сортировку в обратном порядке.
  4. наконец поднабор строк, вырезание которых включено в верхние 3, на %in%.
3 голосов
/ 20 мая 2011

Вот мой дубль.Сначала создайте функцию, которая возвращает категории с большим количеством объектов.

firstx <- function (category, data, x = 1:3) {
  tab <- xtabs(~category, data)

  dimnames(tab)$category[order(tab, decreasing = TRUE)[x]]
}

#Then use subset to subset the data and droplevels to drop unused levels
#so they don't clutter the legend.
ggplot(droplevels(subset(diamonds, cut %in% firstx(cut, diamonds))), 
       aes(price, color = cut)) + geom_density()

Надеюсь, это поможет.

2 голосов
/ 20 мая 2011

Это, кажется, требует написания вашей собственной функции поднабора, возможно, что-то вроде этого:

mySubset <- function(dat,largestK=3,thresh=NULL){
   if (is.null(thresh)){
      tbl <- sort(table(dat)) 
      return(dat %in% tail(names(tbl),largestK))
   }
   else{
      return(dat >= thresh)
   }
}

Это может быть использовано в вызове ggplot следующим образом:

ggplot(diamonds[mySubset(diamonds$cut),],...)

Этот кодне имеет дело с падением уровней из-за факторов, так что следите за этим.По этой причине я обычно оставляю категориальные переменные в виде символов, если только я не нуждаюсь в их упорядочении.

1 голос
/ 20 мая 2011
## Top 3 cuts
tmp <- names(sort(summary(diamonds$cut), decreasing = T))[1:3]
tmp <- droplevels(subset(diamonds, cut == tmp))
ggplot(tmp, aes(price, color=cut)) + geom_density()

enter image description here

Но вы рассматривали огранку?

ggplot(diamonds, aes(price, color=cut)) + geom_density() + facet_grid(~cut)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...