2012-05-07 24 views
5

Yalnızca renklendirmeyle ayırt edilmesi zor olan bazı zaman noktalarıyla bir çizgi grafiğim var ve bu nedenle çizimdeki zaman noktalarını etiketlemek istiyorum, ancak etiketler çakışıyor (aşağıdaki tabloya bakınız) Etiketleri okumak zor olduğu bir şekilde. 'Yığın' etiket veya bunların üst üste gelmemesine sağlayabilirsiniz bir şekilde (script) için bir yol olup olmadığınıgeom_point kullanarak metni geom_text kullanarak düzenleyin

arsa anda bu gibi bakmak,

current plot

merak ediyorum. Herhangi bir yardım mutluluk duyacağız

 - - >

böyle bir şey. İşte

require(ggplot2) 
require(plyr) 
require(reshape) 

# create sample data 
set.seed(666) 
dfn <- data.frame(
Referral = seq(as.Date("2007-01-15"), len= 26, by="23 day"), 
VISIT01 = seq(as.Date("2008-06-15"), len= 24, by="15 day")[sample(30, 26)], 
VISIT02 = seq(as.Date("2008-12-15"), len= 24, by="15 day")[sample(30, 26)], 
VISIT03 = seq(as.Date("2009-01-01"), len= 24, by="15 day")[sample(30, 26)], 
VISIT04 = seq(as.Date("2009-03-30"), len= 24, by="60 day")[sample(30, 26)], 
VISIT05 = seq(as.Date("2010-11-30"), len= 24, by="6 day")[sample(30, 26)], 
VISIT06 = seq(as.Date("2011-01-30"), len= 24, by="6 day")[sample(30, 26)], 
Discharge = seq(as.Date("2012-03-30"), len= 24, by="30 day")[sample(30, 26)], 
Patient = factor(1:26, labels = LETTERS), 
openCase = rep(0:1, 100)[sample(100, 26)]) 

# set today's data for cases that do not have an Discharge date 
dfn$Discharge[ is.na(dfn$Discharge) ] <- as.Date("2014-01-30") 

mdfn <- melt(dfn, id=c('Patient', 'openCase'), variable_name = "Visit") 
names(mdfn)[4] <- 'Year' # rename 

# order data in mdfn by 'Referral' in dfn 
mdfn$Patient <- factor(mdfn$Patient,levels = 
(dfn$Patient[order(dfn$Referral)]),ordered = TRUE) 

# subset a dataset to avoid 'Discharge' for cases that are not closed 
mdfn2 <- subset(mdfn,!(Visit=="Discharge" & Year > as.Date("2014-01-01"))) 

# the plot as it looks now 
ggplot(mdfn, aes(Year, Patient)) + 
    geom_blank() + 
    geom_line(data = mdfn[mdfn$openCase == 0,], colour = "black") + 
    geom_line(data = mdfn[mdfn$openCase == 1,], colour = "grey") + 
    geom_point(data = mdfn2, aes(colour = Visit), size = 4, shape = 124) + 
    geom_text(data=mdfn2, mapping=aes(x=Year, y=Patient, 
    label=substr(Visit, 1, 7), colour=Visit), size=2, 
    vjust=-.4, hjust=-.1, angle = 00) 
+1

Eksik fonksiyonları, tekrarlanabilir değil verilerin eksik. –

+0

Bunu nasıl yapacağımı bilmiyorum ama gerçekten etiketlere mi ihtiyacınız var? Bu bilgiyi sağlayan bir efsane zaten var. –

+1

[R] 'deki akıllı işaret etiketinin olası kopyası (http://stackoverflow.com/questions/7611169/intelligent-point-label-placement-in-r) – joran

cevap

11

Sen Ziyaret sayısal değerine göre etiketin dikey konumunu değiştirebilir, ben arsa üretmek için kullanılan koddur.

anahtar:

y=(as.numeric(Patient)+0.25*as.numeric(Visit)%%3)-0.12 

Bu, şu anda üretir:
3 farklı seviyede, her bir düzeyde bir çeyrek ayrılır
artırmak veya azaltmak için ziyaret değerleri (%% 3) 'e göre y etiket (0.25)
ilk etiket
ikinci yatay bir çizginin altında 0.12 arasındaki mesafe 0.12

üzerinde

olduğu enter image description here

require(ggplot2) 
require(plyr) 
require(reshape) 
# create sample data 
set.seed(666) 
dfn <- data.frame(
    Referral = seq(as.Date("2007-01-15"), len= 26, by="23 day"), 
    VISIT01 = seq(as.Date("2008-06-15"), len= 24, by="15 day")[sample(30, 26)], 
    VISIT02 = seq(as.Date("2008-12-15"), len= 24, by="15 day")[sample(30, 26)], 
    VISIT03 = seq(as.Date("2009-01-01"), len= 24, by="15 day")[sample(30, 26)], 
    VISIT04 = seq(as.Date("2009-03-30"), len= 24, by="60 day")[sample(30, 26)], 
    VISIT05 = seq(as.Date("2010-11-30"), len= 24, by="6 day")[sample(30, 26)], 
    VISIT06 = seq(as.Date("2011-01-30"), len= 24, by="6 day")[sample(30, 26)], 
    Discharge = seq(as.Date("2012-03-30"), len= 24, by="30 day")[sample(30, 26)], 
    Patient = factor(1:26, labels = LETTERS), 
    openCase = rep(0:1, 100)[sample(100, 26)]) 

# set today's data for cases that do not have an Discharge date 
dfn$Discharge[ is.na(dfn$Discharge) ] <- as.Date("2014-01-30") 

mdfn <- melt(dfn, id=c('Patient', 'openCase'), variable_name = "Visit") 
names(mdfn)[4] <- 'Year' # rename 

# order data in mdfn by 'Referral' in dfn 
mdfn$Patient <- factor(mdfn$Patient,levels = 
    (dfn$Patient[order(dfn$Referral)]),ordered = TRUE) 

# subset a dataset to avoid 'Discharge' for cases that are not closed 
mdfn2 <- subset(mdfn,!(Visit=="Discharge" & Year > as.Date("2014-01-01"))) 

# the plot as it looks now 
ggplot(mdfn, aes(Year, Patient)) + 
    geom_blank() + 
    geom_line(data = mdfn[mdfn$openCase == 0,], colour = "black") + 
    geom_line(data = mdfn[mdfn$openCase == 1,], colour = "grey") + 
    geom_point(data = mdfn2, aes(colour = Visit), size = 4, shape = 124) + 
    geom_text(data=mdfn2, mapping=aes(x=Year, y=(as.numeric(Patient)+0.25*as.numeric(Visit)%%3)-0.12, 
            label=substr(Visit, 1, 7), colour=Visit), size=2, 
      hjust=-.1, angle = 00) 
+0

Zarif, etkileyici. Şimdi sadece üç zaman noktası birbirine yakın olduğunda ve etiketlerin hatta yerleştirilmesinden kaçınmak için ne yapacağımı anlamaya ihtiyacım var. Teşekkürler. –

+0

Metin artık çevrimiçi değil. Daha farklı yükseklik seviyelerine ihtiyacınız varsa, %% aşağıdaki sayıyı artırın ve daha küçük metin gerektiren kaymanın boyutunu (şu anda 0,25) azaltın. –

+0

Bu gerçek veri değilse ve bu gerçek verilerle çalışmazsa, anonim hale getirdikten sonra gerçek verileri sağlamayı düşünün: http://stackoverflow.com/a/10458688/742447 –

İlgili konular