2015-09-15 9 views
5

Bu çizdirme dikdörtgenler - Geçersiz giriş: time_trans sınıf POSIXct ait nesnelerle çalışan tek

veri

df <- structure(list(IndID = structure(c(16L, 15L, 14L, 13L, 12L, 11L, 
10L, 9L, 8L, 7L, 6L, 5L, 4L, 3L, 2L, 1L), .Label = c("16", "15", 
"14", "13", "12", "11", "10", "9", "8", "7", "6", "5", "4", "3", 
"2", "1"), class = "factor"), StartDate = structure(c(1313042400, 
1312956000, 1313560800, 1363672800, 1374040800, 1374040800, 1374040800, 
1374040800, 1374040800, 1374040800, 1374040800, 1365832800, 1365919200, 
1366178400, 1395727200, 1395813600), class = c("POSIXct", "POSIXt" 
)), EndDate = structure(c(1377928800, 1378015200, 1378015200, 
1386572400, 1410760800, 1410760800, 1410760800, 1410674400, 1410760800, 
1406959200, 1399356000, 1427868000, 1394517600, 1428213600, 1428040800, 
1420959600), class = c("POSIXct", "POSIXt"))), .Names = c("IndID", 
"StartDate", "EndDate"), row.names = c(NA, -16L), class = "data.frame") 

    IndID StartDate EndDate 
1  1 2011-08-11 2013-08-31 
2  2 2011-08-10 2013-09-01 
3  3 2011-08-17 2013-09-01 
4  4 2013-03-19 2013-12-09 
5  5 2013-07-17 2014-09-15 
6  6 2013-07-17 2014-09-15 
var ve bu arsa

library(lubridate) 
    require(gglopt2) 
    df$IndID <- factor(df$IndID, levels = rev(df$IndID)) 



p1 <- ggplot(df, aes(x=IndID, fill = IndID))+ 
     geom_rect(aes(x = IndID, xmin = as.numeric(IndID) - 0.45, xmax = as.numeric(IndID) + 0.45, ymin = StartDate, ymax = EndDate))+ 
     coord_flip()+ 
     xlab("IndID")+ 
     ylab("Time")+ 
     ggtitle("Individual Monitoring Periods")+ 
     geom_text(aes(y = StartDate + as.difftime(8, unit = "weeks"), label = paste(month(StartDate, label = T), year(StartDate), sep = "-"))) + 
     geom_text(aes(y = EndDate - as.difftime(9, unit = "weeks"), label = paste(month(EndDate, label = T), year(EndDate), sep = "-"))) 

    p1 

enter image description here

Ben Ayrıca yapabilir, Her yıl 19 Haziran ile 19 Ekim arasında bölgeyi gölgelemek istiyorum. Bunu yapmak için, data.frame tarihlerini daha sonra data.frame numaralı yeni bir POSIXct biçimine dönüştürdüm. (Evet, bu aksak ..)

temp <- data.frame(
    start = as.Date(c('2011-06-19', '2012-06-19', '2013-06-19', '2014-06-19', '2015-06-19')), 
    end = as.Date(c('2011-10-19', '2012-10-19', '2013-10-19', '2014-10-19', '2015-10-19'))) 
str(temp) 
dateRanges <- data.frame(
    start = as.POSIXct(temp [,1], "%Y-%m-%d") + hours(6), 
    end = as.POSIXct(temp [,2], "%Y-%m-%d") + hours(6)) 
str(dateRanges) 

Aşağıdaki kod ile arsa yeni dikdörtgenler eklemeye çalıştığınızda, ben sonrası başlığında belirtilen hata alıyorum.

p1 + geom_rect(data = dateRanges, aes(xmin = start , xmax = end, ymin = -Inf, ymax = Inf), inherit.aes= F, alpha = 0.4, fill = c("lightblue")) 

Bildiğim kadarıyla dateRanges ait str() bakarak söyleyebilirim, bunların doğru POSIXct sınıf olarak biçimlendirilir.

similar post here'u görebildim ama yine de ilgili konular arasındaki noktaları birleştirmek ve sorunumu gidermek için mücadele ediyorum. Önerileriniz için şimdiden teşekkür ederiz.

+1

: İlk faktörlerin ekseni ve seviyeleri ile karıştırmasını önlemek için çağrı biz arkasında böylece çubukları yapar geom_rect aramak zorunda ve biz aes dışına xMin ve xmax hareket Belki de 'gantt-chart' etiketini eklemelisiniz ya da sadece bir yerde terimden bahsetmeli, bu da gelecekteki aramalar için yardımcı olabilir. – maj

cevap

4

Sorununuz, ilk aramanıza coord_flip() koştu. Arsa ters çevrilmiş, ancak ggplot hala x ve y'nin orijinal x ve y olduğunu düşünüyor.

Yani, sadece son geom_rect da x ve y aes geçiş düzeltmek için:

p1 + geom_rect(data = dateRanges, aes(ymin = start , ymax = end, xmin = -Inf, xmax = Inf), inherit.aes= F, alpha = 0.4, fill = c("lightblue")) 
p1 

enter image description here

EDIT: çubukları yapmak için geride işe yaramaz biraz gerektirir.

p1 <- ggplot(df, aes(x=IndID, fill = IndID))+ 
    geom_rect(data = dateRanges, aes(ymin = start, ymax = end), xmin = -Inf, xmax = Inf, alpha = 0.4, inherit.aes=FALSE, fill = "lightblue")+ 
    geom_rect(data = df, aes(x = IndID, xmin = as.numeric(IndID) - 0.45, xmax = as.numeric(IndID) + 0.45, ymin = StartDate, ymax = EndDate))+ 
    coord_flip()+ 
    xlab("IndID")+ 
    ylab("Time")+ 
    ggtitle("Individual Monitoring Periods")+ 
    geom_text(aes(y = StartDate + as.difftime(8, unit = "weeks"), label = paste(month(StartDate, label = T), year(StartDate), sep = "-"))) + 
    geom_text(aes(y = EndDate - as.difftime(9, unit = "weeks"), label = paste(month(EndDate, label = T), year(EndDate), sep = "-"))) 

p1 

enter image description here

+0

Mükemmel! çok yararlı. Ayrıca, yeni gölgelemenin arsanın "arkasına" zorlanmasının bir yolu var, böylece ilk arsadaki dikdörtgenler üstte. –

+0

Yeni çağrı kodunuzu ilk aramaya ekleme (örneğin: p1 <- ggplot (df, aes (x = IndID, fill = IndID)) + \t geom_rect (data = dateRanges, aes (ymin = start, ymax = end) , xmin = -Inf, xmax = Inf), inherit.aes = F, alfa = 0,4, dolgu = c ("lightblue")) + geom_rect (aes (x = IndID, xmin = as.numeric (IndID) - 0,45 , xmax = as.numeric (IndID) + 0.45, ymin = StartDate, ymax = EndDate)) + ...) "Hata: Sürekli skalaya verilen ayrık değer" hatasıyla sonuçlanır. Başka bir şey eksik olmalıyım ... –

+0

Mükemmel! ek çözüm için teşekkürler! –

İlgili konular