Bir grafikte üç parça bilgi görüntüleme


15

Not: Şimdi 50 puan ham veri eklenmiştir.

Ne kadar çalışma yaptığımı ve hafta boyunca kaç sayfayı tamamladığımı, güne göre ayrılmış olarak göstermek istiyorum ve bunu aşağıda gösterildiği gibi yaptım:resim açıklamasını buraya girin

İnsanlara grafikleri anlayamadıklarını söyledim, ama bunları nasıl gösterebileceğim hakkında hiçbir fikrim yok. Kümülatif bir tasvir yapmadan aslında üç boyuta ihtiyacım olduğu için. Çok sayıda çizgi grafik kullanmaktan kaçınmak istiyorum, çünkü birkaç hafta sonra grafikler okunaksız hale gelecek. Yapabileceğim bir şey yok mu?

Bunları nasıl daha net gösterebilirim?

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

Örnek veriler gönderebilirseniz, ilgilenenler size çözümlerini gösterebilir ve gösterebilir. Gerçekçi olmak için, birkaç haftaya ihtiyaç vardır, çünkü sorunun özü hafta sayısı arttıkça olan şeydir.
Nick Cox

@NickCox Verilerin nasıl değişeceğinden dürüstçe emin olmadığım için birkaç hafta içinde yeniden gönderebilirim ve yalnızca ilk 13 gününü

@NickCox Ham verileri nasıl gönderirim?

1
Benim tavsiyem biraz beklemek. Soruyu güncelleyerek buna dikkat ettiniz. Yeni yanıtlar alıp almadığınızı görün.
Nick Cox

1
Bu veriler hakkında ne göstermek istiyorsunuz ? Hangi hikayeyi anlatmak istiyorsun? İnsanların çubuk grafiklerle verilerinizi anlamalarını sağlamaya çalışıyorsunuz?
gung - Monica'yı eski

Yanıtlar:


7

Tarih / takvim tabanlı verileri görselleştirmenin bir yolu, verileri renkle kodlayan bir matris ekranıdır. Matris (veya tablo), satırlar haftaları ve sütun günleri temsil edecek şekilde düzenlenir. İstenirse, haftalık toplam için bir son sütun ekleyebilirsiniz.

Veriler doğru bir şekilde düzenlenmişse, koşullu biçimlendirme ile Excel'de bir şekilde uygulanabilir. Özellikle, orijinal verilerinize bakan formüllerle bir değerler tablosu oluşturabilirsiniz. Oradan, sonucu görüntülemek için koşullu biçimlendirmeyi kullanabilirsiniz.

Sonuç böyle görünebilir. Maalesef tarih biçimini değiştirdim. Hücre H1 formülü aşağıdaki gibidir: "=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)". Günleri doğru sırayla almak için biraz matematik yapıyor. Umarım basittir.

Matris düzenlemesi ile koşullu biçimlendirmenin görüntüsü

Gerçekten zarfı itmek istiyorsanız, bu verileri görüntülemek için d3 ve takvim eklentisi gibi bir çerçeve kullanabilirsiniz . Bu, değerinden daha fazla bir taahhüt olabilir.

Bu biçim GitHub'ın zaman içinde kullanıcı etkinliğini / katkılarını görüntüleme biçimine çok benzer. İşte bir kullanıcı (ben değil!). resim açıklamasını buraya girin


2
(+1) Bu yaklaşımı seviyorum, özellikle de verilerin girildiği e-tabloda kullanım için çok uygun olduğu için. Bu grafik ekran etkili bir şekilde bir ısı haritasıdır . Düzenli olarak benzer kurulumları kendim kullanıyorum ve bir zayıflığın, trendlerin yönlerinin seçilmesinin zor olabileceğini görüyorum, bu yüzden daha ince detaylar göstermek için bunu bir çizgi grafik çeşidi ile tamamlamak iyi olabilir (Peter Flom, Nick Cox ve ben iyi önerilerde bulundum).
Silverfish

6

Orijinalin öne çıkan özelliği haftalık toplamlardır. Bireysel değerler ancak renkleri öğrendikten sonra anlamlıdır ve bunun, yeni izleyiciler için planın işe yaramamasının büyük bir nedeni olduğunu düşünüyorum. Bununla ilgili olarak, günlerin zaman yönü kaybolur. Bir sıralı renklerin kümesi olabilir (örneğin, 7 tonları mavi) yardımcı olur.

Normalde her öğeyi etiketlemeyi umursamıyorum - kesin değerler önemli mi? Etiketlenen her değer olmadan yorumlayamazsanız grafik işini yapmaz.

Denememe devam ediyorum . Haftalık meblağların belirgin önemi göz önüne alındığında, haftalık kümülatif meblağlar çizdim. Haftalık toplamları ve günleri zaman sırasına göre gösterir. Tam gün değerleri daha az nettir, ancak aykırı değerler yine de göze çarpacaktır.

Bu tür küçük çizgi grafikleri için ( mini grafik boyutuna küçültülebilir), bir referans çizgisine veya alana sahip olmak yardımcı olur. Örnek olarak, bir hedef aralık ekledim. Bir hedef uygun değilse, referans son üç haftadaki aralık veya sabit referans değeri gibi bir şey olabilir.

resim açıklamasını buraya girin

Hızlı tarama için hangi haftaların hedefin altında olduğunu belirtmek için kırmızı kullandım.

Çok daha fazla haftada, bunları dikey bir liste yerine bir ızgara halinde düzenleyebilirsiniz.

resim açıklamasını buraya girin


Bence bu mükemmel. Çalışma saatlerini ve kapsanan sayfaları birleştirmenin etkili bir yolu var mı? İlk grafikte arka arkaya "çalışma saatleri" ve "sayfaların tamamlanması" nın oldukça etkili olacağını düşünüyorum (yani çalışma saatleri, yılın haftasının solundaki sütunda çizilen sayfalar ve yılın haftası sağındaki sütunda tamamlanan sayfalar ). Ama ikinci grafikte neyin iyi çalışacağından emin değilim.
Silverfish

Açıkçası bir çözüm, incelenen sayfalar için her iki seriyi ikincil bir dikey eksenle overplot etmek olacaktır, ancak birçok insan buna karşı güçlü görüşlere sahiptir, örneğin Hadley Wickham bunu ggplot'ta uygulamayı reddeder. Genellikle bunu yapmaktan kaçınırdım, ancak her ikisi için de hedefler varsa mantıklı olabilir - bu, saatlerin ve sayfaların hedef alanlarının düzgün bir şekilde hizalanmasını sağlamak için ikincil y ekseni için doğal bir ölçek getirecektir. Ölçeklendirme kararı genellikle birden fazla y ekseni ile tartışmalı bir konudur.
Silverfish

Teşekkürler @Silverfish! Aynı zamanda bir grafikte iki skaladan da uzak duruyorum, ancak her ikisinin de ilgili hedeflerine göre aynı ölçeğe yerleştirilebileceğini söylediğiniz gibi, işe yarayabilir. Cevabımda açıkça söylemeliyim ki, sadece bir ölçü göstererek diğer tedbirin aynı şekilde ama ayrı grafiklerde gösterileceğini varsaydım. Dikey liste formunda, her hesaplama ayrı bir grafik sütunu olabilir.
xan

Bu başka bir harika cevap. Uyguladığınız hedef fikri kesinlikle seviyorum. Şimdi tüm cevapları gördüğüm için ne yaptığımı görmem gerekecek. Teşekkür ederim

5

Sizi doğru anlarsam, çizgi grafiklerini kullanmak istememenizin nedeni çok fazla hafta geçirmeniz ve grafiklerin dağınık hale gelmesidir.

Sorun buysa, zaman serilerini bileşenlere bölebilirsiniz:

Günlük varyasyon

Haftalık değişim

Uzun vadeli eğilim

Başka herhangi bir şey.

William S. Cleveland, kitaplarından birinde bunun güzel bir örneğini gösteriyor (Ofisimde değilim ve hangi kitaplarının örneğe sahip olduğunu hatırlayamıyorum ama verileri Görselleştirme veya Verileri grafikleme öğeleri ).

Hem R hem de SAS'ın bunu yapmak için araçları vardır. İkisinden birine erişiminiz var mı?


Bilgisayarımda R var, ancak nadiren kullandım. (Tamamen öğrenmeye istekli)

Bir öğrenme eğrisi var ama decompose () işlevine bakın. İstediğinizi elde etmek için biraz oynamak zorunda kalabilirsiniz. Ayrıca, Cleveland'ın kitaplarını bulabilirseniz olağanüstü.
Peter Flom - Monica'yı eski durumuna döndürün

3
İşte Peter'ın R belgelerinden bahsettiği Cleveland örneği. R yüklüyse, şu örneği çalıştırabilirsiniz: stat.ethz.ch/R-manual/R-devel/library/stats/html/stl.html
Kieran

@Kieran Doğru çıktı? imgur.com/IzRC0h8

5

İlk olarak orijinal yığılmış veya bölünmüş çubuk grafiklerinize bazı itirazları açıklayacağım.

a. Renk kodlaması tamamen keyfi görünür. Dolayısıyla grafik, efsane ve grafik arasında tekrar tekrar ileri gitmeden incelenemez.

b. Sıfırlar, görünmez çubuk segmentleri olarak örtüktür. Sıfırlar varyasyonun bir parçasıdır.

Bu ve diğer nedenlerle, grafiklerin kodunu çözmek zordur.

Bununla birlikte, eğer ilgi çoğunlukla haftadan haftaya toplamlar arasındaki değişimi inceliyorsa, grafiğin değeri vardır. Haftalar kadar çubuk çizilebilir. Buna karşılık gelen dezavantaj, haftalar içinde varyasyonları incelemenin zorlaşmasıdır.

Yedekleme: Burada her problemde üç değişken vardır.

  1. Çalışma süresi veya sayfalar tamamlandı.

  2. Haftanın günü.

  3. Hafta sayısı.

Hafta sayısı arttıkça, herhangi bir grafik daha ayrıntılı hale gelecektir. Zor olan bu ayrıntıyı kontrol altında tutmaktır.

Bir döngü grafiğini düşünürüm (literatürde diğer isimler kullanılmıştır, ancak çoğu mevsimsel varyasyona bakmak için kullanımına atıfta bulunur). Burada Naomi Robbins tarafından berrak bir giriş var Örnekleri sizinki gibi ilginin haftalar içinde ve arasında değişimler olduğu örnekleri içeriyor.


Bu çok güzel bağlantı için teşekkürler. İtirazınızla ilgili bir yorumda, günler Cuma -> Perşembe günleri (aşağıdan yukarıya) istiflenir, ancak bazı günlerin eksik olması kesinlikle okunabilirlik açısından geçerli bir endişedir.

Gerçekten de, insanların hala kodu çözmek için efsaneyi kullanmaları gerekiyor.
Nick Cox

R'nin haftalık verilerde kullanılabilecek bir ay grafiği komutu vardır - bkz. Stackoverflow.com/questions/5826703/…
Silverfish

5

Yedi günlük, on dört günlük veya belki 28 günlük hareketli bir ortalama alırsanız çizgi grafiklerin yorumlanması muhtemelen daha kolay olacaktır. Bu onları düzeltir ve hala trendleri tespit etmenizi sağlar.

Bunun Peter Flom'un çözümü ile bazı benzerlikleri var, ancak daha basit ve bu nedenle tam bir resim anlatmıyor - ancak ihtiyaçlarınız için yeterli olabilir. Verilerinizi bir e-tabloya kaydediyorsanız, bu tür bir ortalamanın bazı formüller ayarlayarak e-tablonun içinde kolayca gerçekleştirilebilmesi avantajı vardır ve yeni verileri doldururken grafik otomatik olarak güncellenir.

Grafikleri içerecek şekilde güncelleme

Hareketli ortalamalar için çizgi grafikler

Yedi günlük yuvarlanma ortalamaları için elektronik tablo grafiği belirsizdir, ancak işini iyi yapıyor gibi görünüyor - günlük varyasyon yumuşatılıyor, böylece eğilimlerin algılanması daha kolay (anlaşılamayacak kadar gürültülü olan eşdeğer günlük grafikle karşılaştırıldığında). Bazı temel özellikler bu arsa tarafından iyi seçilmiştir: örneğin, Ocak ayı ortasında saatlik olarak büyük miktarda çalışma yapıldı, ancak buna günde tamamlanan ortalama sayfalarda orantılı bir artış eşlik etmedi. Noel tatili çok görünür ve tek tek veri noktaları açıkça çizildiği sürece çok yanıltıcı değil (sadece çizgi görünürse, düz sürenin veri eksikliğinden kaynaklandığını belirlemek imkansız olurdu!). Yine de şiddetle tavsiye ediyorum dahil1.5

Sadece elli veri maddesi ile, daha uzun çalışma eğilimlerini tespit etmek için daha uzun bir süre boyunca ortalama almaya çalışılmaya değer görünmüyordu. Benzer şekilde Peter Flom'un mevsimsel ayrışma konusundaki mükemmel fikrinin bu kadar sınırlı verilerle mücadele edeceğinden şüpheleniyorum. Ayrıştırma işlemini e-tablonuzda yapsaydınız, kesmeyi sıfır veri olarak dahil etmek daha da önemli olurdu.

Formüllerimi yeniden oluşturmak için bunu 'Tarih' hücrede olacak şekilde yapıştırın 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

Sorunuzu anladığım için, saatleri ve sayfaları ayrı ayrı görüntülemek mümkün olacaktır. Önce ben yaparım. Daha sonra, Toplam ve Sayfaları bir grafikte göstereceğim. Gerçek sayıların en önemli şey olmadığını tahmin ediyorum - üretken olan ve olmayan haftalara ve hafta içi günlere genel bir bakış elde etmek daha önemlidir. Bu durumda, verilerinizde tek bir geçici boyut olduğu için doğal zamansal yapıyı korumanızı öneririm. Yine de haftaları sınırlamanın bir yolunu bulabiliriz.

Bu ilk çizimi oluşturmak için aşağıdaki R kodunu ve ggplot2 paketini kullandım. Verileriniz, aşağıdaki koddaki nesne verilerine yüklendi. Grafik, gruplandırılmış bir çubuk grafiktir ve gri çubuklar haftalık sayfa toplamlarını gösterir.

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

Gri çubukların yüksekliği sayfaların haftalık toplamını gösterir.

Bu kesinlikle mükemmel değil. Gri çubuklar, bir gün çubuğuna kıyasla aynı miktarda okuma için daha geniş bir alana sahip olduklarından daha baskındır. Onları inceltebilirdik, ama haftaları sınırlandırma yöntemlerini seviyorum. Hangi haftaların aynı haftada olduğunu gayet güzel gösteriyorlar - aksi takdirde anlaşılması gerekmeyecek bir şey. Özellikle sıfır sayım olduğu için.

Bir sonraki grafikte, gri çubuğun yüksekliği olarak ortalama sayfa sayısını (hafta içinde) kullandım.

Gri çubukların yüksekliği sayfaların hafta ortalamasını gösterir.

Bu muhtemelen verileri daha iyi temsil eder. Ancak, 0 ve 7. haftaların yanıltıcı olduğuna dikkat edin, çünkü 7 gün içermediler. Bu sorunu kolayca çözebilirsiniz.

Sayfaları ve zamanı aynı anda görüntülemede ısrar ediyorsanız, arka arkaya çubuk grafiği yapabilirsiniz. İki dikey ölçek aynı olmadığından biraz kafa karıştırıcı olabilir. Öte yandan, harcanan zamanı ve doğrudan bu şekilde yapılan işleri karşılaştırmak güzel olabilir.

Zaman ve sayfaları arka arkaya çizimde birleştirme.

DÜZENLEME: Renklerin gerçekten o kadar çok gerekli olmadığını ve xan'dan esinlenerek (aşağıdaki yorumlara bakın), grafiği böyle bir şeye basitleştirebilirsiniz. Ek bir görsel rehber vermek için Perşembe günleri işaretledim. Ayrıca, bazı (keyfi) günleri fazla vurgulamamak için tüm çubuklar için aynı rengi kullanmayı tercih edebilirsiniz.

Daha basit bir versiyon.

Son bir notta, değerlerinizi ortalama değere bölerek eksenleri farklı ölçeklendirmeyi de deneyebilirsiniz. Bu 1'i "normal" bir değer yapar. Bu noktayı vurgulamak için 1'e bir satır ekleyebiliriz - şimdi arka arkaya çizimde yapılıyor. Bu, ortalama iş yükü açısından "iyi" yi "kötü" günlerden ayırır.

resim açıklamasını buraya girin

Bu grafikte, bir birimin şimdi her iki eksende de aynı mesafeye karşılık geldiğinden emin olabiliriz.

Ayrıca ilk sürümdeki günleri berbat ettiğime dikkat edin. Kodu ve grafikleri düzelttim ve şimdi haftanın yedi günü pratik yapacağım.

Son grafiği üreten kod:

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

Bu en çok orijinali geliştirme ruhunda görünüyor ve fikri seviyorum. Orijinal ya da sizin için rastgele / gökkuşağı renklerini sevmiyorum. Sıralı bir renk kümesi deneyin. Baş aşağı çubuklar da benim için çalışmıyor.
xan

Bence sıralı renkler bir gelişme olabilir - öneri için teşekkür ederim. Öte yandan, bize rehberlik edecek haftalık sınırlayıcılarımız olduğu için (Pazartesi'nin ilk günü, ikinci Salı, vb.) Renklerin o kadar önemli olduğunu düşünmüyorum. Cevabımı da ima ettiğim için arka arkaya arsa hakkında anlaştık. Bu grafikte bir gelişme, her iki dikey ekseni günlük ortalama araçlarına göre ölçeklendirmek olabilir. Bu, haftalar ve Sayfa okuma / Zaman harcaması arasındaki karşılaştırmayı kolaylaştıracaktır.
swmo

Artık renklerin önemsiz olduğuna dikkat çekildiğinde, renk varyasyonunun kaldırılmasının işe yarayabileceği bana geliyor. Haftanın günleri konumla zaten ayırt edilir. Ya da belki Çarşamba'yı ek bir çapa olarak farklı bir gölge yapmak.
xan

Çok hoş! Ben henüz diğer cevapları geçmedim, ama bu kesinlikle büyük bir gelişme! Çok teşekkür ederim

1
Cevabı, yorumlardan gelen fikirleri içerecek şekilde düzenledim. @Bir meydan okumayı kabul ederek, yararlı bulduğunuza sevindim.
swmo

1

xy

  1. verileri gruplama değişkenleri olarak iki haftalık satırlar olarak çizin - böylece her hafta iki ayrı satır elde etmek için,
  2. veya hafta içi her gün için hafta 1 ve hafta 2 için her biri günde sayfa / saat olmak üzere iki çubuğunuzun bulunduğu gruplandırılmış çubuk grafikleri kullanın.

Lütfen yukarıda 1. ve 2. ne yaptığına bakın maalesef çok anlamlı görünmüyor. Cevabınız için teşekkür ederim.

Hiç sorun görmüyorum ... Güzel görünmüyor ama kullandığınız yazılım ve / veya grafik düzenleme meselesi.
Tim

1.Hafta 1 veya 2'nin daha iyi olup olmadığını gerçekten anlayamazsınız ve birkaç hafta daha eklenirse çok kaotik hale gelir. 2. Aslında bunu umursamıyorum, aslında oldukça güzel. Belki daha net hale getirmek için orijinali ve bunu bir araya getirebilirim. (Ayrıca şimdi yukarıda gösterilmiştir)

1

Aşağıdaki grafikte, her hafta içinde yığılmış çubuklar yerine satırlar kullanılarak yapılan toplam Çalışma Saati ve Toplam Sayfa Sayısı gösterilmektedir. Eksik haftaları sıfırlarla doldurdum, ancak isterseniz hariç tutabilirsiniz. RVeri işleme ve arsa üretimi için kod grafiğinin altındaki nakledilir.

resim açıklamasını buraya girin

Aşağıdaki adımları uygularken, ilk olarak soruya gönderilen verileri adlı bir veri çerçevesine yükledim. 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)

Bu gerçekten iyi bir fikir ve hangi güne baktığınızı belirlemenin zor olması sorununu kesinlikle çözüyor. Teşekkür ederim

0

Başka bir seçenek, bir değişken için dikey yüksekliğe ve diğeri için nokta boyutuna sahip olabileceğiniz kabarcık grafiği. Aşağıda, tarih (gün) yataydır, Çalışılan saatler dikeydir, Günlük olarak kapsanan sayfalar kabarcık boyutundadır ve hafta renklidir.

resim açıklamasını buraya girin


0

3B olarak çizim yapabilirsiniz. Haftanın gününün doğru bir şekilde hesaplandığını, en iyi görüş açısını vb. Bulduğunu doğrulamadım, ancak bu size fikir vermelidir. Başka süslemeler de mümkündür. Örneğin, noktaları bir çizgiye bağlamak ve kılavuz çizgilerini her Pazartesi gününe karşılık gelecek şekilde taşımak daha iyi olabilir.

Aslında denemek için çok ilginç olan şey, her bir sol-sağ ve yukarı-aşağı ızgara çizgisinin (bu açıda gösterildiği gibi) haftanın aynı gününe (örneğin pazartesi) karşılık gelmesi, daha sonra kutuların alt ve arka sağ duvarlarına kılavuz çizgileri. Kutu grafikleri, sırasıyla her hafta için toplam saat ve toplam sayfa sayısına karşılık gelir. Ben rgl ile mümkün olacak, ama biraz tamircilik gerektirecek eminim. Buna değer olabilir. Keman grafikleri veya fasulye parçaları daha da iyi olabilir.

resim açıklamasını buraya girin

Veriler (R'ye giriş için):

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

Arsa yapın:

#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

Hafta numarası (yılın), haftanın günü ve saat ve sayfa yüzleri içeren ısı haritasından sonra yardımcı olabilir:

resim açıklamasını buraya girin

2 yüksek değerin kaldırılması, çizimde daha iyi renk gradyanları sağlar:

resim açıklamasını buraya girin

Aşağıdaki barchart da yararlı olabilir.

resim açıklamasını buraya girin

Hiçbir işin yapılmadığı 2 haftalık bir dönemi açıkça göstermektedir.

Çizgilerle çizim de yararlı olabilir (çizgiler dağınık değildir; noktalar sadece iki çizgiyi koruyarak çıkarılabilir)

resim açıklamasını buraya girin

Kolay anlaşılması için planı basitleştirirken bilgileri açıkça iletirler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.