Wyświetlanie trzech informacji na wykresie

15

Uwaga: dołączono teraz 50 punktów surowych danych.

Chcę wyświetlić, ile badań wykonałem i ile stron ukończyłem w ciągu tygodnia, w podziale na dni, i zrobiłem to, jak pokazano poniżej:wprowadź opis zdjęcia tutaj

Ludzie mówili mi, że nie mogą zrozumieć wykresów, ale nie mam pojęcia, jak inaczej mogę je wyświetlić. Ponieważ zasadniczo potrzebowałbym trzech wymiarów bez skumulowanego przedstawienia. Chcę uniknąć używania wielu wykresów liniowych, ponieważ po kilku tygodniach wykresy staną się nieczytelne. Czy nic nie mogę zrobić?

Jak mogę wyświetlić je wyraźniej?

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
gung - Przywróć Monikę
źródło
Jeśli możesz opublikować przykładowe dane, zainteresowani mogą zagrać i pokazać Ci swoje rozwiązania. Aby był realistyczny, potrzebowałby kilku tygodni, ponieważ istotą problemu jest to, co dzieje się wraz ze wzrostem liczby tygodni.
Nick Cox,
@NickCox Mógłbym ponownie opublikować w ciągu kilku tygodni, ponieważ jestem szczerze niepewny, jak dane się zmienią i do tej pory przeżyłem tylko pierwsze 13 dni (z czego 3 bez badań)
@NickCox Jak opublikować nieprzetworzone dane?
1
Moja rada to trochę poczekać. Aktualizując pytanie, zwróciłeś na to uwagę. Sprawdź, czy otrzymasz nowe odpowiedzi.
Nick Cox
1
Co chcesz wyświetlić na temat tych danych? Jaką historię chcesz opowiedzieć? Co próbujesz zachęcić ludzi do zrozumienia twoich danych bez wykresów słupkowych?
Gung - Przywróć Monikę

Odpowiedzi:

7

Jednym ze sposobów wizualizacji danych opartych na dacie / kalendarzu jest wyświetlanie matrycowe, które koduje dane kolorem. Macierz (lub tabela) jest ułożona tak, że wiersze reprezentują tygodnie, a kolumna dni. Jeśli jest to pożądane, możesz dodać ostatnią kolumnę do sumy tygodniowej.

Można to nieco zaimplementować w programie Excel z formatowaniem warunkowym, jeśli dane są poprawnie ułożone. W szczególności możesz zbudować „siatkę” wartości za pomocą formuł, które sprawdzają twoje oryginalne dane. Stamtąd możesz użyć formatowania warunkowego, aby wyświetlić wynik.

Oto, jak może wyglądać wynik. Przepraszamy, zmieniłem format daty. Preparat w komórce H1: "=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)". Robi trochę matematyki, aby uzyskać dni we właściwej kolejności. Mam nadzieję, że jest to proste.

Obraz formatowania warunkowego z układem macierzy

Jeśli naprawdę chcesz przesunąć kopertę, możesz użyć frameworka takiego jak d3 i jego wtyczki kalendarza, aby wyświetlić te dane. To może być bardziej przedsięwzięcie, niż jest warte.

Ten format jest bardzo podobny do tego, jak GitHub wyświetla aktywność / wkład użytkowników w czasie. Oto jeden użytkownik (nie ja!). wprowadź opis zdjęcia tutaj

Byron Wall
źródło
2
(+1) Podoba mi się to podejście, szczególnie dlatego, że dobrze nadaje się do stosowania w tym samym arkuszu kalkulacyjnym, w którym wprowadzane są dane. Ten wyświetlacz graficzny jest w rzeczywistości mapą ciepła . Sam regularnie używam podobnych ustawień i uważam, że jedną słabością jest to, że aspekty trendów mogą być trudne do wybrania, więc dobrze jest uzupełnić to pewnym wariantem wykresu liniowego, aby pokazać bardziej szczegółowe szczegóły (Peter Flom, Nick Cox i wszystkie mam dobre sugestie).
Silverfish,
6

Główną cechą oryginału są cotygodniowe sumy. Poszczególne wartości są znaczące dopiero po nauce kolorów i wydaje mi się, że to duży powód, dla którego fabuła nie działa dla nowych widzów. W związku z tym utracono aspekt czasowy dni. Sekwencyjny zestaw kolorów może pomóc (np 7 odcieniach niebieskiego).

Zazwyczaj nie dbam o to, aby oznaczyć każdy przedmiot - czy dokładne wartości są tak ważne? Wykres nie spełnia swojej roli, jeśli nie można go zinterpretować bez każdej wartości oznaczonej.

Do mojej próby . Biorąc pod uwagę pozorne znaczenie tygodniowych kwot, zaplanowałem tygodniowe sumy zbiorcze. Pokazuje tygodniowe kwoty i kolejność dni. Dokładne wartości dnia są mniej jasne, ale wartości odstające nadal będą się wyróżniać.

W przypadku tego rodzaju małych wykresów liniowych (które można zmniejszyć do wielkości wykresu przebiegu w czasie ) pomocne jest posiadanie linii odniesienia lub obszaru. Dla ilustracji dodałem zakres docelowy. Jeśli cel nie jest odpowiedni, referencja może być czymś w rodzaju zakresu z ostatnich trzech tygodni lub jakąś stałą wartością referencyjną.

wprowadź opis zdjęcia tutaj

Użyłem czerwonego, aby wskazać, które tygodnie były poniżej celu do szybkiego skanowania.

Mając o wiele więcej tygodni, możesz uporządkować je w siatkę zamiast w pionową listę.

wprowadź opis zdjęcia tutaj

Xan
źródło
Myślę, że to jest doskonałe. Czy istnieje skuteczny sposób na połączenie godzin nauki i stron objętych informacjami, które (przynajmniej mam wrażenie) wydają się być jednym z kluczowych celów ćwiczenia? Podejrzewam, że na pierwszej grafice byłoby dość efektywne, aby „godziny nauki” i „ukończone strony” były ustawione obok siebie (tzn. Godziny nauki zostały narysowane w kolumnie po lewej stronie tygodnia, a strony uzupełnione w kolumnie po prawej stronie tygodnia ). Ale nie jestem pewien, co zadziałałoby na drugiej grafice.
Silverfish
Oczywiście jednym z rozwiązań byłoby nadpisanie obu serii drugorzędną osią pionową dla badanych stron, ale wiele osób ma na to zdecydowane zdanie, np. Hadley Wickham celowo odmawia wdrożenia go w ggplot. Zasadniczo bym tego nie robił, ale może mieć sens, jeśli istnieją cele dla obu - wprowadziłoby to naturalną skalę dla dodatkowej osi y, aby zapewnić wyrównanie obszarów docelowych na godziny i strony. Ta decyzja o skalowaniu jest ogólnie kontrowersyjną kwestią dotyczącą wielu osi Y.
Silverfish
Dzięki @Silverfish! Jestem również przeciwny dwóm skalom na jednym wykresie, ale jak mówisz, jeśli obie można umieścić w tej samej skali w stosunku do ich odpowiednich celów, może to działać. Powinienem wyraźnie powiedzieć w mojej odpowiedzi, że pokazując tylko jedną miarę, zakładam, że druga miara zostanie pokazana w ten sam sposób, ale na osobnych wykresach. W formie listy pionowej każda miara może być osobną kolumną wykresów.
xan
To kolejna świetna odpowiedź. Zdecydowanie podoba mi się zastosowany pomysł docelowy. Będę musiał zobaczyć, co robię teraz, po przejrzeniu wszystkich odpowiedzi. Dziękuję
5

Jeśli dobrze cię rozumiem, powodem, dla którego nie chcesz używać wykresów liniowych, jest to, że masz zbyt wiele tygodni, a wykresy byłyby nieporządne.

Jeśli to jest problem, możesz podzielić szeregi czasowe na komponenty:

Codzienna zmiana

Zmiana tygodniowa

Trend długoterminowy

Coś jeszcze.

William S. Cleveland pokazuje ładny przykład tego w jednej ze swoich książek (nie ma mnie w biurze i nie pamiętam, która z jego książek ma ten przykład, ale jest to albo wizualizacja danych, albo elementy wykresów danych ).

Zarówno R, jak i SAS mają do tego narzędzia. Czy masz dostęp do któregokolwiek z nich?

Peter Flom - Przywróć Monikę
źródło
Mam R na swoim komputerze, ale rzadko go używam (chociaż jestem w pełni chętny do nauki)
Cóż, ma krzywą uczenia się, ale spójrz na funkcję dekompozycji (). Być może będziesz musiał zagrać, aby uzyskać to, czego chcesz. Ponadto, jeśli możesz znaleźć książki Clevelanda, są wybitne.
Peter Flom - Przywróć Monikę
3
Oto przykład z Cleveland, o którym wspominał Peter, z dokumentów R. Jeśli masz zainstalowany R, możesz uruchomić przykład: stat.ethz.ch/R-manual/R-devel/library/stats/html/stl.html
Kieran
@Kieran Prawidłowe wyjście? imgur.com/IzRC0h8
5

Najpierw przedstawię kilka zastrzeżeń do oryginalnych ułożonych lub podzielonych wykresów słupkowych.

za. Kodowanie kolorami wydaje się całkowicie dowolne. Dlatego wykresu nie można badać bez ciągłego przechodzenia między legendą a wykresem.

b. Zera są niejawne, jako niewidoczne segmenty słupków. Zera są częścią tej odmiany.

Z tych i innych powodów wykresy są trudne do odkodowania.

To powiedziawszy, wykres ma tę zaletę, jeśli zainteresowanie polega głównie na badaniu zmienności sum z tygodnia na tydzień. Wiele tygodni można wykreślić jako tyle pasków. Odpowiednim minusem jest to, że coraz trudniej byłoby badać warianty w ciągu tygodni.

Tworzenie kopii zapasowej: W każdym problemie są trzy zmienne.

  1. Czas studiowany lub strony kompletne.

  2. Dzień tygodnia.

  3. Numer tygodnia

Wraz ze wzrostem liczby tygodni każdy wykres będzie stawał się bardziej szczegółowy. Wyzwanie polega na kontrolowaniu tych szczegółów.

Rozważyłbym wykres cyklu (inne nazwy zostały użyte w literaturze, ale większość odnosi się do jego zastosowania do analizy zmian sezonowych). Naomi Robbins ma tutaj wyraźne wprowadzenie. Jej przykłady obejmują takie jak twoje, w których zainteresowanie jest zróżnicowane w ciągu tygodni i między nimi.

Nick Cox
źródło
Dziękuję za ten bardzo fajny link. Jeden komentarz do twojego sprzeciwu, dni są tak naprawdę ułożone od (od dołu do góry) piątek-> czwartek, ale brak kilku dni jest zdecydowanie ważnym problemem pod względem czytelności.
Rzeczywiście, ale ludzie nadal muszą używać legendy do dekodowania.
Nick Cox,
R ma komendę monthplot, która może być faktycznie używana na cotygodniowych danych - patrz stackoverflow.com/questions/5826703/…
Silverfish
5

Wykresy liniowe byłyby prawdopodobnie łatwiejsze do zinterpretowania, gdybyś wziął zmienną średnią z siedmiu, 14 lub 14 dni. To by je wygładziło i nadal pozwoliło dostrzec trendy.

Jest to pewne podobieństwo do rozwiązania Petera Floma, choć jest raczej prostsze i dlatego nie przedstawia tak pełnego obrazu - ale może być wystarczające dla twoich potrzeb. Jeśli rejestrujesz swoje dane w arkuszu kalkulacyjnym, zaletą jest to, że takie uśrednianie można łatwo przeprowadzić w samym arkuszu kalkulacyjnym, konfigurując niektóre formuły, a wykres będzie aktualizowany automatycznie po wypełnieniu nowych danych.

Zaktualizuj, aby uwzględnić wykresy

Wykresy liniowe średnich ruchomych

Wykres arkusza kalkulacyjnego dla siedmiodniowych średnich kroczących jest nieefektywny, ale wydaje się, że dobrze sobie radzi - codzienne zmiany są wygładzane, dzięki czemu trendy są łatwiejsze do wykrycia (w porównaniu z równoważnym dziennym wykresem, który jest tak głośny, że jest niezrozumiały). Fabuła dobrze zaznacza niektóre kluczowe cechy: na przykład duża ilość pracy została wykonana w połowie stycznia, w ujęciu godzinnym, ale nie towarzyszył temu proporcjonalny wzrost średniej liczby ukończonych stron dziennie. Przerwa świąteczna jest bardzo widoczna i tak długo, jak poszczególne punkty danych są wyraźnie wykreślone, nie jest to zbyt mylące (gdyby tylko widoczna była linia, nie byłoby możliwe ustalenie, że okres płaski był spowodowany brakiem danych!). Niemniej jednak zdecydowanie zalecam włączenie1.5

Przy zaledwie pięćdziesięciu danych nie warto próbować uśredniać w dłuższym okresie czasu, aby wykryć trendy długookresowe. Podobnie podejrzewam, że doskonały pomysł Petera Floma na sezonowy rozkład miałby problemy z tak ograniczonymi danymi. Jeśli rozkład miałby zostać przeprowadzony w arkuszu kalkulacyjnym, jeszcze ważniejsze byłoby uwzględnienie podziału jako danych zerowych.

Aby odtworzyć moje formuły, wklej to, aby „Data” była w komórce 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)
Silverfish
źródło
5

Jak rozumiem twoje pytanie, możliwe byłoby wyświetlanie godzin i stron osobno. Zrobię to pierwszy. Następnie wyświetlę Suma i Strony na jednym wykresie. Domyślam się, że rzeczywiste liczby nie są najważniejsze - ważniejsze jest, aby uzyskać przegląd tygodni i dni tygodnia, które były produktywne, a które nie. W takim przypadku sugeruję, abyś zachował naturalną strukturę czasową, ponieważ w rzeczywistości istnieje tylko jeden wymiar czasowy w twoich danych. Nadal możemy znaleźć sposób na wyznaczenie tygodni.

Użyłem następującego kodu R i pakietu ggplot2, aby stworzyć ten pierwszy wykres. Twoje dane zostały załadowane do danych obiektowych w poniższym kodzie. Wykres to zgrupowany wykres słupkowy z szarymi słupkami wskazującymi tygodniowe sumy stron.

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)))

Wysokość szarych słupków wskazuje sumę tygodni stron.

To oczywiście nie jest idealne. Szare słupki dominują do tego stopnia, że ​​w porównaniu do paska dziennego mają większą powierzchnię dla tej samej ilości odczytów. Możemy sprawić, że będą cieńsze, ale podoba mi się sposób, w jaki wyznaczają tygodnie. Wskazują całkiem ładnie, które dni są w tym samym tygodniu - inaczej niekoniecznie byłoby to zrozumiałe. Zwłaszcza, że ​​mamy zero.

Na następnym wykresie wykorzystałem średnią liczbę stron (w ciągu tygodnia) jako wysokość szarego paska.

Wysokość szarych słupków wskazuje średnią tygodniową liczbę stron.

To prawdopodobnie lepiej reprezentuje dane. Zauważ jednak, że tydzień 0 i 7 wprowadzają w błąd, ponieważ nie obejmowały 7 dni. Możesz łatwo obejść ten problem.

Jeśli nalegasz na jednoczesne wyświetlanie stron i czasu, możesz wykonać wykres słupkowy jeden za drugim. Może to być trochę mylące, ponieważ dwie pionowe skale nie są takie same. Z drugiej strony fajnie byłoby porównać czas spędzony i pracę wykonaną bezpośrednio w ten sposób.

Łączenie czasu i stron w fabułę.

EDYCJA: Zdając sobie sprawę, że kolory naprawdę nie są tak bardzo potrzebne i zainspirowany Xanem (patrz poniżej komentarze), możesz uprościć fabułę do czegoś takiego. Zaznaczyłem Czwarty, aby dać dodatkowy wizualny przewodnik. Możesz również argumentować za użyciem tego samego koloru dla wszystkich pasków, aby nie przeceniać niektórych (dowolnych) dni.

Prostsza wersja.

Na koniec możesz również spróbować skalować osie inaczej, dzieląc swoje wartości przez wartość średnią. To sprawiłoby, że 1 byłaby „normalną” wartością. Możemy podkreślić linię na 1, aby podkreślić ten punkt - teraz zrobione na fabule od tyłu do tyłu. Oddziela to „dobre” od „złych” dni pod względem średniego obciążenia pracą.

wprowadź opis zdjęcia tutaj

Na tym wykresie możemy również upewnić się, że jedna jednostka odpowiada tej samej odległości na obu osiach, ponieważ są one teraz porównywalne.

Pamiętaj też, że pomieszałem dni w pierwszej wersji. Poprawiłem kod i wykresy i zacznę ćwiczyć teraz przez siedem dni w tygodniu.

Kod, który wytworzył ostatni wykres:

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))
swmo
źródło
Wydaje się to najbardziej w duchu ulepszania oryginału i podoba mi się ten pomysł. Nie podobają mi się jednak kolory arbitralne / tęczowe ani w oryginale, ani w twoim. Wypróbuj sekwencyjny zestaw kolorów. Bary dla mnie też nie działają.
xan
Myślę, że kolejne kolory mogą być ulepszeniem - dziękuję za sugestię. Z drugiej strony nie sądzę, aby kolory były tak ważne, ponieważ mamy do dyspozycji cotygodniowe ograniczniki (pierwszy poniedziałek pierwszego dnia, drugi wtorek itd.). Zgadzamy się co do fabuły, jak również wskazałem w mojej odpowiedzi. Ulepszeniem tego wykresu może być skalowanie obu osi pionowych zgodnie z ich odpowiednimi średnimi środkami dziennymi. Ułatwi to porównywanie tygodni z czytaniem stron / spędzanie czasu.
swmo
Teraz, gdy wzmianka o kolorach jest nieistotna, przychodzi mi do głowy, że usunięcie wariacji kolorów może działać. Dni tygodnia są już rozróżniane według lokalizacji. A może po prostu uczynisz środę innym odcieniem jako dodatkową kotwicę.
xan
Bardzo dobrze! Nie znałem jeszcze innych odpowiedzi, ale z pewnością jest to już duża poprawa! Dziękuję bardzo
1
Zredagowałem odpowiedź, aby uwzględnić pomysły z komentarzy. @Przyjęcie wyzwania, cieszę się, że okaże się pomocne.
swmo
1

xy

  1. wykreśl dane jako linie z dwoma tygodniami jako zmienne grupujące - aby uzyskać dwie osobne linie dla każdego tygodnia,
  2. lub użyj zgrupowanych wykresów słupkowych, w których dla każdego dnia tygodnia masz dwa słupki dla tygodnia 1 i tygodnia 2, każdy z liczbą stron / godzin dziennie.
Tim
źródło
Zobacz, co 1. robi powyżej, i 2. nie wydaje się niestety bardzo znaczący. Dziękuję za Twoją odpowiedź.
Nie widzę z tym problemu ... Nie wygląda ładnie, ale jest to kwestia używanego oprogramowania i / lub edycji graficznej.
Tim
1. Naprawdę nie wiadomo, czy Tydzień 1 czy 2 idzie lepiej, a jeśli doda się jeszcze kilka tygodni, byłoby to zbyt chaotyczne. 2. Właściwie to mi to nie przeszkadza, jest całkiem fajne. Może mógłbym złożyć oryginał i ten, żeby było jaśniej. (Pokazano również teraz powyżej)
1

Poniższy wykres pokazuje skumulowane godziny nauki i łączną liczbę stron w ciągu każdego tygodnia przy użyciu linii zamiast ułożonych słupków, co, miejmy nadzieję, ułatwi obserwowanie trendu w każdym tygodniu i porównywanie tygodni. Wypełniłem brakujące tygodnie zerami, ale możesz je wykluczyć, jeśli chcesz. RKod do generowania i przetwarzania danych działki jest zamieszczona poniżej wykresu.

wprowadź opis zdjęcia tutaj

Wykonując poniższe kroki, najpierw załadowałem dane opublikowane w pytaniu do ramki danych o nazwie 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)
eipi10
źródło
To naprawdę dobry pomysł i zdecydowanie rozwiązuje problem polegający na tym, że trudno jest określić, na który dzień patrzysz. Dziękuję
0

Inną opcją jest wykres bąbelkowy, w którym możesz mieć wysokość pionową dla jednej zmiennej i rozmiar kropki dla drugiej. Poniżej data (dzień) jest pozioma, Przebadane godziny są pionowe, Strony pokryte dziennie mają rozmiar bąbelków, a tydzień jest kolorowy.

wprowadź opis zdjęcia tutaj

Avraham
źródło
0

Możesz wykreślić w 3d. Nie sprawdziłem, czy dzień tygodnia został poprawnie obliczony, nie znalazłem najlepszego kąta widzenia itp., Ale to powinno dać ci pomysł. Możliwe są również dalsze ozdoby. Na przykład może być lepiej połączyć punkty linią i przesunąć linie siatki, aby odpowiadały każdemu poniedziałkowi.

W rzeczywistości to, co byłoby bardzo interesujące, aby spróbować, to aby każda linia lewej i prawej i góry do dołu (jak pokazano pod tym kątem) odpowiadała temu samemu dniu tygodnia (np. Poniedziałek), a następnie umieszczenie wykresów pudełkowych na dolnej i tylnej prawej ścianie w obrębie linie siatki. Wykresy odpowiadałyby odpowiednio całkowitej liczbie godzin i łącznej liczbie stron w każdym tygodniu. Jestem prawie pewien, że byłoby to możliwe z rgl, ale wymagałoby to trochę majsterkowania. Może być tego warte. Wykresy skrzypcowe lub fasolowe mogą być jeszcze lepsze.

wprowadź opis zdjęcia tutaj

Dane (do wprowadzenia do 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))

Zrób fabułę:

#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)
Wściekły
źródło
-1

Pomocna może być mapa termiczna z numerem tygodnia (roku), dniem tygodnia i aspektami godzin i stron:

wprowadź opis zdjęcia tutaj

Usunięcie 2 wysokich wartości daje lepsze gradienty kolorów na wydruku:

wprowadź opis zdjęcia tutaj

Pomocne może być również przestrzeganie wykresu słupkowego.

wprowadź opis zdjęcia tutaj

Wyraźnie pokazuje 2 tygodnie, kiedy nie wykonano żadnej pracy.

Przydatny może być również wykres z liniami (linie nie są zagracone; punkty można również usunąć, zachowując tylko dwie linie)

wprowadź opis zdjęcia tutaj

Wyraźnie przekazują informacje, jednocześnie upraszczając fabułę dla łatwego zrozumienia.

rnso
źródło