Affichage de trois informations sur un graphique

15

Remarque: 50 points de données brutes sont désormais attachés.

Je veux afficher la quantité d'études que j'ai faites et le nombre de pages que j'ai complétées au cours de la semaine, réparties par jour, et je l'ai fait comme indiqué ci-dessous:entrez la description de l'image ici

Des gens m'ont dit qu'ils ne pouvaient pas comprendre les graphiques, mais je ne sais pas comment je peux les afficher autrement. Puisque j'aurais essentiellement besoin de trois dimensions sans faire une représentation cumulative. Je veux éviter d'utiliser de nombreux graphiques linéaires, car après quelques semaines, les graphiques deviendront illisibles. N'y a-t-il rien que je puisse faire?

Comment puis-je les afficher plus clairement?

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 - Réintégrer Monica
la source
Si vous pouvez publier des exemples de données, les personnes intéressées peuvent jouer et vous montrer leurs solutions. Pour être réaliste, il faudrait plusieurs semaines, car l'essence du problème est ce qui se passe lorsque le nombre de semaines augmente.
Nick Cox
@NickCox Je pourrais republier dans quelques semaines car je ne suis vraiment pas sûr de la façon dont les données vont changer et je n'ai vécu que les 13 premiers jours jusqu'à présent (dont 3 sans étude)
@NickCox Comment publier les données brutes?
1
Mon conseil est d'attendre un peu. En mettant à jour la question, vous y avez attiré l'attention. Voyez si vous obtenez de nouvelles réponses.
Nick Cox
1
Que voulez-vous afficher sur ces données? Quelle histoire voulez-vous raconter? Qu'essayez-vous de faire comprendre aux gens vos données avec les graphiques à barres?
gung - Rétablir Monica

Réponses:

7

Une façon de visualiser les données basées sur la date / le calendrier est via un affichage matriciel qui code les données avec des couleurs. La matrice (ou le tableau) est organisée de sorte que les lignes représentent les semaines et la colonne les jours. Vous pouvez ajouter une dernière colonne pour le total hebdomadaire si cela est souhaitable.

Cela peut être implémenté simplement dans Excel avec une mise en forme conditionnelle si les données sont correctement organisées. En particulier, vous pouvez créer une "grille" de valeurs avec des formules qui recherchent dans vos données d'origine. De là, vous pouvez utiliser la mise en forme conditionnelle pour afficher le résultat.

Voici à quoi pourrait ressembler le résultat. Désolé d'avoir changé le format de la date. La formule dans la cellule H1 est la suivante : "=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)". Il fait un peu de calcul pour obtenir les jours dans le bon ordre. J'espère que c'est simple.

Image de mise en forme conditionnelle avec arrangement matriciel

Si vous cherchez vraiment à pousser l'enveloppe, vous pouvez utiliser un cadre comme d3 et son calendrier plugin de pour afficher ces données. Cela pourrait être plus une entreprise qu'elle n'en vaut la peine.

Ce format est très similaire à la façon dont GitHub affiche l'activité / les contributions des utilisateurs au fil du temps. Voici un utilisateur (pas moi!). entrez la description de l'image ici

Mur Byron
la source
2
(+1) J'aime cette approche, en particulier parce qu'elle est bien adaptée à une utilisation dans la même feuille de calcul que les données sont entrées. Cet affichage graphique est en fait une carte thermique . J'utilise régulièrement des configurations similaires moi-même, et je trouve qu'une faiblesse est que les aspects des tendances peuvent être difficiles à cerner, il peut donc être bon de compléter cela avec une variante du graphique linéaire pour montrer des détails plus fins (Peter Flom, Nick Cox et j'ai tous fait de bonnes suggestions).
Silverfish
6

La caractéristique principale de l'original est les sommes hebdomadaires. Les valeurs individuelles n'ont de sens qu'après avoir appris les couleurs, et j'imagine que c'est une grande raison pour laquelle l'intrigue ne fonctionne pas pour les nouveaux téléspectateurs. Lié à cela, l'aspect temps des jours est perdu. Un ensemble séquentiel de couleurs peut aider (par exemple, 7 nuances de bleu).

Normalement, je ne me soucie pas d'étiqueter chaque article - les valeurs exactes sont-elles importantes? Le graphique ne fait pas son travail si vous ne pouvez pas l'interpréter sans que chaque valeur soit étiquetée.

À mon essai . Étant donné l'importance apparente des sommes hebdomadaires, j'ai tracé les sommes cumulées hebdomadaires. Il montre les sommes hebdomadaires et les jours dans l'ordre chronologique. Les valeurs de jour exactes sont moins claires, mais les valeurs aberrantes ressortiront toujours.

Pour ces types de petits tracés de ligne (qui pourraient être réduits à la taille du graphique sparkline ), il est utile d'avoir une ligne ou une zone de référence. Pour illustration, j'ai ajouté une plage cible. Si un objectif n'est pas approprié, la référence pourrait être quelque chose comme la plage au cours des trois dernières semaines ou une valeur de référence fixe.

entrez la description de l'image ici

J'ai utilisé du rouge pour indiquer les semaines inférieures à la cible pour une analyse rapide.

Avec beaucoup plus de semaines, vous pouvez les organiser en grille plutôt qu'en liste verticale.

entrez la description de l'image ici

xan
la source
Je pense que c'est excellent. Existe-t-il un moyen efficace de combiner les heures d'étude et les pages couvertes par les informations, ce qui (au moins j'ai l'impression) semble être l'un des principaux objectifs de l'exercice? Je soupçonne qu'il serait assez efficace dans le premier graphique d'avoir "heures d'étude" et "pages terminées" consécutivement (c'est-à-dire les heures d'étude tracées dans la colonne à gauche de la semaine de l'année, et les pages complétées dans la colonne à droite de la semaine de l'année ). Mais je ne sais pas ce qui fonctionnerait bien dans le deuxième graphique.
Silverfish
Évidemment, une solution serait de superposer les deux séries avec un axe vertical secondaire pour les pages étudiées, mais beaucoup de gens ont des opinions bien arrêtées à ce sujet, par exemple Hadley Wickham refuse délibérément de l'implémenter dans ggplot. J'éviterais généralement de faire cela, mais cela pourrait avoir du sens s'il y a des cibles pour les deux - cela introduirait une échelle naturelle pour l'axe Y secondaire, pour garantir que les zones cibles pour les heures et les pages s'alignent parfaitement. Cette décision de mise à l'échelle est généralement la question controversée avec plusieurs axes Y.
Silverfish
Merci @Silverfish! Je suis également opposé à deux échelles dans un graphique, mais comme vous le dites, si les deux peuvent être placées sur la même échelle par rapport à leurs cibles respectives, cela pourrait fonctionner. J'aurais dû dire explicitement dans ma réponse qu'en ne montrant qu'une seule mesure, je supposais que l'autre mesure serait montrée de la même manière mais dans des graphiques séparés. Dans le formulaire de liste verticale, chaque mesure pourrait être une colonne distincte de graphiques.
xan
Ceci est une autre excellente réponse. J'aime vraiment l'idée cible que vous avez appliquée. Je vais devoir voir ce que je fais maintenant que j'ai vu toutes les réponses. Merci
5

Si je vous comprends bien, la raison pour laquelle vous ne voulez pas utiliser les graphiques linéaires est que vous avez trop de semaines et que les graphiques deviendraient désordonnés.

Si tel est le problème, vous pouvez diviser la série chronologique en composants:

Variation quotidienne

Variation hebdomadaire

Tendance à long terme

Rien d'autre.

William S. Cleveland montre un bel exemple de cela dans l'un de ses livres (je ne suis pas à mon bureau et je ne me souviens pas lequel de ses livres a l'exemple, mais c'est soit Visualizing data or The elements of graphing data ).

R et SAS disposent tous deux d'outils pour ce faire. Avez-vous accès à l'un d'eux?

Peter Flom - Réintégrer Monica
la source
J'ai R sur mon ordinateur, mais je l'ai rarement utilisé. (Entièrement disposé à apprendre cependant)
Eh bien, il a une courbe d'apprentissage, mais examinez la fonction decompose (). Vous devrez peut-être jouer pour obtenir ce que vous voulez. De plus, si vous pouvez trouver les livres de Cleveland, ils sont exceptionnels.
Peter Flom - Réintégrer Monica
3
Voici l'exemple de Cleveland mentionné par Peter, tiré des documents R. Si vous avez installé R, vous pouvez exécuter l'exemple: stat.ethz.ch/R-manual/R-devel/library/stats/html/stl.html
Kieran
@Kieran Sortie correcte? imgur.com/IzRC0h8
5

Je vais d'abord énoncer quelques objections à vos graphiques à barres empilés ou divisés originaux.

une. Le codage couleur apparaît complètement arbitraire. Par conséquent, le graphique ne peut pas être étudié sans aller et venir à plusieurs reprises entre la légende et le graphique.

b. Les zéros sont implicites, en tant que segments de barre invisibles. Les zéros font partie de la variation.

Pour ces raisons et d'autres, les graphiques sont difficiles à décoder.

Cela dit, le graphique a du mérite si l'intérêt est surtout d'étudier la variation des totaux d'une semaine à l'autre. Plusieurs semaines pouvaient être tracées comme autant de barres. L'inconvénient correspondant est qu'il serait de plus en plus difficile d'étudier les variations en quelques semaines.

Sauvegarde: Il y a trois variables ici dans chaque problème.

  1. Temps étudié ou pages complètes.

  2. Jour de la semaine.

  3. Numéro de semaine.

Au fur et à mesure que le nombre de semaines augmente, tout graphique devient plus détaillé. Le défi est de garder ce détail sous contrôle.

Je considérerais un tracé de cycle (d'autres noms ont été utilisés dans la littérature, mais la plupart se réfèrent à son utilisation pour étudier la variation saisonnière). Il y a une introduction lucide ici par Naomi Robbins Ses exemples incluent ceux comme le vôtre où l'intérêt est dans les variations au sein et entre les semaines.

Nick Cox
la source
Merci pour ce très joli lien. Un commentaire sur votre objection, les jours sont en fait empilés du bas vers le haut du vendredi au jeudi, mais certains jours manquants sont certainement une préoccupation valable en ce qui concerne la lisibilité.
En effet, mais les gens doivent encore utiliser la légende pour décoder.
Nick Cox du
R a une commande monthplot qui peut en fait être utilisée sur les données hebdomadaires - voir stackoverflow.com/questions/5826703/…
Silverfish
5

Les graphiques linéaires seraient probablement plus faciles à interpréter si vous preniez une moyenne mobile de sept jours, quatorze jours ou peut-être 28 jours. Cela les lisserait et vous permettrait de repérer les tendances.

Cela présente quelques similitudes avec la solution de Peter Flom, mais est plutôt plus simple et ne donne donc pas une image aussi complète - mais elle pourrait bien suffire à vos besoins. Si vous enregistrez vos données dans une feuille de calcul, cela a l'avantage qu'une telle moyenne peut facilement être effectuée dans la feuille de calcul elle-même en configurant certaines formules, et le graphique sera automatiquement mis à jour lorsque vous remplissez de nouvelles données.

Mettre à jour pour inclure des graphiques

Graphiques linéaires pour les moyennes mobiles

Le graphique de la feuille de calcul pour les moyennes mobiles sur sept jours n'est pas spectaculaire mais semble bien faire son travail - la variation quotidienne est lissée afin que les tendances soient plus faciles à détecter (par rapport au graphique quotidien équivalent qui est si bruyant qu'il est incompréhensible). Certaines caractéristiques clés sont bien identifiées par ce graphique: par exemple, une grande quantité de travail a été effectuée à la mi-janvier, en termes horaires, mais cela ne s'est pas accompagné d'une augmentation proportionnelle du nombre moyen de pages terminées par jour. La pause de Noël est très visible et tant que les points de données individuels sont clairement tracés, ce n'est pas trop trompeur (si seulement la ligne était visible, il serait impossible de déterminer que la période plate était due au manque de données!). Néanmoins, je recommande fortement d' inclure1,5

Avec seulement cinquante éléments de données, il ne semblait pas utile d'essayer de faire la moyenne sur une plus longue période de temps pour détecter des tendances à plus long terme. De même, je soupçonne que l'excellente idée de Peter Flom de la décomposition saisonnière aurait du mal avec des données aussi limitées. Si vous deviez effectuer la décomposition dans votre feuille de calcul, il serait encore plus important d'inclure la rupture en tant que données nulles.

Pour reproduire mes formules, collez-le de sorte que 'Date' soit dans la cellule 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
la source
5

Si je comprends bien votre question, il serait possible d'afficher les heures et les pages séparément. Je vais le faire en premier. Ensuite, je vais afficher Total et Pages dans un seul tracé. Je suppose que les chiffres réels ne sont pas la chose la plus importante - il est plus important d'avoir un aperçu des semaines et des jours de la semaine, qui ont été productifs et qui ne l'ont pas été. Dans ce cas, je vous suggère de conserver la structure temporelle naturelle car il n'y a en fait qu'une seule dimension temporelle dans vos données. On peut encore trouver un moyen de délimiter les semaines.

J'ai utilisé le code R suivant et le package ggplot2 pour produire ce premier tracé. Vos données ont été chargées dans les données d'objet dans le code ci-dessous. Le graphique est un graphique à barres groupé, les barres grises indiquant les sommes hebdomadaires de pages.

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

La hauteur des barres grises indique la somme hebdomadaire des pages.

Ce n'est clairement pas parfait. Les barres grises dominent beaucoup car comparées à une barre de jour, elles ont une plus grande surface pour la même quantité de lecture. Nous pourrions les rendre plus minces, mais j'aime la façon dont ils délimitent les semaines. Ils indiquent assez bien quels jours sont dans la même semaine - quelque chose qui ne serait pas nécessairement intelligible autrement. Surtout parce que nous n'avons aucun compte.

Dans l'intrigue suivante, j'ai utilisé le nombre moyen de pages (dans la semaine) comme hauteur de la barre grise.

La hauteur des barres grises indique la moyenne hebdomadaire des pages.

Cela représente probablement mieux les données. Cependant, notez que les semaines 0 et 7 sont trompeuses car elles ne comprennent pas 7 jours. Vous pouvez facilement contourner ce problème.

Si vous insistez pour afficher simultanément les pages et l'heure, vous pouvez faire un graphique à barres consécutif. Cela peut être un peu déroutant car les deux échelles verticales ne sont pas identiques. D'un autre côté, il pourrait être intéressant de comparer le temps passé et le travail effectué directement comme celui-ci.

Combiner le temps et les pages dans un tracé consécutif.

EDIT: Réalisant que les couleurs ne sont vraiment pas nécessaires et inspiré par xan (voir les commentaires ci-dessous), vous pouvez simplifier l'intrigue en quelque chose comme ça. J'ai marqué jeudi pour donner un guide visuel supplémentaire. Vous pourriez également plaider en faveur de l'utilisation de la même couleur pour toutes les barres afin de ne pas surestimer certains jours (arbitraires).

Une version plus simple.

Sur une note finale, vous pouvez également essayer de mettre à l'échelle les axes différemment en divisant vos valeurs par la valeur moyenne. Cela ferait de 1 une valeur "normale". Nous pourrions inclure une ligne à 1 pour souligner ce point - maintenant fait sur le tracé dos à dos. Cela sépare les «bons» des «mauvais» jours en termes de charge de travail moyenne.

entrez la description de l'image ici

Sur ce graphique, nous pourrions également nous assurer qu'une unité correspond à la même distance sur les deux axes car elles sont comparables à présent.

Notez également que j'ai foiré les jours dans la première version. J'ai corrigé le code et les tracés et je vais maintenant m'entraîner les sept jours de la semaine.

Le code qui a produit le dernier tracé:

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
la source
Cela semble plus dans l'esprit d'améliorer l'original, et j'aime l'idée. Je n'aime pas les couleurs arbitraires / arc-en-ciel dans l'original ou le vôtre. Essayez un jeu de couleurs séquentielles. Les barres à l'envers ne fonctionnent pas non plus pour moi.
xan
Je pense que les couleurs séquentielles pourraient être une amélioration - merci pour la suggestion. D'un autre côté, je ne pense pas que les couleurs soient si importantes car nous avons les délimiteurs hebdomadaires pour nous guider (lundi le premier jour, mardi le deuxième, etc.). Nous sommes d'accord sur l'intrigue consécutive, comme je l'ai également laissé entendre dans ma réponse. Une amélioration par rapport à ce graphique pourrait consister à mettre à l'échelle les deux axes verticaux en fonction de leurs moyennes quotidiennes respectives. Cela faciliterait la comparaison entre les semaines et les pages lues / temps passé.
swmo
Maintenant que la mention des couleurs étant sans importance, il me semble que la suppression de la variation de couleur pourrait fonctionner. Les jours de la semaine se distinguent déjà par leur emplacement. Ou peut-être simplement faire de mercredi une teinte différente comme ancre supplémentaire.
Xan
Très agréable! Je n'ai pas encore parcouru les autres réponses, mais c'est certainement déjà une grande amélioration! Merci beaucoup
1
J'ai édité la réponse pour inclure les idées des commentaires. @S'engager dans un défi, je suis heureux que vous le trouviez utile.
swmo
1

Xy

  1. tracer les données sous forme de lignes avec deux semaines comme variables de regroupement - afin d'obtenir deux lignes distinctes pour chaque semaine,
  2. ou utilisez des graphiques à barres groupés où, pour chaque jour de la semaine, vous avez deux barres pour la semaine 1 et la semaine 2, chacune avec un nombre de pages / heures par jour.
Tim
la source
Veuillez voir ce que 1. fait ci-dessus, et 2. ne semble malheureusement pas très significatif. Merci pour votre réponse.
Je n'y vois aucun problème ... Il n'a pas l'air sympa mais c'est une question de logiciel que vous utilisez et / ou d'édition graphique.
Tim
1.Vous ne pouvez pas vraiment dire si la semaine 1 ou 2 va mieux, et si quelques semaines supplémentaires étaient ajoutées, cela deviendrait beaucoup trop chaotique. 2. Cela ne me dérange pas, celui-ci est en fait assez agréable. Je pourrais peut-être mettre l'original et celui-ci ensemble pour le rendre plus clair. (Également montré ci-dessus maintenant)
1

Le graphique ci-dessous montre les heures d'études cumulées et le nombre total de pages au cours de chaque semaine en utilisant des lignes au lieu de barres empilées, ce qui, espérons-le, permettra de voir plus facilement la tendance au cours de chaque semaine et de comparer les semaines. J'ai rempli les semaines manquantes avec des zéros, mais vous pouvez les exclure si vous le souhaitez. Le Rcode pour le traitement des données et la génération du tracé est affiché sous le graphique.

entrez la description de l'image ici

En effectuant les étapes ci-dessous, j'ai d'abord chargé les données publiées dans la question dans un bloc de données appelé 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
la source
C'est une très bonne idée et résout définitivement le problème de la difficulté à déterminer quel jour vous regardez. Merci
0

Une autre option est le graphique à bulles, où vous pouvez avoir une hauteur verticale pour une variable et une taille de point pour l'autre. Ci-dessous, la date (jour) est horizontale, les heures étudiées sont verticales, les pages couvertes par jour sont de taille bulle et la semaine est colorée.

entrez la description de l'image ici

Avraham
la source
0

Vous pouvez tracer en 3D. Je n'ai pas vérifié que le jour de la semaine était calculé correctement, trouver le meilleur angle de vision, etc., mais cela devrait vous donner l'idée. D'autres embellissements sont également possibles. Par exemple, il pourrait être préférable de connecter les points avec une ligne et de déplacer les lignes de quadrillage pour correspondre à chaque lundi.

En fait, ce qui serait très intéressant à essayer, c'est que chaque quadrillage gauche-droite et haut-bas (comme indiqué dans cet angle) corresponde au même jour de la semaine (par exemple, lundi), puis en plaçant des boîtes à moustaches sur les murs inférieur et arrière droit à l'intérieur le quadrillage. Les boîtes à moustaches correspondraient respectivement au nombre total d'heures et de pages pour chaque semaine. Je suis presque certain que ce serait possible avec rgl, mais cela nécessiterait quelques retouches. Cela en vaut peut-être la peine. Les parcelles de violon ou les haricots peuvent être encore mieux.

entrez la description de l'image ici

Les données (pour la saisie dans 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))

Faites l'intrigue:

#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)
Livide
la source
-1

La carte thermique suivante avec le numéro de semaine (de l'année), le jour de la semaine et les facettes des heures et des pages peut être utile:

entrez la description de l'image ici

La suppression de 2 valeurs élevées donne de meilleurs dégradés de couleurs sur le tracé:

entrez la description de l'image ici

Le diagramme à barres suivant peut également être utile.

entrez la description de l'image ici

Il montre clairement une période de 2 semaines où aucun travail n'a été effectué.

Le tracé avec des lignes peut également être utile (les lignes ne sont pas encombrées; les points peuvent également être supprimés, en ne conservant que deux lignes)

entrez la description de l'image ici

Ils transmettent clairement les informations tout en simplifiant l'intrigue pour une compréhension facile.

rnso
la source