Как ggplot2 разделяет группы, используя cut_number, если у вас есть небольшое количество точек данных? - PullRequest
1 голос
/ 17 апреля 2020

Меня интересует "скрытая функциональность" ggplot2 и cut_number. У меня есть довольно сложные данные, которые содержат много подмножеств данных с относительно небольшим числом точек данных. Я прикрепил график как пример:

geom_boxplot с фасетами

Я настроил свой разрез здесь, чтобы иметь пять групп, которые, как вы можете видеть, были хорошими для нескольких участков, но многие другие только сформировали 3 боксплота. Мне интересно, попытается ли cut_number создавать графики с минимальным количеством выборок на категорию? Я предполагаю, что другие считают, что число должно быть еще выше. Если это правда, есть ли способ, которым я могу изменить, сколько групп он пытается сделать? Я бы предпочел использовать это более cut_interval, так как изменяющаяся ширина этих графиков информативный (даже если некоторые данные выглядят плохо).

Например, третий столбец слева имеет 14, 4 0 и 16 образцов в 2015, 2016 и 2018 годах соответственно. Я бы предположил, что cut_number попытался бы сформировать как минимум 4 боксплота на 2016 год.

Я не уверен, что мой код актуален, но я приложил слегка урезанную версию здесь на случай, если есть вероятность того, что я где-то допустил ошибку и случайно получил неправильную функциональность от cut_number.

Мой код:

gg <- ggplot(data = LakeCombine, aes(x = JulianDate, y = log10(Concentration)))

gg + geom_boxplot(aes(group = cut_number(JulianDate, 5)), outlier.size = 2) + 
facet_grid(rows = vars(Year), cols = vars(Lake)) + 
scale_x_continuous(breaks = c(121,182,244, 305), labels = c("May","Jul","Sep","Nov"), limits = c(100,325)) + 
geom_point(data = LakeCombineZero, aes(x = JulianDate, y = Concentration), shape = 1)

1 Ответ

0 голосов
/ 17 апреля 2020

Как упомянул @sarah, из предоставленных вами данных довольно сложно дать определенный ответ, но ...

Да cut_number имеет некоторые внутренние логики c о размере бункеров. Это не так просто, как общий размер (N = 5 или любое другое число), это также связано с относительным размером. По моему опыту, это вызывает сообщение об ошибке (см. Ниже), но это может быть потеряно в процессе фасетирования в вашем случае. Чтобы дать вам простой пример, давайте используем diamonds из ggplot2

Обратите внимание, что мы можем сделать 27 бинов на основе нашей очень большой выборки из> 53 000 бриллиантов depth, но не 28, и это явно не так любой N будет приближаться к небольшому числу. Вы можете поиграть со своими собственными данными, основанными на той же методологии, а затем определить, хотите ли вы, чтобы определенные срезы принудительно выполнялись вручную, или выбрать размер корзины, который подходит для каждой комбинации.

Чак

library(ggplot2)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
str(diamonds)
#> tibble [53,940 × 10] (S3: tbl_df/tbl/data.frame)
#>  $ carat  : num [1:53940] 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
#>  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
#>  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
#>  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
#>  $ depth  : num [1:53940] 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
#>  $ table  : num [1:53940] 55 61 65 58 58 57 57 55 61 61 ...
#>  $ price  : int [1:53940] 326 326 327 334 335 336 336 337 337 338 ...
#>  $ x      : num [1:53940] 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
#>  $ y      : num [1:53940] 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
#>  $ z      : num [1:53940] 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
cut_number(diamonds$depth, n = 10) %>% table
#> .
#>     [43,60]   (60,60.8] (60.8,61.2] (61.2,61.6] (61.6,61.8] (61.8,62.1] 
#>        5625        5671        4953        6878        3981        6422 
#> (62.1,62.4] (62.4,62.7] (62.7,63.3]   (63.3,79] 
#>        5771        4366        5386        4887
cut_number(diamonds$depth, n = 27) %>% table
#> .
#>     [43,59]   (59,59.7] (59.7,60.1] (60.1,60.4] (60.4,60.7] (60.7,60.9] 
#>        2067        2182        1926        1829        2369        1987 
#> (60.9,61.1] (61.1,61.2] (61.2,61.4] (61.4,61.5] (61.5,61.6] (61.6,61.7] 
#>        2463        1426        3203        1719        1956        1904 
#> (61.7,61.8] (61.8,61.9]   (61.9,62]   (62,62.1] (62.1,62.2] (62.2,62.3] 
#>        2077        2163        2239        2020        2039        1940 
#> (62.3,62.4] (62.4,62.5] (62.5,62.6] (62.6,62.8] (62.8,62.9] (62.9,63.2] 
#>        1792        1563        1497        2539        1096        2352 
#> (63.2,63.5]   (63.5,64]     (64,79] 
#>        1847        1875        1870

cut_number(diamonds$depth, n = 28) %>% table
#> Error: Insufficient data values to produce 28 bins.

Создано в 2020-04-17 пакетом Представ (v0.3.0)

...