2012-05-07 12 views
5

Ho un grafico a linee con alcuni punti temporali che sono difficili da distinguere dal solo colore e vorrei quindi etichettare i punti temporali sulla trama, ma le etichette si sovrappongono (vedi la trama sotto) in un modo in cui è difficile leggere le etichette.organizza il testo su geom_point utilizzando geom_text

La trama attualmente simile a questa,

current plot

mi chiedo se c'è un modo per 'pila' le etichette o qualche modo (copione) in grado di garantire che non si sovrappongano. Qualcosa di simile,

 - - >

Qualsiasi aiuto sarebbe apprezzato.

Ecco il codice che ho usato per produrre la trama,

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

funzioni mancanti, dati mancanti, non riproducibile. –

+0

Non so come farlo, ma hai davvero bisogno di etichette? C'è già una leggenda che fornisce queste informazioni. –

+1

possibile duplicato di [Posizionamento etichetta punto intelligente in R] (http://stackoverflow.com/questions/7611169/intelligent-point-label-place-in-r) – joran

risposta

11

È possibile modificare la posizione verticale dell'etichetta in base al valore numerico della visita.

La chiave è:

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

Questo produce attualmente:
3 livelli differenti secondo valori di visita (%% 3), che è possibile aumentare o diminuire
ogni livello è separato da un quarto della distanza tra etichette y (0,25)
prima etichetta è 0.12 sotto la linea orizzontale
il secondo è 0.12 sopra

enter image description here 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

Elegante, impressionante. Ora ho solo bisogno di capire cosa fare quando tre punti temporali sono vicini l'un l'altro e per evitare che le etichette siano posizionate sulla linea. Grazie. –

+0

Il testo non è più in linea. Se hai bisogno di più livelli di altezza diversi, aumenta il numero successivo a %% e diminuisci la dimensione del turno (attualmente 0,25), che potrebbe richiedere un testo più piccolo. –

+0

Se questo non è il dato reale e questo non funziona con i dati effettivi, pensa di fornire i dati effettivi dopo averli resi anonimi con: http://stackoverflow.com/a/10458688/742447 –

Problemi correlati