58

我想在 ggplot 中添加一个突出显示站点的坐标表。

使用上一个问题作为示例数据:

set.seed(1)
mydata <- data.frame(a=1:50, b=rnorm(50))
ggplot(mydata,aes(x=a,y=b)) + 
    geom_point(colour="blue") + 
    geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5)

在此处输入图像描述

我想将下表添加到绘图区域内绘图的右下角。有什么建议吗?

table<-cbind(sites=c("site 1","site 2","site 3","site 4"),mydata[10:13,])
table

    sites  a          b
    site 1 10 -0.3053884
    site 2 11  1.5117812
    site 3 12  0.3898432
    site 4 13 -0.6212406
4

4 回答 4

93

您可以将ggplot2's annotation_custom与包中的 a 一起tableGrob使用gridExtra

library(ggplot2)
library(gridExtra)
set.seed(1)
mydata <- data.frame(a=1:50, b=rnorm(50))
mytable <- cbind(sites=c("site 1","site 2","site 3","site 4"),mydata[10:13,])
k <- ggplot(mydata,aes(x=a,y=b)) + 
  geom_point(colour="blue") + 
  geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5) + 
  annotation_custom(tableGrob(mytable), xmin=35, xmax=50, ymin=-2.5, ymax=-1)

在此处输入图像描述

于 2012-09-07T12:57:07.090 回答
21

随着'ggplot2' 3.0.0 和'ggpmisc' 0.3.0 的发布,一个新的更简单的答案是可能的:

library(ggplot2)
library(ggpmisc)

set.seed(1)
mydata <- data.frame(a = 1:50, b = rnorm(50))
table <- cbind(sites=c("site 1", "site 2", "site 3", "site 4"), mydata[10:13, ])

ggplot(mydata, aes(x = a, y = b)) + 
  geom_point(colour = "blue") + 
  geom_point(data = mydata[10:13, ], aes(x = a, y = b), colour = "red", size = 5) +
  annotate(geom = "table", x = 37, y = -0.8, label = list(table), 
           vjust = 1, hjust = 0)

'ggplot2' 3.0.0 完全支持小标题(请参阅发布公告),从而可以将数据框列表映射到label美学。'ggpmisc 0.3.0' 包中的新geom_table()功能利用了这一点,使得添加的表的语法与geom_label()可能的相似(请参阅文档)。这里似乎最适合添加表格作为注解,但当然geom_table()也可以直接使用,作为其他ggplot几何图形。

在此处输入图像描述

于 2018-07-24T15:36:37.190 回答
13

@user3206440,@Punintended 存在删除行号的简单方法:添加rows = NULL到对tableGrob.

library(ggplot2)
library(gridExtra)
set.seed(1)
mydata <- data.frame(a=1:50, b=rnorm(50))
mytable <- 
   cbind(sites=c("site 1","site 2","site 3","site 4"), mydata[10:13,])
k <- ggplot(mydata,aes(x=a,y=b)) + 
  geom_point(colour="blue") + 
  geom_point(data=mydata[10:13, ], aes(x=a, y=b), colour="red", size=5) + 
  annotation_custom(tableGrob(mytable, rows=NULL), 
                    xmin=35, xmax=50, ymin=-2.5, ymax=-1)

绘图图像

请参阅gridExtra Wiki

于 2017-05-22T20:21:00.270 回答
1

@user3206440:我找到了一个删除行号的解决方法。我将数据格式化为矩阵,分配列名,然后让 tableGrob 直接调用它。每当我让 tableGrob 将其称为数据框时,行名都会保留。

下面是一个例子。我确信有一种更简单的方法来处理 chisq.test 输出

chivalues <- chisq.test(chitable)
chidf <- matrix(c(unlist(c(round(as.numeric(chivalues[1]), 2),
                    chivalues[2], round(as.numeric(chivalues[3]), 5), numcells))),
                   nrow = 1, ncol = 4, byrow = FALSE)
colnames(chidf) <- c("Chi-Squared", "DF", "P Value", "Total Cells")

然后后来...

annotation_custom(tableGrob(chidf), xmin=2, xmax=6, ymin=700, ymax=800)
于 2017-03-06T19:48:36.973 回答