Диаграмма рассеяния, сравнивающая две переменные с ggplot и аккуратными данными

#r #ggplot2

#r #ggplot2 #tidyr

Вопрос:

При неопрятных данных выполнение диаграммы рассеяния, сравнивающей две переменные, является тривиальным либо в базовом R, либо ggplot2 . Например, вот пример диаграммы рассеяния от R for Data Science:

 ggplot(data = faithful)   
  geom_point(mapping = aes(x = eruptions, y = waiting))
  

Время ожидания в сравнении с извержениями для Old Faithful

Однако при аккуратной версии данных неясно, как построить зависимость длины извержения от времени ожидания, кроме как в виде числовой переменной от категориальной переменной (например, как на boxplot или на графике точек и линий ниже).

Очевидно, что можно было бы работать с исходной «широкой» версией или, в других случаях, использовать spread команду, но мне интересно, не упускаю ли я простого способа присвоения x и y значений по подгруппам в ggplot ? Или, альтернативно, это хороший пример одного ограничения аккуратных данных и варианта использования для широких данных?

 tidy_faithful <- faithful %>%
  mutate(pair = row_number() %>%   # create pair number
                  as.factor()) %>% # make categorical
tidyr::gather(
          eruptions:waiting,
          key   = "event",
          value = "time") %>%
arrange(pair)

> head(tidy_faithful, 4)
  pair     event   time
1    1 eruptions  3.600
2    1   waiting 79.000
3    2 eruptions  1.800
4    2   waiting 54.000


tidy_faithful %>%
  slice(1:50) %>% # simplify data
  ggplot()  
    aes(x     = factor(event),
        y     = time,
        group = pair)   
    geom_point()  
    geom_line()
  

парный точечный и линейный график с аккуратными старыми достоверными данными

Комментарии:

1. Я не согласен с тем, что сбор этих данных более аккуратный. Возможно, если вы сначала добавите key столбец, чтобы каждое извержение все еще было связано. Но «простой способ присвоения значений x и y по подгруппам» — это не проблема построения графика, это проблема манипулирования данными, поэтому не ищите решение внутри ggplot.

2. Я не совсем уверен, исходный формат кажется мне аккуратным — каждое наблюдение содержит одну строку, а каждая переменная (извержения или ожидание) имеет столбец.

3. Знание того, что записи данных в одной строке связаны, даже если нет столбца «номер строки», не является неопрятными данными. Я мог видеть, что аргументы выдвигаются в обоих направлениях относительно столбца weighting и eruption . И ваш вопрос, похоже, является хорошим примером аргумента о том, что он уже аккуратный . Я рад, что вы с энтузиазмом относитесь к tidy data, это отличный принцип — но я думаю, что вы заходите слишком далеко. Возможно, посмотрите на другие, уже аккуратные наборы данных, такие как diamonds или iris . Они являются хорошими примерами уже аккуратных данных. Иметь несколько столбцов — нормально.

4. Подход «грамматики графики» заключается в сопоставлении переменных с эстетикой, поэтому ggplot2 работает лучше всего, когда разные измерения ваших данных находятся в разных столбцах. Если вы хотите сопоставить извержения с ожиданием, и вы думаете о них как о двух атрибутах каждого наблюдаемого цикла извержения, их следует поместить в отдельные переменные перед ggplot. Я не знаю хорошего способа добиться этого в противном случае.

5. Вы, кажется, думаете, что «длинный» и «аккуратный» — это одно и то же. Хотя большинство неопрятных данных слишком обширны, это не единственный способ сделать данные неопрятными.