2016-12-04 5 views
0

Я пытаюсь создать диаграмму рассеяния с ggplot, используя несколько полей. Я читал об этих диаграммах рассеяния и раскраски для поля, но мне было интересно, как это сделать для набора данных ggplot2movies? Я хотел цвета на основе жанра, но эти жанры все распались:R ggplot chartplot color multiple columns

> movies <- ggplot2movies::movies 
> head(movies) 
      title year length budget rating votes r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 mpaa Action Animation Comedy Drama Documentary Romance Short 
        <chr> <int> <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <int>  <int> <int> <int>  <int> <int> <int> 
1      $ 1971 121  NA 6.4 348 4.5 4.5 4.5 4.5 14.5 24.5 24.5 14.5 4.5 4.5   0   0  1  1   0  0  0 
2  $1000 a Touchdown 1939  71  NA 6.0 20 0.0 14.5 4.5 24.5 14.5 14.5 14.5 4.5 4.5 14.5   0   0  1  0   0  0  0 
3 $21 a Day Once a Month 1941  7  NA 8.2  5 0.0 0.0 0.0 0.0 0.0 24.5 0.0 44.5 24.5 24.5   0   1  0  0   0  0  1 
4     $40,000 1996  70  NA 8.2  6 14.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 34.5 45.5   0   0  1  0   0  0  0 
5 $50,000 Climax Show, The 1975  71  NA 3.4 17 24.5 4.5 0.0 14.5 14.5 4.5 0.0 0.0 0.0 24.5   0   0  0  0   0  0  0 
6     $pent 2000  91  NA 4.3 45 4.5 4.5 4.5 14.5 14.5 14.5 4.5 4.5 14.5 14.5   0   0  0  1   0  0  0 

Что такое лучший способ приблизиться к этому (цвет в зависимости от жанра)? Вся помощь действительно оценена!

+2

Я думаю, вы будете иметь, чтобы привести в порядок данные (широкий в длинном формате). Возможно, с 'tidyr :: gather()'. – hrbrmstr

ответ

2

Как указано в @hrbrmstr, вам необходимо преобразовать данные из широких в длинные. Вы можете использовать tidyr::gather() в сочетании с dplyr::filter() для достижения этого. Эта цепочка:

  1. собирает имена и значения от действий на короткий в колонках genre и flag. Это перемещает множество столбцов (широкий) в пару ключевых значений (длинный).
  2. Использует фильтр для удаления лишних значений для genre (те, где флаг == 0).
  3. Магазины результирующий кадр данных в plot_data

Остальной код представляет собой простой ggplot2 диаграмму рассеяния length против rating.

library(dplyr) 
library(tidyr) 
library(ggplot2) 
library(ggplot2movies) 

plot_data <- movies %>% 
    gather(genre, flag, Action:Short) %>% 
    filter(flag != 0) 

ggplot(plot_data, aes(x = rating, y = length)) + 
    geom_point(aes(color = genre), alpha = 0.4) 

enter image description here

+0

Очень полезно, и именно то, что я искал! благодаря – dnsko