我有一个线图,其中一些时间点很难通过单独的颜色来区分,因此我想在图上标记时间点,但是标签重叠(见下图)难以阅读标签。
情节目前看起来像这样,
我想知道是否有办法'堆叠'标签或某种方式(脚本)可以确保它们不重叠。像这样的东西,
任何帮助都将不胜感激。
这是我用来制作情节的代码,
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)
答案 0 :(得分:11)
您可以根据访问的数值更改标签的垂直位置。
关键是:
y=(as.numeric(Patient)+0.25*as.numeric(Visit)%%3)-0.12
目前产生:
根据访问(%% 3)的值,可以增加或减少3个不同的级别
每个级别由y个标签(0.25)之间的距离分开四分之一
第一个标签是水平线以下0.12
第二个是0.12以上
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)