【问题标题】:edits in a ggplot2, geom = "line"在 ggplot2 中编辑,geom = "line"
【发布时间】:2012-05-08 18:03:39
【问题描述】:

我有一个我一直在苦苦挣扎的医院发生的一些事件的线图。

我尚未解决的挑战是,1) 对绘图上的线进行排序,以便患者线按评估日期排序,2) 通过变量“openCase”为线着色,最后,3 ) 我想删除 2014 年(或其他随机日期)的案例的出院点(蓝色方块)。

任何帮助将不胜感激?

这是我的示例数据,

library(ggplot2)
library(plyr)

df <- data.frame(
 date = seq(Sys.Date(), len= 156, by="5 day")[sample(156, 78)],
 openCase = rep(0:1, 39),
 patients = factor(rep(1:26, 3), labels = LETTERS)
)

df <- ddply(df, "patients", mutate, visit = order(date))
df$visit <- as.factor(df$visit)
levels(df$visit) <- c("Assessment (1)", "Treatment (2)", "Discharge (3)")

qplot(date, patients, data = df, geom = "line") + 
geom_point(aes(colour = visit), size = 2, shape=0)

我知道我的示例数据并不完美,因为一些评估数据是在治疗之后,而一些出院数据是在评估数据之前,但是我的基础数据是混乱的那部分挑战。

现在的样子,

更新 2012-04-30 16:30:13 PDT

我的数据来自数据库,看起来像这样,

df <- structure(list(date = structure(c(15965L, 15680L, 16135L, 15730L, 
15920L, 15705L, 16110L, 15530L, 15575L, 15905L, 16140L, 15795L, 
15955L, 15945L, 16205L, 15675L, 15525L, 15830L, 15625L, 15725L, 
15855L, 15840L, 15615L, 15500L, 15780L, 15765L, 15610L, 15690L, 
16080L, 15570L, 15685L, 16175L, 15740L, 15600L, 15985L, 15485L, 
15605L, 16115L, 15535L, 15755L, 16145L, 16040L, 15970L, 16000L, 
16075L, 15995L, 16010L, 15990L, 15665L, 15895L, 15865L, 16120L, 
15880L, 15930L, 16055L, 15820L, 15650L, 16155L, 15700L, 15640L, 
15505L, 15750L, 15800L, 15775L, 15825L, 15635L, 16150L, 15860L, 
16100L, 15475L, 16050L, 15785L, 15495L, 15810L, 15805L, 15490L, 
15460L, 16085L), class = "Date"), openCase = c(0L, 0L, 0L, 1L, 
1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 
0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 
0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 
1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 
0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L), patients = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 
6L, 7L, 7L, 7L, 8L, 8L, 8L, 9L, 9L, 9L, 10L, 10L, 10L, 11L, 11L, 
11L, 12L, 12L, 12L, 13L, 13L, 13L, 14L, 14L, 14L, 15L, 15L, 15L, 
16L, 16L, 16L, 17L, 17L, 17L, 18L, 18L, 18L, 19L, 19L, 19L, 20L, 
20L, 20L, 21L, 21L, 21L, 22L, 22L, 22L, 23L, 23L, 23L, 24L, 24L, 
24L, 25L, 25L, 25L, 26L, 26L, 26L), .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", 
"Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
    visit = structure(c(2L, 1L, 3L, 3L, 1L, 2L, 2L, 3L, 1L, 3L, 
    1L, 2L, 2L, 1L, 3L, 2L, 1L, 3L, 1L, 2L, 3L, 3L, 2L, 1L, 3L, 
    2L, 1L, 3L, 1L, 2L, 1L, 3L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 1L, 
    3L, 2L, 1L, 2L, 3L, 3L, 1L, 2L, 1L, 3L, 2L, 2L, 3L, 1L, 3L, 
    2L, 1L, 3L, 2L, 1L, 1L, 2L, 3L, 3L, 1L, 2L, 2L, 3L, 1L, 1L, 
    3L, 2L, 1L, 3L, 2L, 2L, 1L, 3L), .Label = c("zym", "xov", "poi"
    ), class = "factor")), .Names = c("date", "openCase", "patients", 
"visit"), row.names = c(NA, -78L), class = "data.frame")

visit 中的级别数和特定标签很可能会发生变化,所以我想要某种代码,在我 ranksort 基于我现有的数据而不是 (visit) 生成新变量。

【问题讨论】:

  • 两个独立的颜色映射(线和点)将是一个挑战(在 ggplot2 中),因为它并不是真正旨在让您做到这一点。
  • 我不太明白你对 visit 变量的意思。您说“在我的真实数据中,我没有创建 visit 变量,因此不能像上面的示例那样在 ddply 中使用 rank。”如果您打破这部分问题,首先显示(作为单独的代码块)创建示例数据的内容,然后显示您需要如何转换该数据,也许会有所帮助。只是按照您所说的进行,为什么不将ddply 的结果分配给visit 以外的其他变量并使用它?
  • @BrianDiggs,我对最初的问题进行了小幅更新。如果这回答了您的问题,请告诉我。谢谢。
  • 现在我也很困惑。我在下面给出的答案只取决于rank(date) 的东西,以便首先构造Visit 变量;如果你在下面的代码中用df 替换df2,你应该得到一个很好的图——唯一缺少的是在某些情况下“放电”点不会被删除,因为不再有“放电” “ 观点。我想我不明白访问代码代表什么——它们真的可以按任何顺序出现吗?您是否希望数据按(例如)zym 的日期排序,无论是个人第一次、第二次还是第三次访问?

标签: r time ggplot2 dashboard


【解决方案1】:

这是中途:

从您对数据的初始定义开始。

首先,我认为你想要rank(date) 而不是order(date)——无论如何,这对我来说更有意义。

df <- ddply(df, "patients", mutate, visit = rank(date))
df$visit <- as.factor(df$visit)
levels(df$visit) <- c("Assessment (1)", "Treatment (2)", "Discharge (3)")

按最小日期值(= 评估日期)对患者重新排序:

df$patients <- reorder(df$patients,df$date,function(x) min(as.numeric(x)))

创建一个缺少出院点的新数据集,它们在 2014 年 1 月 1 日之后的位置(如果您想删除在给定日期之后评估的案例的出院点,您需要使用ddply):

df2 <- subset(df,!(visit=="Discharge (3)" & date > as.Date("2014-01-01")))

正如@Joran 在上面指出的那样,为不同的变量获得两个单独的色标有点困难,但是这种工作(你必须将openCase 变成一个因素,以便将它与色标结合起来visit)

ggplot(df, aes(date, patients)) + geom_line(aes(colour=factor(openCase))) + 
    geom_point(data=df2,aes(colour = visit), size = 2, shape=0)

或者(我认为无论如何这更漂亮),您可以使用线型编码openCase

ggplot(df, aes(date, patients)) + geom_line(aes(linetype=factor(openCase))) + 
    geom_point(data=df2,aes(colour = visit), size = 2, shape=0)

【讨论】:

  • 我在想我会推荐在 openCase 上分面,nrow = 2 和 scales = "free_y"。
  • @joran,这是一个有趣的想法。虽然我不知道如果两组在不同的方面进行比较会有多容易(实际数据有 150 名受试者)。我会试试看。
  • @BenBolker,如果我的数据带有visit 变量,有没有办法可以rank 数据?换句话说,在我的真实数据中,我没有创建visit 变量,因此不能像上面的示例那样在ddply 中使用rank
【解决方案2】:

我仍然不确定我是否理解@Ben 的回答有什么问题,但我会尝试添加我自己的一个。从编辑中给出的df 开始。

根据给定日期的顺序创建一个新变量Visit(注意大写V),即Assessment/Treatment/Discharge。这是@Ben 的代码,刚刚重写。

df <- ddply(df, "patients", mutate, 
  Visit = factor(rank(date),
                 levels = 1:3,
                 labels=c("Assessment (1)", "Treatment (2)", "Discharge (3)")))

我不明白这与最初数据中的visit 列有何关系;事实上,原来的visit列以后就不用了:

> table(df$Visit, df$visit)

                 zym xov poi
  Assessment (1)  16   7   3
  Treatment (2)    3  16   7
  Discharge (3)    7   3  16

重新排序患者(再次复制 Ben):

df$patients <- reorder(df$patients,df$date,function(x) min(as.numeric(x)))

确定应显示的点的子集(与 Ben 的想法相同,但代码不同)

df2 <- df[!((df$Visit == "Discharge (3)") & (df$date > as.Date("2014-01-01"))),]

要添加新内容,这里有一种方法可以让线条变成不同的颜色而不影响图例

ggplot(df, aes(date, patients)) +
    geom_blank() +
    geom_line(data = df[df$openCase == 0,], colour = "black") +
    geom_line(data = df[df$openCase == 1,], colour = "red") +
    geom_point(data = df2, aes(colour = Visit), size = 2, shape = 0)

【讨论】:

  • 我可能是把事情搞糊涂的人,对此我深表歉意。我意识到我需要使用熔化前的数据对因子变量“患者”进行排序,作为 排序工具,如this answer 中所述。我会将赏金奖励给 Brian Diggs,因为他完成了 Ben 的回答。谢谢!
  • 如果有人有兴趣了解我是如何解决它的,请查看this post, organize text on geom_point using geom_text。谢谢,埃里克
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 1970-01-01
相关资源
最近更新 更多