【问题标题】:organize text on geom_point using geom_text使用 geom_text 组织 geom_point 上的文本
【发布时间】:2012-05-15 15:20:21
【问题描述】:

我有一个线图,其中有一些时间点很难通过单独的颜色来区分,因此我想在图上标记时间点,但标签重叠(见下图)以某种方式重叠难以阅读标签。

剧情目前是这样的,

我想知道是否有一种“堆叠”标签的方法或某种方式(脚本)可以确保它们不重叠。像这样的,

任何帮助将不胜感激。

这是我用来制作情节的代码,

 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) 

【问题讨论】:

  • 缺少函数,缺少数据,不可重现。
  • 我不知道怎么做,但你真的需要标签吗?已经有一个传说提供了这些信息。
  • 你可以调整我在stackoverflow.com/a/8318841/892313 中给出的想法来做到这一点,但这可能比它的价值更麻烦。使用颜色和/或形状通过图例中的文本传达该信息可能更简洁。
  • @DWin,对不起。我忘记了require(reshape)melt。现在就在里面。

标签: r ggplot2


【解决方案1】:

您可以根据访问的数值改变标签的垂直位置。

关键是:

 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)

【讨论】:

  • 优雅,令人印象深刻。现在我只需要弄清楚当三个时间点彼此靠近时该怎么做,避免标签放在线上。谢谢。
  • 文本不再在线。如果您需要更多不同的高度级别,请增加 %% 后面的数字并减小 shift 的大小(当前为 0.25),这可能需要更小的文本。
  • 如果这不是实际数据并且这不适用于实际数据,请考虑在匿名后提供实际数据:stackoverflow.com/a/10458688/742447
  • @Eric D. Brean,我该如何改进对您问题的回答?
  • Etienne Low-Décarie,感谢您回复我。我正在尝试向 x-axisis 添加相同的功能,但我必须承认我还没有完全理解您的附加组件是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2011-05-12
  • 2018-03-15
  • 1970-01-01
  • 2019-11-04
  • 2019-01-22
相关资源
最近更新 更多