Anzeige von drei Informationen in einem Diagramm

15

Hinweis: Es werden jetzt 50 Rohdatenpunkte angehängt.

Ich möchte anzeigen, wie viel und wie viele Seiten ich im Laufe der Woche nach Tagen aufgeteilt und wie unten gezeigt absolviert habe:Bildbeschreibung hier eingeben

Die Leute haben mir gesagt, dass sie die Grafiken nicht verstehen können, aber ich habe keine Ahnung, wie ich sie sonst anzeigen kann. Da würde ich im wesentlichen drei Dimensionen benötigen, ohne eine kumulative Darstellung vorzunehmen. Ich möchte die Verwendung zahlreicher Liniendiagramme vermeiden, da die Diagramme nach einigen Wochen unleserlich werden. Kann ich nichts tun?

Wie kann ich diese deutlicher darstellen?

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 - Wiedereinsetzung von Monica
quelle
Wenn Sie Beispieldaten posten können, können die Interessenten ihre Lösungen abspielen und anzeigen. Um realistisch zu sein, würde es mehrere Wochen dauern, da das Wesentliche des Problems darin besteht, was passiert, wenn die Anzahl der Wochen zunimmt.
Nick Cox
@NickCox Ich könnte in ein paar Wochen neu posten, da ich ehrlich gesagt nicht sicher bin, wie sich die Daten ändern werden und ich nur die ersten 13 Tage davon bis jetzt
@NickCox Wie poste ich die Rohdaten?
1
Mein Rat ist, etwas zu warten. Durch die Aktualisierung der Frage haben Sie darauf aufmerksam gemacht. Überprüfen Sie, ob Sie neue Antworten erhalten.
Nick Cox
1
Was möchten Sie über diese Daten anzeigen ? Welche Geschichte möchtest du erzählen? Was versuchen Sie, um die Menschen über Ihre Daten mit den Balkendiagrammen zu verstehen?
gung - Wiedereinsetzung von Monica

Antworten:

7

Eine Möglichkeit, Daten auf Datums- / Kalenderbasis darzustellen, besteht in einer Matrixanzeige, die die Daten mit Farbe codiert. Die Matrix (oder Tabelle) ist so angeordnet, dass Zeilen Wochen und Spalten Tage darstellen. Sie können eine letzte Spalte für die wöchentliche Gesamtsumme hinzufügen, wenn dies gewünscht wird.

Dies kann in Excel mit bedingter Formatierung etwas einfach implementiert werden, wenn die Daten korrekt angeordnet sind. Insbesondere können Sie ein "Gitter" von Werten mit Formeln erstellen, die in Ihre ursprünglichen Daten schauen. Von dort aus können Sie die bedingte Formatierung verwenden, um das Ergebnis anzuzeigen.

So könnte das Ergebnis aussehen. Entschuldigung, ich habe das Datumsformat geändert. Die Formel in Zelle H1 ist: "=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)". Es ist ein bisschen Mathe, um die Tage in die richtige Reihenfolge zu bringen. Hoffentlich ist es einfach.

Bild der bedingten Formatierung mit Matrixanordnung

Wenn Sie wirklich den Umschlag verschieben möchten, können Sie ein Framework wie d3 und sein Kalender- Plugin verwenden, um diese Daten anzuzeigen. Das ist vielleicht mehr ein Unterfangen, als es sich lohnt.

Dieses Format ähnelt stark der Art und Weise, wie GitHub Benutzeraktivitäten / -beiträge im Zeitverlauf anzeigt. Hier ist ein Benutzer (nicht ich!). Bildbeschreibung hier eingeben

Byron Wall
quelle
2
(+1) Ich mag diesen Ansatz, insbesondere, weil er sich gut für die Verwendung in derselben Tabelle eignet, in der die Daten eingegeben werden. Diese grafische Anzeige ist praktisch eine Wärmekarte . Ich selbst verwende regelmäßig ähnliche Konfigurationen, und eine Schwäche ist, dass bestimmte Aspekte von Trends nur schwer erkennbar sind. Daher kann es sinnvoll sein, diese mit einer Variante des Liniendiagramms zu ergänzen, um feinere Details zu zeigen (Peter Flom, Nick Cox) und ich habe alle gute Vorschläge gemacht).
Silverfish
6

Das herausragende Merkmal des Originals sind die wöchentlichen Summen. Die einzelnen Werte sind erst dann von Bedeutung, wenn Sie die Farben gelernt haben, und ich stelle mir vor, dass dies ein wichtiger Grund dafür ist, dass die Darstellung für neue Betrachter nicht funktioniert. Damit geht der Zeitaspekt der Tage verloren. Eine fortlaufende Reihe von Farben kann hilfreich sein (z. B. 7 Blautöne).

Normalerweise ist es mir nicht wichtig, jeden Artikel zu kennzeichnen - sind die genauen Werte von Bedeutung? Das Diagramm funktioniert nicht, wenn Sie es nicht ohne jeden beschrifteten Wert interpretieren können.

Auf zu meinem Versuch . Angesichts der offensichtlichen Bedeutung der wöchentlichen Summen habe ich die wöchentlichen kumulativen Summen aufgezeichnet. Es zeigt die wöchentlichen Summen und die Tage in zeitlicher Reihenfolge. Genaue Tageswerte sind weniger klar, Ausreißerwerte werden jedoch weiterhin hervorgehoben.

Für diese Art von kleinen Liniendiagrammen (die auf die Größe einer Sparkline reduziert werden könnten ) ist es hilfreich, eine Referenzlinie oder -fläche zu haben. Zur Veranschaulichung habe ich einen Zielbereich hinzugefügt. Wenn ein Ziel nicht geeignet ist, kann es sich um einen Referenzwert handeln, der in etwa dem Bereich der letzten drei Wochen entspricht, oder um einen festgelegten Referenzwert.

Bildbeschreibung hier eingeben

Ich habe rot verwendet, um anzuzeigen, welche Wochen für das schnelle Scannen unter dem Ziel lagen.

Mit viel mehr Wochen können Sie sie eher in einem Raster als in einer vertikalen Liste organisieren.

Bildbeschreibung hier eingeben

xan
quelle
Ich finde das ausgezeichnet. Gibt es eine effektive Möglichkeit, die Lernstunden und die auf den Seiten enthaltenen Informationen zu kombinieren, was (zumindest habe ich den Eindruck) eines der Hauptziele der Übung zu sein scheint? Ich vermute, dass es in der ersten Grafik ziemlich effektiv wäre, "Lernstunden" und "Seiten fertiggestellt" hintereinander zu haben (dh in der Spalte links von der Jahreswoche werden die Lernstunden und in der Spalte rechts von der Jahreswoche die Seiten fertiggestellt) ). Aber ich bin nicht sicher, was in der zweiten Grafik gut funktionieren würde.
Silverfish
Eine Lösung wäre natürlich, beide Serien mit einer sekundären vertikalen Achse für die untersuchten Seiten zu überzeichnen, aber viele Leute haben starke Meinungen dagegen, z. B. weigert sich Hadley Wickham absichtlich, sie in ggplot zu implementieren. Ich würde dies im Allgemeinen vermeiden, aber es könnte sinnvoll sein, wenn es Ziele für beide gibt - dies würde eine natürliche Skala für die sekundäre y-Achse einführen, um sicherzustellen, dass die Zielbereiche für Stunden und Seiten sauber ausgerichtet sind. Diese Skalierungsentscheidung ist im Allgemeinen das umstrittene Problem bei mehreren y-Achsen.
Silverfish
Vielen Dank @Silverfish! Ich bin auch gegen zwei Maßstäbe in einem Diagramm, aber wie Sie sagen, wenn beide im Verhältnis zu ihren jeweiligen Zielen auf den gleichen Maßstab gebracht werden können, könnte es funktionieren. In meiner Antwort hätte ich ausdrücklich sagen müssen, dass ich davon ausgegangen bin, dass das andere Maß auf die gleiche Art und Weise dargestellt wird, aber in separaten Diagrammen. In der vertikalen Listenform kann jede Kennzahl eine separate Spalte mit Diagrammen sein.
xan
Dies ist eine weitere gute Antwort. Ich mag die Zielidee, die Sie angewendet haben, auf jeden Fall. Ich werde sehen müssen, was ich jetzt tue, nachdem ich alle Antworten gesehen habe. Vielen Dank
5

Wenn ich Sie richtig verstehe, ist der Grund, warum Sie die Liniendiagramme nicht verwenden möchten, dass Sie zu viele Wochen haben und die Diagramme unordentlich werden würden.

Wenn dies das Problem ist, können Sie die Zeitreihen in Komponenten unterteilen:

Tägliche Abwechslung

Wöchentliche Variation

Langfristiger Trend

Noch etwas.

William S. Cleveland zeigt ein schönes Beispiel dafür in einem seiner Bücher (ich bin nicht in meinem Büro und kann mich nicht erinnern, welches seiner Bücher das Beispiel hat, aber es sind entweder Visualisierungsdaten oder die Elemente der grafischen Daten ).

Sowohl R als auch SAS verfügen über Tools, um dies zu tun. Haben Sie Zugang zu einem von beiden?

Peter Flom - Wiedereinsetzung von Monica
quelle
Ich habe R auf meinem Computer, aber ich habe es selten verwendet. (Völlig bereit zu lernen, obwohl)
Nun, es hat eine Lernkurve, aber schauen Sie sich die Funktion decompose () an. Möglicherweise müssen Sie ein wenig spielen, um das zu bekommen, was Sie wollen. Auch wenn Sie Clevelands Bücher finden, sind sie hervorragend.
Peter Flom - Wiedereinsetzung von Monica
3
Hier ist das Cleveland-Beispiel, das Peter aus den R-Dokumenten erwähnt hat. Wenn Sie R installiert haben, können Sie das Beispiel ausführen
Kieran
@Kieran Richtige Ausgabe? imgur.com/IzRC0h8
5

Ich werde zuerst einige Einwände gegen Ihre ursprünglichen gestapelten oder geteilten Balkendiagramme formulieren.

ein. Die Farbcodierung erscheint völlig beliebig. Daher kann der Graph nicht untersucht werden, ohne wiederholt zwischen Legende und Graph zu wechseln.

b. Nullen sind implizit als unsichtbare Balkensegmente. Nullen sind Teil der Variation.

Aus diesen und anderen Gründen sind die Graphen schwer zu dekodieren.

Das heißt, die Grafik hat sich bewährt, wenn das Interesse hauptsächlich an der Untersuchung von Summenunterschieden von Woche zu Woche besteht. Viele Wochen konnten so viele Balken eingezeichnet werden. Der entsprechende Nachteil ist, dass es immer schwieriger wird, Variationen innerhalb von Wochen zu untersuchen.

Sichern: In jedem Problem gibt es drei Variablen.

  1. Zeit studiert oder Seiten abgeschlossen.

  2. Wochentag.

  3. Wochennummer.

Wenn die Anzahl der Wochen zunimmt, wird jedes Diagramm detaillierter. Die Herausforderung besteht darin, dieses Detail unter Kontrolle zu halten.

Ich würde ein Fahrraddiagramm in Betracht ziehen (andere Namen wurden in der Literatur verwendet, die meisten beziehen sich jedoch auf die Verwendung, um saisonale Schwankungen zu untersuchen). Hier gibt es eine klare Einführung von Naomi Robbins. Zu ihren Beispielen gehören solche wie Ihre, bei denen das Interesse an Variationen innerhalb und zwischen den Wochen liegt.

Nick Cox
quelle
Vielen Dank für diesen sehr schönen Link. Ein Kommentar zu Ihrem Einwand: Die Tage sind eigentlich von Freitag bis Donnerstag (unten nach oben) gestapelt, aber einige fehlende Tage sind in Bezug auf die Lesbarkeit definitiv ein berechtigtes Anliegen.
In der Tat, aber die Menschen müssen immer noch die Legende zum Entschlüsseln verwenden.
Nick Cox
R verfügt über einen Monthplot- Befehl, der für wöchentliche Daten verwendet werden kann - siehe stackoverflow.com/questions/5826703/…
Silverfish,
5

Die Liniendiagramme wären wahrscheinlich leichter zu interpretieren, wenn Sie einen gleitenden Durchschnitt von sieben, vierzehn oder vielleicht 28 Tagen hätten. Das würde sie glätten und es Ihnen trotzdem ermöglichen, Trends zu erkennen.

Dies hat einige Ähnlichkeiten mit der Lösung von Peter Flom, ist jedoch etwas einfacher und sagt daher kein ganz so vollständiges Bild aus - aber es kann durchaus für Ihre Bedürfnisse ausreichen. Wenn Sie Ihre Daten in einer Kalkulationstabelle aufzeichnen, hat dies den Vorteil, dass eine solche Mittelwertbildung innerhalb der Kalkulationstabelle durch das Einrichten einiger Formeln leicht durchgeführt werden kann und das Diagramm automatisch aktualisiert wird, wenn Sie neue Daten eingeben.

Aktualisieren Sie, um Diagramme einzuschließen

Liniendiagramme für gleitende Durchschnitte

Das Tabellendiagramm für die gleitenden 7-Tage-Durchschnittswerte ist unspektakulär, scheint aber seine Aufgabe gut zu erfüllen. Die täglichen Schwankungen werden geglättet, sodass Trends leichter zu erkennen sind (im Vergleich zum entsprechenden Tageschart, der so laut ist, dass er nicht nachvollziehbar ist). Einige Hauptmerkmale werden in dieser Handlung gut herausgearbeitet: Beispielsweise wurde Mitte Januar eine große Menge an Arbeit stündlich erledigt, was jedoch nicht mit einem proportionalen Anstieg der durchschnittlich pro Tag fertiggestellten Seiten einherging. Die Weihnachtspause ist sehr gut sichtbar und solange einzelne Datenpunkte klar eingezeichnet sind, ist sie nicht zu irreführend (wenn nur die Linie sichtbar wäre, wäre es unmöglich festzustellen, dass der flache Zeitraum auf Datenmangel zurückzuführen ist!). Trotzdem würde ich empfehlen , einschließlich1.5

Mit nur fünfzig Datenelementen schien es nicht sinnvoll zu sein, über einen längeren Zeitraum einen Mittelwert zu bilden, um längerfristige Trends zu erkennen. Ebenso vermute ich, dass Peter Floms exzellente Idee der saisonalen Zersetzung mit solch begrenzten Daten zu kämpfen hätte. Wenn Sie die Zerlegung in Ihrer Tabelle durchführen würden, wäre es noch wichtiger, den Umbruch als Nulldaten einzuschließen.

Um meine Formeln zu reproduzieren, fügen Sie dies so ein, dass sich das Datum in der Zelle befindet 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)
Silberfisch
quelle
5

Wie ich Ihre Frage verstehe, wäre es möglich, Stunden und Seiten getrennt anzuzeigen. Ich werde das zuerst tun. Danach zeige ich Gesamt und Seiten in einem Plot an. Ich vermute, dass die tatsächlichen Zahlen nicht das Wichtigste sind - es ist wichtiger, sich einen Überblick über die Wochen und Wochentage zu verschaffen, die produktiv waren und welche nicht. In diesem Fall schlage ich vor, dass Sie die natürliche zeitliche Struktur beibehalten, da Ihre Daten tatsächlich nur eine zeitliche Dimension haben. Wir können immer noch einen Weg finden, die Wochen einzugrenzen.

Ich habe den folgenden R-Code und das ggplot2-Paket verwendet, um diesen ersten Plot zu erstellen. Ihre Daten wurden in die Objektdaten im folgenden Code geladen. Das Diagramm ist ein gruppiertes Balkendiagramm, wobei die grauen Balken die wöchentlichen Seitensummen angeben.

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

Die Höhe der grauen Balken gibt die Wochensumme der Seiten an.

Das ist eindeutig nicht perfekt. Die grauen Balken dominieren zu sehr, da sie im Vergleich zu Tagesbalken einen größeren Bereich für die gleiche Lesemenge haben. Wir könnten sie dünner machen, aber ich mag die Art und Weise, wie sie die Wochen einschränken. Sie zeigen recht gut an, welche Tage in derselben Woche liegen - etwas, das sonst nicht unbedingt verständlich wäre. Vor allem, weil wir keine Zählimpulse haben.

Im nächsten Plot habe ich die mittlere Seitenzahl (innerhalb einer Woche) als Höhe des grauen Balkens verwendet.

Die Höhe der grauen Balken gibt den Wochenmittelwert der Seiten an.

Dies stellt wahrscheinlich Daten besser dar. Beachten Sie jedoch, dass die Wochen 0 und 7 irreführend sind, da sie keine 7 Tage enthalten. Sie könnten dies leicht umgehen.

Wenn Sie darauf bestehen, Seiten und Zeit gleichzeitig anzuzeigen, können Sie ein Balkendiagramm hintereinander erstellen. Es könnte ein wenig verwirrend sein, da die beiden vertikalen Skalen nicht gleich sind. Auf der anderen Seite kann es hilfreich sein, die aufgewendete Zeit und die direkt auf diese Weise geleistete Arbeit zu vergleichen.

Kombinieren von Zeit und Seiten in einem Back-to-Back-Plot.

BEARBEITEN: Wenn Sie feststellen, dass die Farben wirklich nicht so oft benötigt werden und von xan inspiriert sind (siehe unten), können Sie die Darstellung auf so etwas vereinfachen. Ich habe Donnerstag markiert, um eine zusätzliche visuelle Anleitung zu geben. Sie können sich auch dafür aussprechen, für alle Balken dieselbe Farbe zu verwenden, um einige (willkürliche) Tage nicht zu überbetonen.

Eine einfachere Version.

Abschließend können Sie auch versuchen, die Achsen anders zu skalieren, indem Sie Ihre Werte durch den Mittelwert dividieren. Dies würde 1 zu einem "normalen" Wert machen. Wir könnten eine Linie bei 1 einfügen, um diesen Punkt hervorzuheben - jetzt auf dem Back-to-Back-Plot. Dies trennt "gute" von "schlechten" Tagen in Bezug auf die durchschnittliche Arbeitsbelastung.

Bildbeschreibung hier eingeben

Auf diesem Diagramm können wir auch sicherstellen, dass eine Einheit auf beiden Achsen dem gleichen Abstand entspricht, wie sie jetzt vergleichbar sind.

Beachten Sie auch, dass ich die Tage in der ersten Version durcheinander gebracht habe. Ich habe den Code und die Handlungen korrigiert und werde jetzt die sieben Tage der Woche üben.

Der Code, der den letzten Plot erzeugt hat:

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
quelle
Dies scheint am ehesten im Sinne einer Verbesserung des Originals zu sein, und die Idee gefällt mir. Ich mag die willkürlichen / Regenbogenfarben weder im Original noch bei Ihnen. Versuchen Sie es mit einem sequenziellen Farbsatz. Auf den Kopf gestellte Balken funktionieren auch bei mir nicht.
xan
Ich denke die sequentiellen Farben könnten eine Verbesserung sein - danke für den Vorschlag. Andererseits denke ich nicht, dass die Farben so wichtig sind, da wir die wöchentlichen Begrenzungszeichen haben, die uns leiten (Montag ist der erste Tag, Dienstag der zweite usw.). Wir sind uns einig, wie ich auch in meiner Antwort angedeutet habe. Eine Verbesserung dieses Diagramms könnte darin bestehen, beide vertikalen Achsen entsprechend ihrer jeweiligen täglichen Mittelwerte zu skalieren. Dies würde den Vergleich zwischen Wochen und gelesenen Seiten / Zeitaufwand erleichtern.
SWMO
Jetzt, da die Erwähnung der Farben unwichtig ist, fällt mir ein, dass das Entfernen der Farbvariation funktionieren könnte. Die Wochentage werden bereits nach Ort unterschieden. Oder machen Sie einfach Mittwoch einen anderen Farbton als zusätzlichen Anker.
xan
Sehr schön! Die anderen Antworten habe ich noch nicht durchgesehen, aber das ist sicherlich schon eine große Verbesserung! Vielen Dank
1
Ich habe die Antwort bearbeitet, um die Ideen aus den Kommentaren einzuschließen. @Nehmen Sie eine Herausforderung an und ich bin froh, dass Sie sie hilfreich finden.
SWMO
1

xy

  1. Zeichnen Sie die Daten als Zeilen mit zwei Wochen als Gruppierungsvariablen, um zwei separate Zeilen für jede Woche zu erhalten.
  2. Oder verwenden Sie gruppierte Balkendiagramme, in denen Sie für jeden Wochentag zwei Balken für Woche 1 und Woche 2 haben, jeweils mit der Anzahl der Seiten / Stunden pro Tag.
Tim
quelle
Bitte sehen Sie, was 1. oben tut und 2. leider nicht sehr aussagekräftig erscheint. Vielen Dank für Ihre Antwort.
Ich sehe kein Problem damit ... Es sieht nicht gut aus, aber es hängt von der verwendeten Software und / oder der grafischen Bearbeitung ab.
Tim
1.Sie können nicht wirklich sagen, ob Woche 1 oder 2 besser läuft, und wenn noch ein paar Wochen dazukommen, wird es viel zu chaotisch. 2. Mir macht das eigentlich nichts aus, es ist eigentlich ganz nett. Vielleicht könnte ich das Original und dieses zusammenstellen, um es klarer zu machen. (Jetzt auch oben gezeigt)
1

Die Grafik unten zeigt die kumulierten Stunden des Studiums und die Gesamtseiten innerhalb jeder Woche unter Verwendung von Linien anstelle von gestapelten Balken, was es hoffentlich einfacher macht, den Trend innerhalb jeder Woche zu sehen und zwischen den Wochen zu vergleichen. Ich habe die fehlenden Wochen mit Nullen gefüllt, aber Sie können diese ausschließen, wenn Sie möchten. Der RCode für die Datenverarbeitung und die Plotgenerierung wird unterhalb der Grafik angezeigt.

Bildbeschreibung hier eingeben

Bei der Ausführung der folgenden Schritte habe ich zuerst die in der Frage angegebenen Daten in einen Datenrahmen mit dem Namen geladen 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
quelle
Dies ist eine wirklich gute Idee und löst definitiv das Problem, dass es schwierig ist zu bestimmen, auf welchen Tag Sie schauen. Vielen Dank
0

Eine weitere Option ist das Blasendiagramm, in dem Sie für eine Variable die vertikale Höhe und für die andere die Punktgröße festlegen können. Unten ist das Datum (Tag) horizontal, die untersuchten Stunden sind vertikal, die pro Tag abgedeckten Seiten haben eine Blasengröße und die Woche ist farbig.

Bildbeschreibung hier eingeben

Avraham
quelle
0

Sie könnten in 3d zeichnen. Ich habe nicht überprüft, ob der Wochentag korrekt berechnet wurde, den besten Betrachtungswinkel gefunden usw., aber dies sollte Ihnen die Idee geben. Weitere Verzierungen sind ebenfalls möglich. Beispielsweise ist es möglicherweise besser, die Punkte mit einer Linie zu verbinden und die Gitterlinien so zu verschieben, dass sie jedem Montag entsprechen.

Tatsächlich wäre es sehr interessant zu versuchen, jede Gitternetzlinie von links nach rechts und von oben nach unten (wie in diesem Winkel gezeigt) demselben Wochentag zuzuordnen (z. B. Montag) und dann Boxplots an der unteren und hinteren rechten Wand anzubringen die Gitterlinien. Die Boxplots würden den Gesamtstunden und der Gesamtseite für jede Woche entsprechen. Ich bin mir ziemlich sicher, dass dies mit RGL möglich sein würde, aber einige Bastelarbeiten erfordern würden. Es kann sich lohnen. Geigen- oder Bohnenplots sind möglicherweise noch besser.

Bildbeschreibung hier eingeben

Die Daten (zur Eingabe in 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))

Machen Sie die Handlung:

#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)
Livid
quelle
-1

Folgende Heatmap mit Wochennummer (des Jahres), Wochentag und Facetten für Stunden und Seiten kann hilfreich sein:

Bildbeschreibung hier eingeben

Das Entfernen von 2 hohen Werten führt zu besseren Farbverläufen im Plot:

Bildbeschreibung hier eingeben

Das Befolgen des Balkendiagramms kann ebenfalls hilfreich sein.

Bildbeschreibung hier eingeben

Es zeigt deutlich einen Zeitraum von 2 Wochen, in dem keine Arbeit geleistet wurde.

Ein Plot mit Linien kann ebenfalls nützlich sein (Linien sind nicht überladen; die Punkte können auch entfernt werden, wobei nur zwei Linien beibehalten werden).

Bildbeschreibung hier eingeben

Sie vermitteln die Informationen klar und vereinfachen die Handlung zum leichteren Verständnis.

rnso
quelle