График разброса в ggplot, одна числовая переменная в двух группах

Я хотел бы создать диаграмму рассеяния в ggplot2, которая отображает мужские test_scores по оси x и женские test_scores по оси Y, используя набор данных ниже. Я могу легко создать график geom_line, разделив мужчин и женщин и поместив дату («dts») на ось x.

library(tidyverse)

#create data

dts <- c("2011-01-02","2011-01-02","2011-01-03","2011-01-04","2011-01-05",
"2011-01-02","2011-01-02","2011-01-03","2011-01-04","2011-01-05")

sex <- c("M","F","M","F","M","F","M","F","M","F")

test <- round(runif(10,.5,1),2)

semester <- data.frame("dts" = as.Date(dts), "sex" = sex, "test_scores" = 
test)

#show the geom_line plot
ggplot(semester, aes(x = dts, y = test, color = sex)) + geom_line()

Похоже, что с одним временным рядом ggplot2 лучше справляется с данными в широком формате, чем в длинном. Например, я мог бы легко создать два столбца, «male_scores» и «female_scores», и сопоставить их друг с другом, но я хотел бы, чтобы мои данные были аккуратными и в длинном формате.

Приветствую и спасибо.


person glaucon    schedule 12.01.2017    source источник
comment
Практическое правило: делайте шире или длиннее, пока ровно один столбец не будет сопоставлен с одним эстетическим элементом.   -  person Axeman    schedule 12.01.2017
comment
Вы можете упорядочить свой рабочий фреймворк, как вам нравится, просто создайте новый прямо перед построением конкретной фигуры.   -  person jf328    schedule 12.01.2017


Ответы (2)


Вы слишком прибрались. Приведение в порядок данных - это не просто механизм, позволяющий сделать их как можно более длинными, а сделать их настолько широкими, насколько это необходимо.

Например, если бы у вас были координаты X и Y для наблюдений за животными, у вас не было бы двух строк, одна со столбцом «label», содержащим «X» и координату X в столбце «value», а другая с «Y» в столбце столбец «метка» и координата Y в столбце «значение» - если вы действительно не храните данные в хранилище ключей и значений, но это уже другая история ...

Расширьте свои данные и поместите результаты тестов для мужчин и женщин в test_core_male и test_score_female, тогда они будут эстетикой x и y для вашего графика разброса.

person Spacedman    schedule 12.01.2017
comment
Отлично. Я так боялся. Максимальное стремление к чистоте данных - не всегда лучшая стратегия. Спасибо - person glaucon; 13.01.2017

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

         dts  sex  test_scores
1 2011-01-02   M        0.67
2 2011-01-02   F        0.78
3 2011-01-03   M        0.58
4 2011-01-04   F        0.58
5 2011-01-05   M        0.51

Если бы вы использовали код -

ggplot(semester, aes(x = semester$test_scores[semester$sex=='M',] ,
                     y =  semester$test_scores[semester$sex=='F',], 
                     color = sex)) + geom_point()

GGplot выдаст ошибку. Основная причина заключается в том, что из-за подмножества баллов для мужчин для этого подмножества нет соответствующих баллов для женщин. Сначала вам нужно свернуть данные до уровня даты. Как вы правильно заметили, на данный момент это не длинный формат.

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

person Travis Gaddie    schedule 12.01.2017