Отображение трех частей информации на графике


15

Примечание: сейчас добавлено 50 точек необработанных данных.

Я хочу показать, сколько я изучил, и сколько страниц я выполнил за неделю, разбито по дням, и я сделал это, как показано ниже:введите описание изображения здесь

У меня были люди, которые говорили мне, что не могут понять графики, но я понятия не имею, как еще я могу их отобразить Поскольку мне, по сути, понадобятся три измерения без составления совокупного описания. Я хочу избегать использования многочисленных линейных графиков, так как через несколько недель они станут нечитаемыми. Я ничего не могу сделать?

Как я могу отобразить это более четко?

Date        Total   Total pages
21/11/2014  2.4166   0
22/11/2014  0        0
23/11/2014  1.5833   4
24/11/2014  3.0166  13
25/11/2014  2.4999   6
26/11/2014  1.4833   3
27/11/2014  3.0499   6
28/11/2014  0        0
29/11/2014  2.4499   5
30/11/2014  2.8833   2
 1/12/2014  0        0
 2/12/2014  4.1166   8
 3/12/2014  1.3333   5
 4/12/2014  1.2499   3
 5/12/2014  1.6666   8
 6/12/2014  0        0
 7/12/2014  2.4833   9
29/12/2014  0        0
30/12/2014  1.2332   1
31/12/2014  0.3333   0
 1/01/2015  3.5666   2
 2/01/2015  0.8166   0
 3/01/2015  2.75    28
 4/01/2015  0.4166   0
 5/01/2015  1.2833   0
 6/01/2015  0.3333   3
 7/01/2015  0        0
 8/01/2015  0        0
 9/01/2015  2.35     2
10/01/2015  0.5666   0
11/01/2015  0        0
12/01/2015  1.6666   0
13/01/2015  2.2666   5
14/01/2015  2.5165   6
15/01/2015  2.0166   0
16/01/2015  2.9666   1
17/01/2015  0.8333   0
18/01/2015  0.6666   1
19/01/2015  1.45     0
20/01/2015  0.3166   0
21/01/2015  0        0
22/01/2015  0.2333   0
23/01/2015  0.85     2
24/01/2015  0        0
25/01/2015  0        0
26/01/2015  0.6666   4
27/01/2015  0.8333   1
28/01/2015  1.5498   5
29/01/2015  6.4159   9
30/01/2015  2.9166   0

Если вы можете опубликовать образцы данных, те, кто заинтересован, могут сыграть и показать вам свои решения. Чтобы быть реалистичным, потребуется несколько недель, поскольку суть проблемы заключается в том, что происходит, когда количество недель увеличивается.
Ник Кокс

@NickCox Я мог бы сделать репост через несколько недель, так как я честно не уверен, как изменятся данные, и я до сих пор прожил только первые 13 дней (3 из которых без исследования)

@NickCox Как мне опубликовать необработанные данные?

1
Мой совет - подожди немного. Обновляя вопрос, вы привлекли к нему внимание. Посмотрите, получите ли вы новые ответы.
Ник Кокс

1
Что вы хотите отобразить об этих данных? Какую историю вы хотите рассказать? Что вы пытаетесь заставить людей понять о ваших данных с гистограммами?
gung - Восстановить Монику

Ответы:


7

Одним из способов визуализации данных на основе даты / календаря является матричный дисплей, который кодирует данные с помощью цвета. Матрица (или таблица) организована так, что строки представляют недели, а столбцы - дни. Вы можете добавить последний столбец для еженедельного итога, если это желательно.

Это можно реализовать несколько проще в Excel с условным форматированием, если данные расположены правильно. В частности, вы можете построить «сетку» значений с формулами, которые соответствуют вашим исходным данным. Оттуда вы можете использовать условное форматирование для отображения результата.

Вот как может выглядеть результат. Извините, я изменил формат даты. Формула в ячейке H1 является: "=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)". Это делает некоторую математику, чтобы получить дни в правильном порядке. Надеюсь, это просто.

Изображение условного форматирования с матричной компоновкой

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

Этот формат очень похож на то, как GitHub отображает активность пользователей / вклады с течением времени. Вот один пользователь (не я!). введите описание изображения здесь


2
(+1) Мне нравится этот подход, особенно потому, что он хорошо подходит для использования в той же электронной таблице, в которую вводятся данные. Этот графический дисплей фактически является тепловой картой . Я регулярно использую подобные установки самостоятельно, и я нахожу одну слабость в том, что аспекты тенденций могут быть трудно выделить, поэтому может быть полезно дополнить это некоторым вариантом линейного графика, чтобы показать более мелкие детали (Питер Флом, Ник Кокс и я все сделал хорошие предложения).
Серебряная рыбка

6

Отличительной чертой оригинала являются еженедельные суммы. Отдельные значения имеют смысл только после того, как вы узнали цвета, и я думаю, что это большая причина, по которой сюжет не работает для новых зрителей. В связи с этим временной аспект дней теряется. Последовательный набор цветов может помочь (например, 7 оттенков синего).

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

На мою попытку . Учитывая очевидную важность еженедельных сумм, я составил еженедельные кумулятивные суммы. Показывает еженедельные суммы и дни в порядке времени. Точные дневные значения менее ясны, но выбросные значения все равно будут выделяться.

Для таких маленьких линейных графиков (которые могут быть уменьшены до размера спарклайнов ) полезно иметь контрольную линию или область. Для иллюстрации я добавил целевой диапазон. Если цель не подходит, то эталоном может быть что-то вроде диапазона за последние три недели или некоторого фиксированного эталонного значения.

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

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

С гораздо большим количеством недель вы можете организовать их в виде таблицы, а не вертикального списка.

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


Я думаю, что это отлично. Существует ли эффективный способ объединить часы занятий и страницы, на которых размещена информация, что (по крайней мере, у меня сложилось впечатление) представляется одной из ключевых целей упражнения? Я подозреваю, что было бы достаточно эффективно на первом графике иметь «часы обучения» и «заполненные страницы» вплотную (то есть часы обучения, нанесенные в столбце слева от годовой недели, и страницы, заполненные в столбце справа от годовой недели) ). Но я не уверен, что будет хорошо работать на втором графике.
Серебряная

Очевидно, что одним из решений было бы перенести оба ряда со вторичной вертикальной осью для изучаемых страниц, но многие люди имеют твердое мнение против этого, например, Хэдли Уикхем намеренно отказывается внедрять его в ggplot. Как правило, я бы избегал этого, но это может иметь смысл, если есть цели для обоих - это приведет к естественному масштабу для вторичной оси Y, чтобы обеспечить точное выравнивание целевых областей для часов и страниц. Это масштабирование решения , как правило , спорный вопрос с несколькими у осей.
Серебряная

Спасибо @Silverfish! Я также не люблю две шкалы на одном графике, но, как вы говорите, если обе шкалы можно поместить в одну шкалу относительно их соответствующих целей, это может сработать. Я должен был прямо указать в своем ответе, что, показав только одну меру, я предположил, что другая мера будет показана таким же образом, но в отдельных графиках. В форме вертикального списка каждая мера может представлять собой отдельный столбец графиков.
Xan

Это еще один отличный ответ. Мне определенно нравится идея, которую вы применили. Я должен буду увидеть, что я делаю сейчас, когда я просмотрел все ответы. Спасибо

5

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

Если это проблема, то вы можете разделить временные ряды на компоненты:

Суточная вариация

Еженедельная вариация

Долгосрочная тенденция

Что-нибудь еще.

Уильям С. Кливленд показывает хороший пример этого в одной из своих книг (я не в своем офисе и не могу вспомнить, какая из его книг имеет пример, но это либо Визуализация данных, либо Элементы графического отображения данных ).

И R, и SAS имеют инструменты для этого. У вас есть доступ к любому из них?


У меня есть R на моем компьютере, но я редко использовал его. (Полностью готов учиться, хотя)

Ну, у него есть кривая обучения, но посмотрите на функцию degpose (). Возможно, вам придется немного поиграть, чтобы получить то, что вы хотите. Кроме того, если вы можете найти книги Кливленда, они выдающиеся.
Питер Флом - Восстановить Монику

3
Вот пример Кливленда, упомянутый Питером из Roc. Если у вас установлен R, вы можете запустить пример: stat.ethz.ch/R-manual/R-devel/library/stats/html/stl.html
Киран

@ Киран Правильный вывод? imgur.com/IzRC0h8

5

Сначала я изложу некоторые возражения против ваших исходных гистограмм с накоплением или разделением.

а. Цветовая кодировка выглядит совершенно произвольно. Следовательно, граф не может быть изучен без повторения назад и вперед между легендой и графом.

б. Нули неявные, как невидимые сегменты бара. Нули являются частью вариации.

По этим и другим причинам графики сложно декодировать.

Тем не менее, график имеет смысл, если интерес в основном заключается в изучении вариаций итогов от недели к неделе. Много недель может быть построено столько же баров. Соответствующим недостатком является то, что изучать вариации в течение нескольких недель будет все труднее.

Резервное копирование: в каждой задаче есть три переменных.

  1. Время изучено или страницы заполнены.

  2. День недели.

  3. Номер недели.

По мере увеличения количества недель любой график будет более подробным. Задача состоит в том, чтобы держать эту деталь под контролем.

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


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

Действительно, но людям все еще нужно использовать легенду для декодирования.
Ник Кокс

У R есть команда monthplot, которая может фактически использоваться для еженедельных данных - см. Stackoverflow.com/questions/5826703/…
Silverfish

5

Линейные графики, вероятно, было бы легче интерпретировать, если бы вы взяли скользящую среднюю семидневную, четырнадцатидневную или, возможно, 28-дневную скользящую среднюю. Это сгладит их и все же позволит вам определить тенденции.

Это имеет некоторые сходства с решением Питера Флома, хотя и является более простым и, следовательно, не дает полной картины, но вполне может подойти для ваших нужд. Если вы записываете свои данные в электронную таблицу, у нее есть преимущество, заключающееся в том, что такое усреднение может быть легко выполнено в самой электронной таблице путем настройки некоторых формул, и график будет автоматически обновляться при заполнении новых данных.

Обновление для включения графиков

Линейные графики для скользящих средних

График электронных таблиц для семидневных скользящих средних не впечатляет, но, кажется, хорошо справляется со своей задачей - дневные колебания сглаживаются, поэтому тенденции легче обнаружить (по сравнению с эквивалентным дневным графиком, который настолько шумный, что непонятен). Некоторые ключевые характеристики хорошо видны на этом графике: например, большое количество работы было выполнено в середине января в почасовом выражении, но это не сопровождалось пропорциональным увеличением среднего числа страниц, выполненных за день. Рождественский перерыв очень заметен и до тех пор, пока отдельные точки данных четко отображаются, он не слишком вводит в заблуждение (если бы была видна только линия, было бы невозможно определить, что плоский период был вызван отсутствием данных!). Тем не менее, я настоятельно рекомендую в том числе1,5

При наличии всего пятидесяти элементов данных, по-видимому, не стоит пытаться усреднять в течение более длительного периода времени, чтобы обнаружить долгосрочные тренды. Точно так же я подозреваю, что превосходная идея Питера Флома о сезонном разложении будет бороться с такими ограниченными данными. Если бы вы выполняли декомпозицию в своей электронной таблице, было бы еще более важно включить разрыв в ноль данных.

Чтобы воспроизвести мои формулы, вставьте это так, чтобы «Дата» находилась в ячейке A1:

Date    Hours   Pages   7-day rolling hours 7-day rolling pages
25/11/14    2.4999  6       
26/11/14    1.4833  3       
27/11/14    3.0499  6       
28/11/14    0   0       
29/11/14    2.4499  5       
30/11/14    2.8833  2       
01/12/14    0   0   =AVERAGE(B2:B8) =AVERAGE(C2:C8)
02/12/14    4.1166  8   =AVERAGE(B3:B9) =AVERAGE(C3:C9)
03/12/14    1.3333  5   =AVERAGE(B4:B10)    =AVERAGE(C4:C10)
04/12/14    1.2499  3   =AVERAGE(B5:B11)    =AVERAGE(C5:C11)
05/12/14    1.6666  8   =AVERAGE(B6:B12)    =AVERAGE(C6:C12)
06/12/14    0   0   =AVERAGE(B7:B13)    =AVERAGE(C7:C13)
07/12/14    2.4833  9   =AVERAGE(B8:B14)    =AVERAGE(C8:C14)
29/12/14    0   0   =AVERAGE(B9:B15)    =AVERAGE(C9:C15)
30/12/14    1.2332  1   =AVERAGE(B10:B16)   =AVERAGE(C10:C16)
31/12/14    0.3333  0   =AVERAGE(B11:B17)   =AVERAGE(C11:C17)
01/01/15    3.5666  2   =AVERAGE(B12:B18)   =AVERAGE(C12:C18)
02/01/15    0.8166  0   =AVERAGE(B13:B19)   =AVERAGE(C13:C19)
03/01/15    2.75    28  =AVERAGE(B14:B20)   =AVERAGE(C14:C20)
04/01/15    0.4166  0   =AVERAGE(B15:B21)   =AVERAGE(C15:C21)
05/01/15    1.2833  0   =AVERAGE(B16:B22)   =AVERAGE(C16:C22)
06/01/15    0.3333  3   =AVERAGE(B17:B23)   =AVERAGE(C17:C23)
07/01/15    0   0   =AVERAGE(B18:B24)   =AVERAGE(C18:C24)
08/01/15    0   0   =AVERAGE(B19:B25)   =AVERAGE(C19:C25)
09/01/15    2.35    2   =AVERAGE(B20:B26)   =AVERAGE(C20:C26)
10/01/15    0.5666  0   =AVERAGE(B21:B27)   =AVERAGE(C21:C27)
11/01/15    0   0   =AVERAGE(B22:B28)   =AVERAGE(C22:C28)
12/01/15    1.6666  0   =AVERAGE(B23:B29)   =AVERAGE(C23:C29)
13/01/15    2.2666  5   =AVERAGE(B24:B30)   =AVERAGE(C24:C30)
14/01/15    2.5165  6   =AVERAGE(B25:B31)   =AVERAGE(C25:C31)
15/01/15    2.0166  0   =AVERAGE(B26:B32)   =AVERAGE(C26:C32)
16/01/15    2.9666  1   =AVERAGE(B27:B33)   =AVERAGE(C27:C33)
17/01/15    0.8333  0   =AVERAGE(B28:B34)   =AVERAGE(C28:C34)
18/01/15    0.6666  1   =AVERAGE(B29:B35)   =AVERAGE(C29:C35)
19/01/15    1.45    0   =AVERAGE(B30:B36)   =AVERAGE(C30:C36)
20/01/15    0.3166  0   =AVERAGE(B31:B37)   =AVERAGE(C31:C37)
21/01/15    0   0   =AVERAGE(B32:B38)   =AVERAGE(C32:C38)
22/01/15    0.2333  0   =AVERAGE(B33:B39)   =AVERAGE(C33:C39)
23/01/15    0.85    2   =AVERAGE(B34:B40)   =AVERAGE(C34:C40)
24/01/15    0   0   =AVERAGE(B35:B41)   =AVERAGE(C35:C41)
25/01/15    0   0   =AVERAGE(B36:B42)   =AVERAGE(C36:C42)
26/01/15    0.6666  4   =AVERAGE(B37:B43)   =AVERAGE(C37:C43)
27/01/15    0.8333  1   =AVERAGE(B38:B44)   =AVERAGE(C38:C44)
28/01/15    1.5498  5   =AVERAGE(B39:B45)   =AVERAGE(C39:C45)
29/01/15    6.4159  9   =AVERAGE(B40:B46)   =AVERAGE(C40:C46)
30/01/15    2.9166  0   =AVERAGE(B41:B47)   =AVERAGE(C41:C47)

5

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

Я использовал следующий R-код и пакет ggplot2 для создания этого первого графика. Ваши данные были загружены в данные объекта в приведенном ниже коде. График представляет собой сгруппированный столбчатый график с серыми столбцами, обозначающими еженедельные суммы страниц.

data <- rbind(data.frame(Date = c("17/11/2014", "18/11/2014", "19/11/2014", "20/11/2014"),
                         Total = rep(0, 4),
                         Pages = rep(0, 4)), 
              data,
              data.frame(Date = c("31/01/2015", "01/02/2015"),
                         Total = c(0, 0),
                         Pages = c(0, 0)))

n <- dim(data)[1]

data$Date <- as.Date(data$Date, format = "%d/%m/%Y")
data$weekday <- factor(rep(c("Monday", "Tuesday", "Wednesday", "Thursday",
                             "Friday", "Saturday", "Sunday"), length.out = n))
data$weekday <- factor(data$weekday, levels(data$weekday)[c(2,6,7,5,1,3,4)])
data$week <- factor(rep(seq(from = 0, to = ceiling(((n - 3)/7))), 
                        each = 7, length.out = n))

ggplot(data = data, aes(x = week, y = Pages)) + 
  geom_bar(aes(fill = weekday), stat = "identity", position = "dodge") + 
  labs(fill = NULL) + xlab(NULL) + ylab("Number of pages") + 
  geom_bar(stat = "identity", alpha = 0.2) + theme(panel.background = element_blank()) +
  scale_x_discrete(labels = paste("Week", seq(from = 0, to = 7)))

Высота серых столбцов указывает недельную сумму страниц.

Это явно не идеально. Серые столбики доминируют во многом, поскольку они по сравнению с дневным столбцом имеют большую площадь для того же объема чтения. Мы могли бы сделать их тоньше, но мне нравится, как они разграничивают недели. Они довольно точно указывают, какие дни на одной неделе - что-то, что не всегда понятно. Тем более, что у нас ноль.

На следующем графике я использовал среднее количество страниц (в течение недели) в качестве высоты серой полосы.

Высота серых полос указывает среднее значение недели.

Это, вероятно, представляет данные лучше. Однако обратите внимание, что недели 0 и 7 вводят в заблуждение, поскольку они не включают 7 дней. Вы можете легко обойти это.

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

Объединение времени и страниц в последовательном сюжете.

РЕДАКТИРОВАТЬ: Понимая, что цвета действительно не нужны так много и вдохновленный XAN (см. Комментарии ниже), вы могли бы упростить сюжет до чего-то вроде этого. Я пометил четверги, чтобы дать дополнительное визуальное руководство. Вы также можете поспорить в пользу использования одного и того же цвета для всех столбцов, чтобы не переоценивать некоторые (произвольные) дни.

Более простая версия.

В заключение отметим, что вы также можете попробовать по-разному масштабировать оси, поделив ваши значения на среднее значение. Это сделало бы 1 «нормальным» значением. Мы могли бы включить линию в 1, чтобы подчеркнуть эту точку - теперь это делается на графике спина к спине. Это отделяет «хорошие» от «плохих» дней с точки зрения средней рабочей нагрузки.

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

На этом графике мы также можем убедиться, что одна единица соответствует одному и тому же расстоянию на обеих осях, поскольку они сравнимы сейчас.

Также обратите внимание, что я перепутал дни в первой версии. Я исправил код и графики, и теперь я буду практиковать семь дней недели.

Код, который создал последний сюжет:

data$normPages <- data$Pages/mean(data$Pages)
data$normTotal <- data$Total/mean(data$Total)

data$weekNormPages <- data$Pages/(7*mean(data$Pages))
data$weekNormTotal <- data$Total/(7*mean(data$Total))

pTop <- ggplot(data = data, aes(x = week)) + geom_bar(aes(linetype = weekday, y = normPages), 
                                                      stat = "identity", position = "dodge", 
                                                      fill = "dodgerblue") + labs(fill = NULL) +
  xlab(NULL) + ylab("Number of pages") + geom_bar(aes(y = weekNormPages), stat = "identity", alpha = 0.3) + 
  theme(panel.background = element_blank(), axis.ticks.length=unit(0,"cm")) + guides(linetype = FALSE) +
  scale_x_discrete(labels = paste("Week", seq(from = 0, to = 7))) + ylab(NULL) + 
  annotate("text", label = "Pages read", x = "1", y = 10) +
  theme(plot.margin = unit(c(1,.5,.1,.8), "cm")) + geom_hline(yintercept = 1)
pTop

pBot <- ggplot(data = data, aes(x = week)) + geom_bar(aes(linetype = weekday, y = normTotal), 
                                                      stat = "identity", position = "dodge", fill = "dodgerblue") + 
  labs(fill = NULL) +
  xlab(NULL) + ylab("Number of hours") + geom_bar(aes(y = weekNormPages), stat = "identity", alpha = 0.3) + 
  theme(panel.background = element_blank(), axis.ticks.length=unit(0,"cm")) + guides(linetype = FALSE) + 
  scale_x_discrete(labels = NULL) + guides(fill = FALSE) + ylab(NULL) + scale_y_reverse() + 
  theme(plot.margin = unit(c(.1,.5,1,.8), "cm")) + 
  annotate("text", label = "Time spent", x = "1", y = 4) + geom_hline(yintercept = 1)
pBot

grid.arrange(pTop, pBot, heights = c(.5, .5), widths = c(0.5, 0.1))

Это кажется больше всего в духе улучшения оригинала, и мне нравится идея. Мне не нравятся произвольные / радужные цвета ни в оригинале, ни в вашем. Попробуйте последовательный набор цветов. Перевернутые бары тоже не работают для меня.
Xan

Я думаю, что последовательные цвета могут быть улучшением - спасибо за предложение. С другой стороны, я не думаю, что цвета так важны, так как у нас есть еженедельные разделители, которыми мы будем руководствоваться (первый день понедельника, второй вторник и т. Д.). Мы договорились о взаимном заговоре, как я и намекнул в своем ответе. Улучшение на этом графике может заключаться в масштабировании обеих вертикальных осей в соответствии с их ежедневными средними значениями. Это упростит сравнение недель и прочитанных страниц / времени.
swmo

Теперь, когда упомянуто, что цвета не важны, мне приходит в голову, что удаление изменения цвета может работать. Дни недели уже различаются по местоположению. Или, может быть, просто сделать среду другим оттенком в качестве дополнительного якоря.
Xan

Очень хорошо! Я еще не изучил другие ответы, но это, безусловно, уже большое улучшение! Большое спасибо

1
Я отредактировал ответ, чтобы включить идеи из комментариев. @ Принимая вызов, я рад, что вы нашли его полезным.
swmo

1

ИксY

  1. построить данные в виде строк с двумя неделями в качестве переменных группировки - чтобы получить две отдельные строки для каждой недели,
  2. или используйте сгруппированные столбчатые графики, где для каждого дня недели у вас есть два столбца для недели 1 и недели 2, каждый с количеством страниц / часов в день.

Пожалуйста, посмотрите, что 1. делает выше, а 2., к сожалению, не кажется очень значимым. Спасибо за ваш ответ.

Я не вижу проблем с этим ... Это не выглядит красиво, но это вопрос программного обеспечения, которое вы используете, и / или графического редактирования.
Тим

1. Вы не можете точно сказать, проходит ли 1 или 2 неделя лучше, и если добавить еще несколько недель, это станет слишком хаотичным. 2. Я на самом деле не против этого, на самом деле это довольно мило. Может быть, я мог бы поставить оригинал и этот вместе, чтобы сделать его более понятным. (Также показано выше сейчас)

1

На графике ниже показаны суммарные часы обучения и общее количество страниц в течение каждой недели с использованием линий вместо столбцов, которые, как мы надеемся, облегчат просмотр тренда в течение каждой недели и сравнение между неделями. Я заполнил пропущенные недели нулями, но вы можете исключить их, если хотите. RКод для генерации и обработки данных участка размещена под графиком.

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

Выполняя приведенные ниже шаги, я сначала загрузил данные, опубликованные в вопросе, во фрейм данных с именем dat.

library(lubridate)
library(dplyr)
library(reshape2)
library(ggplot2)
library(scales)

# Ordered vector of weekdays
weekdayVec = c("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

# Change column name
names(dat)[2] = "Hours of Study"

# Convert Date to date format
dat$Date = as.Date(dmy(dat$Date))

# Add a weekday variable and order from Sunday to Saturday
dat$Day = weekdays(dat$Date)
dat$Day = factor(dat$Day, levels=weekdayVec)

# Number the weeks from 1 to 11 and convert to a factor
dat$Week = paste("Week", (as.numeric(dat$Date) - as.numeric(dat$Date[3])) %/% 7 + 2)
dat$Week = factor(dat$Week, levels=paste("Week", c(1:11))) 

## Fill in empty dates (so we can show zero pages/hours during weeks 5 and 6 if we want)
dataFill = expand.grid(Week = paste("Week",1:11), Day=weekdayVec)
dat = merge(dataFill, dat, by=c("Week","Day"), all=TRUE)

# Fill in missing dates
dat$Date = as.Date(c(rep(NA,5), seq(as.Date("2014-11-21"),as.Date("2015-01-30"),1), NA))

# Convert missing data to zeros for Hours of Study and Total Pages
dat = dat %>% mutate(`Hours of Study` = ifelse(is.na(`Hours of Study`), 0, `Hours of Study`),
               `Total Pages` = ifelse(is.na(`Total Pages`), 0, `Total Pages`)) 

# Melt data into long format (for facetting in ggplot2)
dat.m = dat %>% melt(id.var=1:3) %>%
  group_by(Week, variable) %>%
  mutate(cumValue = cumsum(value))

# Plot Hours and Pages by date, with separate cumulative 
# curves for each week
ggplot(dat.m %>% group_by(Week, variable) %>% arrange(Week, Day), 
       aes(Date, cumValue, colour=Week, group=Week)) +
  geom_vline(xintercept=as.numeric(seq(as.Date("2014-11-16"), as.Date("2015-02-06"), 7)-0.5), colour="grey70") +
  geom_line(position=position_dodge(width=0.5)) +
  geom_point(size=2.5, position=position_dodge(width=0.5)) +
  facet_grid(variable ~ ., scales="free_y") +
  guides(colour=guide_legend(reverse=TRUE)) + labs(y="",x="") +
  guides(colour=FALSE) +
  scale_x_date(limits=c(as.Date("2014-11-16"),as.Date("2015-01-31")),
               breaks=seq(as.Date("2014-11-16"),as.Date("2015-01-31"), 7)-0.5,
               labels=paste("                  Week",1:11)) +
  theme_grey(base_size=15)

Это действительно хорошая идея и определенно решает проблему того, что трудно определить, какой день вы смотрите. Спасибо

0

Другим вариантом является пузырьковая диаграмма, где вы можете иметь вертикальную высоту для одной переменной и размер точки для другой. Ниже дата (день) горизонтальна, количество изученных часов вертикальное, количество страниц, покрываемых за день, имеет размер пузырьков, а неделя - цветная.

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


0

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

На самом деле было бы очень интересно попробовать, чтобы каждая левая-правая и восходящая-нижняя линия сетки (как показано под этим углом) соответствовала одному и тому же дню недели (например, понедельнику), а затем размещала коробочные диаграммы на нижней и задней правой стенках внутри линии сетки. Графики будут соответствовать общему количеству часов и страниц за каждую неделю соответственно. Я почти уверен, что это было бы возможно сделать с RGL, но потребует некоторого возиться. Это может стоить того. Сюжеты для скрипки или бобовые могут быть еще лучше.

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

Данные (для ввода в R):

dat<-structure(list(Date = structure(c(17L, 19L, 21L, 23L, 25L, 27L, 
29L, 31L, 33L, 38L, 2L, 14L, 36L, 42L, 44L, 46L, 48L, 34L, 39L, 
40L, 1L, 13L, 35L, 41L, 43L, 45L, 47L, 49L, 50L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 15L, 16L, 18L, 20L, 22L, 24L, 
26L, 28L, 30L, 32L, 37L), .Label = c("1/1/2015", "1/12/2014", 
"10/1/2015", "11/1/2015", "12/1/2015", "13/01/2015", "14/01/2015", 
"15/01/2015", "16/01/2015", "17/01/2015", "18/01/2015", "19/01/2015", 
"2/1/2015", "2/12/2014", "20/01/2015", "21/01/2015", "21/11/2014", 
"22/01/2015", "22/11/2014", "23/01/2015", "23/11/2014", "24/01/2015", 
"24/11/2014", "25/01/2015", "25/11/2014", "26/01/2015", "26/11/2014", 
"27/01/2015", "27/11/2014", "28/01/2015", "28/11/2014", "29/01/2015", 
"29/11/2014", "29/12/2014", "3/1/2015", "3/12/2014", "30/01/2015", 
"30/11/2014", "30/12/2014", "31/12/2014", "4/1/2015", "4/12/2014", 
"5/1/2015", "5/12/2014", "6/1/2015", "6/12/2014", "7/1/2015", 
"7/12/2014", "8/1/2015", "9/1/2015"), class = "factor"), TotalHours = c(2.4166, 
0, 1.5833, 3.0166, 2.4999, 1.4833, 3.0499, 0, 2.4499, 2.8833, 
0, 4.1166, 1.3333, 1.2499, 1.6666, 0, 2.4833, 0, 1.2332, 0.3333, 
3.5666, 0.8166, 2.75, 0.4166, 1.2833, 0.3333, 0, 0, 2.35, 0.5666, 
0, 1.6666, 2.2666, 2.5165, 2.0166, 2.9666, 0.8333, 0.6666, 1.45, 
0.3166, 0, 0.2333, 0.85, 0, 0, 0.6666, 0.8333, 1.5498, 6.4159, 
2.9166), TotalPages = c(0L, 0L, 4L, 13L, 6L, 3L, 6L, 0L, 5L, 
2L, 0L, 8L, 5L, 3L, 8L, 0L, 9L, 0L, 1L, 0L, 2L, 0L, 28L, 0L, 
0L, 3L, 0L, 0L, 2L, 0L, 0L, 0L, 5L, 6L, 0L, 1L, 0L, 1L, 0L, 0L, 
0L, 0L, 2L, 0L, 0L, 4L, 1L, 5L, 9L, 0L)), .Names = c("Date", 
"TotalHours", "TotalPages"), class = "data.frame", row.names = c(NA, 
-50L))

Сделайте сюжет:

#Get Day of Week
dat<-cbind(weekdays(as.Date(dat[,1], format="%d/%m/%Y")),dat)
colnames(dat)[1]<-"DoW"

#3D Plot
require(rgl)
plot3d(dat[,2],dat[,3],dat[,4],size=15, 
xlab=colnames(dat)[2], ylab=colnames(dat)[3],
zlab=colnames(dat)[4],col=rainbow(7)[as.numeric(dat[,1])])
text3d(x=10, y=6, z=seq(25,15,length=7),levels(dat[,1]),
col=rainbow(7), font=2)
grid3d(side=c("x", "y+", "z"), lwd=1)

-1

Может быть полезна следующая тепловая карта с номером недели (года), днем ​​недели и фасетами для часов и страниц:

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

Удаление 2 высоких значений дает лучшие цветовые градиенты на графике:

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

Следующее представление может также быть полезным.

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

Это ясно показывает 2-недельный период, когда не было сделано никакой работы.

График с линиями также может быть полезен (линии не загромождены; точки также могут быть удалены, сохраняя только две линии)

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

Они четко передают информацию, упрощая сюжет для легкого понимания.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.