5 Stimmen

Text auf geom_point mit geom_text organisieren

Ich habe ein Liniendiagramm mit einigen Zeitpunkten, die allein durch die Farbgebung schwer zu unterscheiden sind, und möchte daher die Zeitpunkte auf dem Diagramm beschriften, aber die Beschriftungen überschneiden sich (siehe Diagramm unten) so, dass die Beschriftungen schwer zu lesen sind.

Die Handlung sieht derzeit wie folgt aus,

current plot

Ich frage mich, ob es eine Möglichkeit gibt, die Beschriftungen zu "stapeln", oder ein Verfahren (Skript), mit dem sichergestellt werden kann, dass sie sich nicht überschneiden. Etwas wie dieses,

- - >

Für jede Hilfe wären wir dankbar.

Hier ist der Code, den ich zur Erstellung des Diagramms verwendet habe,

 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)

11voto

Etienne Low-Décarie Punkte 12463

Sie können die vertikale Position des Etiketts entsprechend dem numerischen Wert von Visit ändern.

Das ist der Schlüssel:

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

Diese produziert derzeit:
3 verschiedene Stufen entsprechend den Werten von Visit (%%3), die Sie erhöhen oder verringern können
jede Ebene ist durch ein Viertel des Abstands zwischen den y-Etiketten getrennt (0,25)
das erste Etikett liegt 0,12 unter der horizontalen Linie
die zweite liegt 0,12 darüber

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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X