2012-05-07 9 views
5

Ich habe ein Liniendiagramm mit einigen Zeitpunkten, die nur schwer durch die Färbung zu unterscheiden sind und ich möchte daher die Zeitpunkte auf der Zeichnung beschriften, aber die Beschriftungen überlappen sich (siehe unten) in einer Weise, wo es schwierig ist, die Etiketten zu lesen. organize text auf geom_point mit geom_text

Das Grundstück suchen derzeit wie folgt aus,

current plot

Ich frage mich, ob es einen Weg zu ‚Stack‘ ist die Etiketten oder irgendeiner Weise (Skript), die sicherstellen, dass sie sich nicht überlappen. So etwas wie dies,

 - - >

Jede Hilfe würde geschätzt. Hier

ist der Code, den ich verwendet, um die Handlung zu produzieren,

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

Fehlende Funktionen, fehlende Daten, nicht reproduzierbar. –

+0

Ich weiß nicht, wie es geht, aber brauchen Sie wirklich Etiketten? Es gibt bereits eine Legende, die diese Informationen liefert. –

+1

mögliches Duplikat von [Intelligente Punktbeschriftung in R] (http://stackoverflow.com/questions/7611169/intelligent-point-label-placement-in-r) – joran

Antwort

11

Sie können die vertikale Position des Etiketts verändert, entsprechend dem numerischen Wert von Besuchen.

Der Schlüssel ist:

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

Dies führt zur Zeit:
3 verschiedenen Ebenen entsprechend den Werten von Visit (%% 3), die Sie erhöhen oder verringern kann
jede Ebene um ein Viertel abgetrennt der Abstand zwischen y Etiketten (0,25)
das erste Etikett 0,12 unter der horizontalen Linie ist
die zweite ist 0,12 oben

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

Elegant, beeindruckend. Jetzt muss ich nur herausfinden, was zu tun ist, wenn drei Zeitpunkte nahe beieinander liegen und um zu vermeiden, dass die Etiketten auf der Linie platziert werden. Vielen Dank. –

+0

Text ist nicht mehr online. Wenn Sie mehrere verschiedene Höhenniveaus benötigen, erhöhen Sie die Anzahl nach %% und verringern Sie die Größe der Verschiebung (derzeit 0,25), was möglicherweise einen kleineren Text erfordert. –

+0

Wenn dies nicht die tatsächlichen Daten sind und dies nicht mit den tatsächlichen Daten funktioniert, denken Sie über die Bereitstellung der tatsächlichen Daten nach der Anonymisierung mit: http://stackoverflow.com/a/10458688/742447 –

Verwandte Themen