Диаграмма пузырькового типа в R

Я пытаюсь создать эту диаграмму из данных с двумя факторами

что нужно

что нужно

данные представляют собой три столбца, идентификатор, фактор (1 или 2) и значение (1-200), 45 000 строк.

dput(head(d))
structure(list(ID = 1:6, variable = structure(c(1L, 1L, 1L, 1L, 
1L, 1L), .Label = c("on.tank", "on.main"), class = "factor"), 
    value = c(0, 41, 0, 2, 0, 1)), .Names = c("ID", "variable", 
"value"), row.names = c(NA, 6L), class = "data.frame")

Я пробовал несколько раз с ggplot2:

ggplot(d3, aes(ID,abs.sol, col=variable)) + 
geom_point(aes(size = abs.sol)) +
theme(text = element_text(size=15)) +
scale_y_continuous(labels=abs)

а также

ggplot(d, aes(x = factor(1), y = value)) +
  geom_jitter(aes(color = variable, shape = variable), 
              width = 0.1, size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) + 
  labs(x = NULL)   # Remove x axis label

а также

ggplot(d3, aes(x = factor(1), y = abs.sol)) +
    geom_jitter(aes(color = variable, shape = variable), 
              width = 0.1, size = 1) +
  scale_color_manual(values = c("#00AFBB", "#E7B800")) + 
  labs(x = NULL)   # Remove x axis label

Результаты на этих изображениях:

image1 image1

изображение2 image2

image3 image3

Image3 показывает данные, которые я пытаюсь упростить до приведенной выше пузырьковой диаграммы. Я хочу, чтобы цвет представлял фактор (1 или 2), размер представлял COUNT каждого значения (т.е. сколько 75 в данных) и фактическое значение (например, «75» в виде текста в пузыре).


person ramonskovitch    schedule 09.01.2019    source источник
comment
Пожалуйста, вставьте изображения (для графиков) в свой вопрос, а не ссылки на изображения. Например, я не могу получить доступ к ссылке на облако.   -  person NelsonGon    schedule 09.01.2019
comment
я не могу; Для этого мне нужна репутация 10. Вы получаете и ошибка со ссылкой?   -  person ramonskovitch    schedule 09.01.2019
comment
Да. Ссылка у меня не открывается. Не уверен, почему.   -  person NelsonGon    schedule 09.01.2019
comment
В предоставленных вами данных есть фактор столбца 1,2 и нет столбца COUNT. Пожалуйста, обновите свой пример.   -  person pogibas    schedule 09.01.2019
comment
Также неясно, почему вы добавили графики с дрожанием и полосой, когда вам нужен график с geom_point (пузыри).   -  person pogibas    schedule 09.01.2019
comment
какие именно x, y в сюжете вы хотите? (это x=Value и y=Count), и я предполагаю, что Count — это количество каждого Value на Factor. Честно говоря, чего вы хотите, до сих пор не ясно.   -  person DS_UNI    schedule 09.01.2019
comment
Извините, это не ясно. Нет столбца COUNT, поскольку я предполагал, что данные будут обрабатываться дальше, чтобы получить количество значений. Факторами являются on.tank и on.main, которые в другой версии моих испытаний были изменены на 1 и 2, поэтому некоторые попытки dplyer не выдавали ошибки.   -  person ramonskovitch    schedule 10.01.2019
comment
!результат1   -  person ramonskovitch    schedule 10.01.2019
comment
imgur.com/wK9Rs7y   -  person ramonskovitch    schedule 10.01.2019


Ответы (2)


Я не думаю, что ваш набор данных подходит для пузырькового графика. Пузырьковая диаграмма предназначена для рисования трех переменных, то есть многомерного случая, x, y и другого z.

Но здесь я не вижу никаких x и y.

library(tidyverse)
set.seed(1)
(mydf <-
  data_frame(
    ID = 1:50,
    value = sample(1:50, 50, replace = TRUE)
  ) %>% 
  add_column(variable = gl(2, k = 25, labels = c("on.tank", "on.main")), .before = 2))
#> # A tibble: 50 x 3
#>       ID variable value
#>    <int> <fct>    <int>
#>  1     1 on.tank     14
#>  2     2 on.tank     19
#>  3     3 on.tank     29
#>  4     4 on.tank     46
#>  5     5 on.tank     11
#>  6     6 on.tank     45
#>  7     7 on.tank     48
#>  8     8 on.tank     34
#>  9     9 on.tank     32
#> 10    10 on.tank      4
#> # ... with 40 more rows

К этому набору данных можно провести summarise(n()) или tally() для каждой группы (variable, value)

mydf %>% 
  count(variable, value) # equivalent to group_by() and tally()
#> # A tibble: 39 x 3
#> # Groups:   variable [?]
#>    variable value     n
#>    <fct>    <int> <int>
#>  1 on.tank      4     1
#>  2 on.tank      7     1
#>  3 on.tank      9     1
#>  4 on.tank     11     3
#>  5 on.tank     14     2
#>  6 on.tank     19     1
#>  7 on.tank     20     2
#>  8 on.tank     25     1
#>  9 on.tank     29     1
#> 10 on.tank     32     1
#> # ... with 29 more rows

n будет размером пузырька.

mydf %>% 
  count(variable, value) %>% 
  ggplot() +
  aes(x = value, y = n) +
  # geom_point(alpha = .5) +
  geom_text(aes(label = n), size = 2.5) +
  geom_point(aes(size = n, colour = variable), shape = 1) +
  scale_size_continuous(range = c(1, 10), breaks = NULL)

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

Здесь у нас есть только value-count. Это не многомерная задача. Поскольку это не x-y с третьей переменной, пузырьковый график кажется не таким информативным. Изменение размера просто отвлекает.


Альтернативы

Можно подумать и другие сюжеты. Например,

mydf %>% 
  ggplot() +
  aes(x = value) +
  geom_dotplot(binwidth = 1) +
  facet_grid(variable ~ .)

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

Вы можете сравнить два фактора и подсчитать каждое значение. Я думаю, что это более полезно, чем пузырьковый сюжет.

Поскольку количество точек данных не мало, можно использовать и гистограмму: geom_bar()

mydf %>% 
  ggplot() +
  aes(x = value) +
  geom_bar(aes(y = ..count..)) +
  facet_grid(variable ~ .)

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

Большой размер набора данных

set.seed(1)
(mydf2 <-
  data_frame(
    ID = 1:3000,
    value = sample(1:200, 3000, replace = TRUE)
  ) %>% 
  add_column(variable = gl(2, k = 1500, labels = c("on.tank", "on.main")), .before = 2))
#> # A tibble: 3,000 x 3
#>       ID variable value
#>    <int> <fct>    <int>
#>  1     1 on.tank     54
#>  2     2 on.tank     75
#>  3     3 on.tank    115
#>  4     4 on.tank    182
#>  5     5 on.tank     41
#>  6     6 on.tank    180
#>  7     7 on.tank    189
#>  8     8 on.tank    133
#>  9     9 on.tank    126
#> 10    10 on.tank     13
#> # ... with 2,990 more rows

В том же процессе гистограмма дает

mydf2 %>% 
  ggplot() +
  aes(x = value) +
  geom_bar(aes(y = ..count..)) +
  facet_grid(variable ~ .)

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

Если вы хотите подсчитать серию из 10 дней, может работать следующее:

mydf2 %>% 
  count(variable, value) %>% 
  filter(value == 10)
#> # A tibble: 2 x 3
#>   variable value     n
#>   <fct>    <int> <int>
#> 1 on.tank     10     6
#> 2 on.main     10    10
person Blended    schedule 10.01.2019
comment
так, чтобы объяснить немного; Результаты моделирования системы резервуаров для дождевой воды, которая также подключена к сети (129 лет ежедневных данных). иногда он находится на баке в течение нескольких дней (значение в наборе данных, где переменная on.tank), и если бак пуст, он переключается на водопровод (значение в данных, где переменная говорит on. главный). Идея пузыря заключается в том, что мне нужно показать, например, сколько последовательностей длиной 10 дней (подсчитайте количество последовательностей длиной 10 дней) было домом на резервуаре. аналогично для всех длин последовательностей как на баке, так и в сети. - person ramonskovitch; 14.01.2019
comment
@ramonskovitch, если я правильно понял, вы хотите подсчитать каждую value (серию дней) для каждой on.tank и on.main. Я также вычислял и визуализировал, используя точечный график и гистограмму. Нужен ли пузырьковый сюжет? - person Blended; 14.01.2019
comment
в реальных данных насчитывается более 3000 последовательностей продолжительностью от 1 до 200 дней. Я искал агрегацию, чтобы лучше визуализировать данные. Я исследую ось X фактических лет (129 лет) или, может быть, десятилетий?? с осью ординат длин последовательности и размером кружка числа появлений каждой длины последовательности в этом году или десятилетии. Теперь добавили переменную, которая является годом, так что посмотрим, как это выглядит. - person ramonskovitch; 18.01.2019

В отсутствие надлежащих данных немного сложно понять, чего вы пытаетесь достичь. Но давайте все же попробуем :)

Сначала создайте некоторые случайные данные в соответствии с вашим описанием:

require(tidyverse)    
TYPE = sample(c("factor 1","factor 2"),1000, replace=T)
VALUE = sample(1:200,1000,replace=T)
df = data.frame(TYPE, VALUE)

Время для некоторой обработки данных и их визуализации. Сначала примите ваш подход к подсчету индивидуальных реализаций ценности:

df %>%
  group_by(TYPE, VALUE) %>%
  tally() %>%
  ggplot(aes(x=VALUE, y=n, color = TYPE)) + geom_point(aes(size=n))

Это выглядит не очень хорошо — слишком много уникальных комбинаций TYPE-VALUE, что приводит к множеству маленьких пузырьков. Давайте создадим более грубые значения, округлив до сетки размером 20:

df %>%
  mutate(VALUE = round(VALUE/20,0)*20) %>%
  group_by(TYPE, VALUE) %>%
  tally() %>%
  ggplot(aes(x=VALUE, y=n, color = TYPE)) + geom_point(aes(size=n))

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

person CMichael    schedule 09.01.2019
comment
Это работает, однако показывает, что среди 45 000 результатов многие со счетом 1 составляют переполненный график. Я думаю, что может сработать упражнение по группировке, а не изменение сетки, я изучу и вернусь [![введите описание изображения здесь][1]] [1]: imgur.com/wK9Rs7y - person ramonskovitch; 10.01.2019
comment
замените 20 на большее значение в mutate(VALUE = round(VALUE/20,0)*20) %>%, чтобы попробовать более грубый биннинг - person CMichael; 10.01.2019