0

长期以来,我一直困惑于一种简洁的方式来传达折线图中数字和分类变量之间交互的重要性(Y轴上的响应,X轴上的数字预测变量,以及分类变量的每个级别一条线在这些轴上绘制的不同颜色或图案)。我终于想到了绘制连接图例键而不是数据行的传统“括号和 p 值”的想法。

这是我的意思的模型:

library(ggplot2);
mydat <- do.call(rbind,lapply(1:3,function(ii) data.frame(
    y=seq(0,10)*c(.695,.78,1.39)[ii]+c(.322,.663,.847)[ii],
    a=factor(ii-1),b=0:10)));

myplot <- ggplot(data=mydat,aes(x=b,y=y,colour=a,group=a)) +
    geom_line()+theme(legend.position=c(.1,.9));

# Plotting with p-value bracket:
myplot + 
    # The three line segments making up the bracket
    geom_segment(x=1.2,xend=1.2,y=13.8,yend=13) + 
    geom_segment(x=1.1,xend=1.2,y=13,yend=13)  + 
    geom_segment(x=1.1,xend=1.2,y=13.8,yend=13.8) +
    # The text accompanying the bracket. 
    geom_text(label='p < 0.001',x=2,y=13.4);

这比尝试在折线图本身的某个位置绘制括号更简洁。

问题在于geom_segments 和 s的 x 和 y 值geom_text是通过反复试验获得的,而对于另一个数据集,这些坐标将是完全错误的。如果我正在尝试编写一个函数,其目的是自动化从模型中提取这些对比并绘制它们的过程(有点像effects包,但在如何表示数据方面具有更大的灵活性),那将是一个问题。

我的问题是:有没有办法以某种方式拉出包含图例的每个框的实际坐标并将它们转换为 and 使用的比例geom_segmentgeom_text或者在创建myplot对象时手动指定每个框的坐标,或者可靠地预测各个框的位置考虑到myplot$theme$legend.position回报,将它们转换为情节的比例0.1 0.9

我想在 ggplot2 中执行此操作,因为它健壮、优雅且非常适合我想用我的脚本做的所有其他事情。我愿意使用扩展 ggplot2 的其他软件包,我也愿意接受其他方法来直观地指示线图上的显着性水平。然而,相当于“你甚至不应该这样做”的建议并不具有建设性——因为无论我个人是否同意你的观点,我的合作者和他们的编辑都不阅读 Stackoverflow(很遗憾)。


更新:

这个问题可以简化为:如果myplot$theme$legend.key.height在行中并且myplot$theme$legend.position似乎大致在整个绘图区域的一小部分(但不完全是),我如何将它们转换为描绘 x 和 y 轴的单位,或者,将 x 和 y 轴刻度转换为 和 的legend.key.height单位legend.position

4

2 回答 2

4

我不知道你提出的问题的答案。但是,如果不太花哨的方法来传达信息,另一种绝对快速可行的方法是更改​​级别的名称,以便级别名称包含重要代码。在您的第一个示例中,您可以使用

levels(mydat$a) <- list("0" = "0", "1 *" = "1", "2 *" = "2")

然后传说将反映这一点:

在此处输入图像描述

有了更多的关卡和重要的组合,您可能可以计算出一组符号。然后在您的图形图例中提及每组符号中反映的 p 水平。

这可能是传达信息的一种相关方式:下图由rxnNormin HandyStuff here生成。不幸的是,这是另一个无法回答的问题,因为我无法使用新版本的ggplot2. 希望我能尽快弄清楚。 rxnNorm

于 2013-02-03T22:48:58.787 回答
1

我的回答不是使用ggplot2,而是使用lattice 包。dotplot如果我想比较连续变量和分类变量,我想这就是我会使用的。

在这里,我dotplot以两种方式使用,一种是我复制你的情节,另一种是

library(lattice)
library(latticeExtra)      ## to get ggplot2 theme

  #y versus levels of B, in different panel of A
  p1 <- dotplot(b~y|a , 
          data = mydat, 
          groups = a,
          type = c("p", "h"),
          main = "interaction between numeric and categorical variables ",
          xlab = "continuous value",
                par.settings = ggplot2like())

  #y versus levels of B , grouped by a(color and line are defined by a)
  p2 <- dotplot(b~y, groups= a , 
          data = mydat,
          type = c("l"),
          main = "interaction between numeric and categorical variables ",
          xlab = "continuous value",
                par.settings = ggplot2like())

  library(gridExtra)           ## to arrange many grid plots
   grid.arrange(p1,p2)

在此处输入图像描述

于 2013-02-04T01:58:29.807 回答