グラフに3つの情報を表示する


15

注:50ポイントの生データが現在添付されています。

私が行った研究の量と、週ごとに完了したページ数を日ごとに分けて表示したいので、次のように表示しました。ここに画像の説明を入力してください

グラフを理解できないと言われましたが、他にどのように表示できるかわかりません。累積的な描写をすることなく、本質的に3つの次元が必要だからです。数週間後にグラフが判読できなくなるため、多数の折れ線グラフの使用を避けたいと思います。私にできることは何もありませんか?

これらをより明確に表示するにはどうすればよいですか?

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

サンプルデータを投稿できる場合は、興味のある方はそのソリューションを再生して表示できます。現実的であるためには、数週間が必要になります。問題の本質は、週数が増えるにつれて何が起こるかだからです。
ニックコックス14

私は、データがどのように変化するか正直わからないと私は唯一のこれまでのところの最初の13日間を生き抜いてきたので、@NickCox私は数週間後に再投稿でき(3なし研究とその)

@NickCox生データを投稿するにはどうすればよいですか?

1
私のアドバイスは少し待っています。質問を更新することにより、あなたはそれに注意を引きました。新しい回答が得られるかどうかを確認してください。
ニックコックス

1
これらのデータについて何を表示したいですか?どんな話をしたいですか?棒グラフであなたのデータについて人々に理解してもらいたいのは何ですか?
GUNG -復活モニカ

回答:


7

日付/カレンダーベースのデータを視覚化する1つの方法は、データを色でエンコードするマトリックスディスプレイを使用することです。マトリックス(またはテーブル)は、行が週を表し、列が日を表すように配置されます。必要に応じて、週ごとの合計の最終列を追加できます。

これは、データが正しく配置されている場合、条件付き書式を使用してExcelで簡単に実装できます。特に、元のデータを検索する数式を使用して値の「グリッド」を構築できます。そこから、条件付き書式を使用して結果を表示できます。

結果は次のようになります。日付の形式を変更して申し訳ありません。セルH1の式は次のとおりです。"=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)"です。正しい順序で日を取得するために、いくつかの計算を行っています。うまくいけば、それは簡単です。

行列配置を使用した条件付き書式の画像

本当に封筒をプッシュしたい場合は、次のようなフレームワークを使用できます d3などのとそのカレンダープラグインを使用して、このデータを表示できます。しかし、それは価値があるというよりも、むしろやりがいがあるかもしれません。

この形式は、GitHubがユーザーのアクティビティ/貢献を長期にわたって表示する方法と非常に似ています。ここに一人のユーザーの(私ではありません)です。 ここに画像の説明を入力してください


2
(+1)特にデータが入力されているのと同じスプレッドシートでの使用に適しているため、このアプローチが気に入っています。このグラフィック表示は、事実上ヒートマップです。私自身も定期的に同様のセットアップを使用していますが、1つの弱点は、トレンドの側面を特定するのが難しいということです。そのため、折れ線グラフのいくつかのバリアントでこれを補完して、より詳細に表示することができます(Peter Flom、Nick Coxそして、私はすべて良い提案をしました)。
シルバーフィッシュ14

6

オリジナルの顕著な特徴は、週ごとの合計です。個々の値は、色を学習して初めて意味があり、それが新しい視聴者にとってプロットが機能しない大きな理由だと思います。それに関連して、日の時間的側面は失われます。A順次色の組(例えば、7つの色合い青の)助けて。

通常、すべてのアイテムにラベルを付ける必要はありません。正確な値は重要ですか?すべての値にラベルを付けないとグラフを解釈できない場合、グラフは機能しません。

私の試みに。週ごとの合計の明らかな重要性を考慮して、週ごとの累積合計をプロットしました。週ごとの合計と日を時間順に表示します。正確な日の値はそれほど明確ではありませんが、外れ値は依然として際立っています。

これらの種類の小さなラインプロット(スパークラインに縮小できます)サイズに)の場合は、参照線または参照領域があると便利です。説明のために、ターゲット範囲を追加しました。ターゲットが適切でない場合、参照は過去3週間の範囲または固定された参照値のようなものである可能性があります。

ここに画像の説明を入力してください

クイックスキャンの目標を下回っていた週を示すために赤を使用しました。

さらに多くの週で、それらを垂直リストではなくグリッドに整理するかもしれません。

ここに画像の説明を入力してください


これは素晴らしいと思います。学習時間とカバーされた情報を組み合わせる効果的な方法はありますか?(少なくとも私は印象が得られます)は、演習の重要な目的の1つと思われますか?最初のグラフィックでは、「学習時間」と「ページの完了」を連続して行うとかなり効果的であると思われます(つまり、学習時間を週の左の列にプロットし、ページを週の右の列に完了します) )。しかし、2番目のグラフィックで何がうまくいくかはわかりません。
シルバーフィッシュ

明らかに、1つの解決策は両方のシリーズを調査対象ページの2番目の垂直軸でオーバープロットすることですが、多くの人々はこれに対して強い意見を持っています。たとえば、Hadley Wickhamは故意にggplotに実装することを拒否します 通常はこれを避けますが、両方にターゲットがある場合は意味があります。これにより、時間とページのターゲット領域がきれいに揃うように、セカンダリy軸に自然なスケールが導入されます。このスケーリングの決定は、一般に複数のy軸で議論のある問題です。
シルバーフィッシュ

ありがとう@Silverfish!また、1つのグラフで2つのスケールを嫌いますが、両方のスケールをそれぞれのターゲットに対して同じスケールにできる場合は、うまくいくかもしれません。私の答えでは、1つのメジャーのみを表示することで、他のメジャーも同じ方法で別のグラフに表示されると想定したことを明示的に言っておく必要がありました。垂直リスト形式では、各メジャーはグラフの個別の列になる場合があります。
xan

これは別の素晴らしい答えです。私は間違いなくあなたが適用したターゲットのアイデアが好きです。私はすべての答えを見たので、今何をしているのか見なければなりません。ありがとう

5

私があなたを正しく理解している場合、折れ線グラフを使用したくない理由は、あなたがあまりにも多くの週があり、グラフが乱雑になるということです。

これが問題である場合、時系列をコンポーネントに分割できます。

毎日の変動

毎週のバリエーション

長期トレンド

他に何か。

William S. Clevelandは彼の本の1つでこれの良い例を示しています(私は私のオフィスにいないので、彼の本のどれが例を持っているか思い出せませんが、データを視覚化する、データをグラフ化する要素のどちらかです)。

RとSASの両方に、これを行うためのツールがあります。それらのいずれかにアクセスできますか?


私は自分のコンピュータ上でRを持っているが、私はめったにそれを使用していない(ただし学ぶために完全に喜んで)。

まあ、それは学習曲線を持っていますが、decompose()関数を調べます。あなたはあなたが望むものを得るためにいくつかの演奏をしなければならないかもしれません。また、クリーブランドの本を見つけることができれば、それらは傑出しています。
ピーターフロム-モニカの復職

3
RのドキュメントからPeterが言及したクリーブランドの例を以下に示します。Rがインストールされている場合は、例を実行できます:stat.ethz.ch/R-manual/R-devel/library/stats/html/stl.html
Kieran

@Kieran正しい出力?imgur.com/IzRC0h8

5

最初に、元の積み上げまたは分割された棒グラフにいくつかの異議を述べます。

a。色分けは完全に任意に見えます。したがって、凡例とグラフの間を繰り返し往復しない限り、グラフを調べることはできません。

b。非表示のバーセグメントとして、ゼロは暗黙的です。ゼロはバリエーションの一部です。

これらおよびその他の理由により、グラフをデコードするのは困難です。

とはいえ、グラフは、週ごとの合計の変動の研究にほとんど関心がある場合にメリットがあります。何週間も、多くのバーとしてプロットできます。対応する欠点は、数週間以内にバリエーションを研究することがますます難しくなるということです。

バックアップ:各問題には3つの変数があります。

  1. 学習時間またはページが完了しました。

  2. 曜日。

  3. 週番号。

週数が増えると、グラフがより詳細になります。課題は、その詳細を管理することです。

私はサイクルプロットを検討します(他の名前は文献で使用されていますが、ほとんどは季節変動を見るためのその使用に言及しています)。ここにナオミ・ロビンスによる明快な紹介があります。彼女の例には、あなたのような、週内および週間の変動に関心がある人が含まれています。


とても素敵なリンクをありがとう。あなたの反対意見の1つは、金曜日から木曜日まで(実際には下から上へ)日が積み上げられていることですが、読みにくいということは間違いなく有効な懸念事項です。

確かに、しかし、人々はまだ伝説を使用してデコードする必要があります。
ニックコックス14

Rには月プロットがあります実際毎週のデータで使用できるコマンドを-見stackoverflow.com/questions/5826703/...
紙魚を

5

折れ線グラフは、7日、14日、または28日の移動平均を移動する場合、おそらく解釈しやすいでしょう。それはそれらをスムーズにし、それでもあなたが傾向を見つけることを可能にします。

これは、Peter Flomのソリューションといくつかの類似点がありますが、かなり単純であるため、全体像を十分に伝えていませんが、ニーズには十分かもしれません。データをスプレッドシートに記録している場合、数式を設定することでスプレッドシート自体でそのような平均化を簡単に実行でき、新しいデータを入力するとグラフが自動的に更新されるという利点があります。

更新してグラフを含める

移動平均の折れ線グラフ

7日間のローリング平均のスプレッドシートグラフは見事ではありませんが、うまく機能しているようです-毎日の変動が平滑化されているため、傾向を検出しやすくなっています(理解できないほどノイズが多い同等の日次チャートと比較して)。このプロットでは、いくつかの重要な機能が適切に選択されています。たとえば、1月中旬に1時間ごとに大量の作業が行われましたが、1日あたりの平均ページ数が比例して増加することはありませんでした。クリスマスブレークは非常に可視的であり、個々のデータポイントが明確にプロットされている限り、誤解を招くことはありません(線だけが可視である場合、フラット期間がデータ不足によるものであると判断することは不可能です!それにもかかわらず、私は含めること強くお勧めします時間とページはゼロですが、テーブルの残りの日数。グラフはホバーするのではなく、これに応答することができます1.5 休憩中の週あたりの時間。

わずか50項目のデータでは、より長い期間にわたって平均化して、より長い実行傾向を検出する価値はありませんでした。同様に、季節的な分解に関するPeter Flomの優れたアイデアは、そのような限られたデータと戦うことになると思います。スプレッドシートで分解を実行する場合、ブレークをゼロデータとして含めることがさらに重要になります。

数式を再現するには、これを貼り付けて「日付」がセルにあるようにしA1ます。

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

5

あなたの質問を理解しているように、時間とページを別々に表示することは可能です。最初にそれを行います。その後、1つのプロットにTotalとPagesを表示します。実際の数値は最も重要なものではないと推測しています。生産性の高い週と平日の概要を把握することがより重要です。その場合、実際にはデータには1つの時間ディメンションしか存在しないため、自然な時間構造を維持することをお勧めします。週を区切る方法をまだ見つけることができます。

次のRコードとggplot2-packageを使用して、この最初のプロットを作成しました。以下のコードで、データがオブジェクトデータにロードされました。プロットはグループ化された棒グラフで、灰色のバーはページの週ごとの合計を示しています。

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

灰色のバーの高さは、ページの週の合計を示します。

これは明らかに完全ではありません。灰色のバーは、1日のバーと比較して、同じ量の読み取りに対してより大きな領域を持っているため、多くの部分を占めています。薄くすることもできますが、週を区切る方法が気に入っています。彼らは、どの曜日が同じ週であるかを非常にうまく示します-そうでなければ、必ずしも理解できるとは限りません。特にカウントがゼロだからです。

次のプロットでは、灰色のバーの高さとして平均ページ数(週内)を使用しました。

灰色のバーの高さは、ページの週平均を示します。

これはおそらくデータをよりよく表します。ただし、7日間が含まれていないため、0週目と7週目は誤解を招くことに注意してください。これは簡単に回避できます。

ページと時間を同時に表示したい場合は、連続した棒グラフを作成できます。2つの垂直スケールが同じではないため、少し混乱するかもしれません。一方、このように直接費やした時間と作業を比較するのはいいかもしれません。

連続したプロットで時間とページを組み合わせます。

編集:色は本当にそれほど必要ではなく、xan(下記コメントを参照)に触発されていることを理解すると、プロットをこのようなものに単純化できます。追加の視覚的なガイドを提供するために、私は木曜日をマークしました。また、すべてのバーに同じ色を使用して、いくつかの(任意の)日を強調しすぎないようにすることもできます。

よりシンプルなバージョン。

最後に、値を平均値で除算することにより、軸のスケーリングを変えてみることもできます。これにより、1が「通常の」値になります。この点を強調するために1の行を含めることができます-これは連続プロットで行われます。これにより、平均作業負荷の点で「良い」日と「悪い」日が区別されます。

ここに画像の説明を入力してください

このプロットでは、1つのユニットが、現在比較可能な両方の軸の同じ距離に対応することを確認することもできます。

また、私は最初のバージョンで日を台無しにしたことに注意してください。コードとプロットを修正したので、今から週7日間練習します。

最後のプロットを生成したコード:

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

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

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

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

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

これはオリジナルを改善するという精神に最も近いようで、私はそのアイデアが好きです。しかし、オリジナルまたはあなたのものの任意/虹色は好きではありません。シーケンシャルカラーセットを試してください。逆さまのバーも私には機能しません。
-xan

連続した色は改善されると思います-提案をありがとうございます。一方で、毎週の区切り記号(月曜日は1日目、火曜日は2日目など)があるため、色はそれほど重要ではないと思います。私も私の答えで示唆したように、背中合わせのプロットについては同意しています。このプロットの改善点は、それぞれの毎日の平均に従って両方の垂直軸をスケーリングすることです。これにより、週とPagesの読み取り/時間の比較が容易になります。
swmo

色が重要ではないという言及がありましたが、色のバリエーションを削除するとうまくいく可能性があります。曜日はすでに場所によって区別されています。または、水曜日を追加のアンカーとして別の色合いにすることもできます。
xan

非常に素晴らしい!私はまだ他の答えを経験していませんが、これは確かにすでに大きな改善です!どうもありがとうございます

1
コメントのアイデアを含めるように回答を編集しました。@挑戦にコミットして、私はあなたがそれを助けてくれてうれしいです。
swmo

1

変化する バツ 平日への軸、みましょう y 同じおよび:

  1. グループ化変数として2週間の行としてデータをプロットします-週ごとに2つの独立した行を取得するには、
  2. または、グループ化されたバープロットを使用します。各週には、1週目と2週目に2つのバーがあり、それぞれ1日あたりのページ数/時間のカウントがあります。

上記の1.と、残念なことに2.はあまり意味がありません。ご回答ありがとうございます。

問題ありません...見栄えはよくありませんが、使用しているソフトウェアやグラフィカルな編集の問題です。
ティム

1.1週目または2週目が良くなっているかどうかはわかりません。さらに数週間を追加すると、混乱しすぎます。2.私は実際にこれを気にしません、それは実際にはかなりいいです。たぶん、私はオリジナルとこれを一緒にして、それをより明確にすることができました。(また、今上に示す)

1

以下のプロットは、積み重ねられたバーの代わりに線を使用して、各週の累積学習時間と総ページ数を示します。不足している週はゼロで埋めましたが、必要に応じて除外できます。のRデータ処理とプロット生成コードは、グラフの下に掲載されています。

ここに画像の説明を入力してください

以下の手順を実行する際に、まず質問に投稿されたデータをというフレームにロードしましたdat

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

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

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

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

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

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

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

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

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

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

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

これは本当に良いアイデアであり、あなたが見ている日を決定するのが難しいという問題を間違いなく解決します。ありがとう

0

別のオプションはバブルチャートで、1つの変数に垂直の高さを、もう1つの変数にドットサイズを設定できます。以下では、日付(日)は水平、学習時間は垂直、1日あたりのカバーページ数はバブルサイズ、週は色付きです。

ここに画像の説明を入力してください


0

3Dでプロットできます。曜日が正しく計算されていることを確認したり、最適な視野角を見つけたりすることはできませんでしたが、これはあなたにアイデアを与えるはずです。さらなる装飾も可能です。たとえば、ポイントを線で接続し、毎週月曜日に対応するようにグリッド線を移動する方が良い場合があります。

実際に試してみると非常に興味深いのは、左右のグリッド線(この角度で表示)を同じ曜日(月曜日など)に対応させ、その下と右下の壁に箱ひげ図を置くことです。グリッド線。ボックスプロットは、各週の合計時間と合計ページにそれぞれ対応します。私はrglでできることはほぼ確実ですが、いじくり回す必要があります。それは価値があるかもしれません。バイオリンのプロットまたはビーンプロットはさらに良いかもしれません。

ここに画像の説明を入力してください

データ(Rへの入力用):

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

プロットを作成します。

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

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

-1

(年の)週番号、曜日、時間とページのファセットを含むヒートマップが役立つ場合があります。

ここに画像の説明を入力してください

2つの高い値を削除すると、プロットの色のグラデーションが改善されます。

ここに画像の説明を入力してください

次の棒グラフも役立つ場合があります。

ここに画像の説明を入力してください

作業が行われなかった2週間の期間を明確に示しています。

線でプロットすることも便利です(線は散らかっていません。2本の線だけを残して、ポイントを削除することもできます)

ここに画像の説明を入力してください

わかりやすくするためにプロットを単純化しながら、情報を明確に伝えます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.