如何在R corrgram中使用轴标签?

时间:2016-11-02 16:46:04

标签: r labels

我想在x轴和y轴上有水平和垂直标签,请参阅以下伪代码。 Henrik对相关主题2013的评论是关闭对角线标签,然后尝试关联轴标签,但我不想关闭对角线标签

  

您可以通过设置labels = NULL来关闭对角线标签。然后,您可以尝试使用文本

添加标签
library("corrgram")
ids <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
# https://cran.r-project.org/web/packages/corrgram/vignettes/corrgram_examples.html
corrgram(baseball,main="Baseball data PC2/PC1 order") +
          xlab("Patient 1 ID") +
          ylab("Patient 2 ID") +
          scale_x_discrete(labels = ids) +
          scale_y_discrete(labels = ids)

图。 1个测试数据

enter image description here

测试JayT的提议

使用所有可能的参数重载第一个参数位置然后在新函数中只有一个额外的参数ids会很好;伪代码

# https://stackoverflow.com/a/40387233/54964
corrgramLabels <- function(x, ids){
        corrgram(x=x)
        mtext("Patient 1 ID", side = 1, line = 4)
        mtext("Patient 2 ID", side = 2, line = 3)
        x_at <- seq(0.075, 0.925, length.out = length(ids))
        y_at <- seq(0.075, 0.91, length.out = length(ids))
        axis(1, at=x_at, labels=x_labels, line = 1.5, tick=F, cex.axis=.7)
        axis(2, at=y_at, labels=y_labels, line = 1, tick=F, cex.axis=.7)
}

尝试使用它但出现以下错误

corrgramLabels(M,
  upper.panel=panel.pie,
  lower.panel=panel.shade,
  text.panel=panel.txt,
  order=NULL,
  diag.panel=panel.minmax,
  main=title)

错误

Error in corrgramLabels(M, upper.panel = panel.pie, lower.panel = panel.shade,  : 
  unused arguments (upper.panel = panel.pie, lower.panel = panel.shade, text.panel = panel.txt, order = NULL, diag.panel = panel.minmax, main = title)
Execution halted

解决方案的提案

我实际上认为最好的解决方案是独立于corrgram的函数。在createLabels()之后启动一个函数corrgram(),您就会得到结果。这可能吗?

操作系统:Debian 8.5
R:3.3.1
相关:Corrgram Package Horizontal and Vertical Labels

1 个答案:

答案 0 :(得分:2)

对于轴,您可以使用mtext(m代表边距区域;文本不起作用):

library("corrgram")
ids <- seq(1, 18)
corrgram(baseball,main="Baseball data PC2/PC1 order")

mtext("Patient 1 ID", side = 1, line = 4)
mtext("Patient 2 ID", side = 2, line = 3)

您可以使用line参数增加或减少与实际绘图的距离。

标签更难。你可以用mtext或axis来做,但是如果你调整图形,它将不适合其余部分。所以这不是最佳选择。如果你知道你的身材有多大,它应该仍然有用;例如800x800像素,优化位置(在参数处):

axis(1, at=seq(0.09, 0.91, length.out = length(ids)),
     labels=as.character(ids), line = 1.5, tick=F, cex.axis=.7)
axis(2, at=seq(0.08, 0.88, length.out = length(ids)),
     labels=as.character(ids), line = 1, tick=F, cex.axis=.7)

图输出: Test data with axes and labels

为了获得更好的解决方案,您可能需要查看函数内部并找出框的绘制方式和位置。

Masi评论后编辑: 当然,我们可以围绕它构建一个函数:

corrgramMasi <- function(x, main, xlab, ylab, x_labels, y_labels, x_at, y_at){
  corrgram(x=x, main=main)
  mtext(xlab, side = 1, line = 4)
  mtext(ylab, side = 2, line = 3)
  axis(1, at=x_at, labels=x_labels, line = 1.5, tick=F, cex.axis=.7)
  axis(2, at=y_at, labels=y_labels, line = 1, tick=F, cex.axis=.7)
}

使用具有调整后的“at”参数值的功能的插图,以800x800像素的分辨率保存图形:

x_at <- seq(0.075, 0.925, length.out = length(ids))
y_at <- seq(0.075, 0.91, length.out = length(ids))
png("corrgramMasi.png", width=800, height=800)
  corrgramMasi(baseball, "Baseball data PC2/PC1 order", xlab="Patient 1 ID",
               ylab="Patient 2 ID", x_labels=ids, y_labels=ids, x_at=x_at, y_at=y_at)
dev.off()

如果你有几个corrgrams,你可以使用Map并专门更改参数。在这种情况下,我只使用棒球数据集两次并更改标题,但保持所有其他变量不变:

Map(corrgramMasi, x=list(baseball, baseball), main=list("title 1", "title 2"), 
    xlab="Patient 1 ID", ylab="Patient 2 ID", x_labels=ids, y_labels=ids,
    x_at=x_at, y_at=y_at)

如果你有10个corrgrams,那么只需将数据放入x列表并更改标题(或将它们设置为常量值)。如果要更改其他值(例如xlab),则必须使用具有相应值的列表,例如xlab = list(“xlab for corrgram 1”,“xlab for corrgram 2”,...)。

但如前所述,“at”参数在这里很脏,所以这肯定不是最好的解决方案。

编辑2:正如Masi建议的那样,最好使用单独的函数来创建标签:

createLabels <- function(xlab, ylab, x_labels, y_labels, x_at, y_at){
  mtext(xlab, side = 1, line = 4)
  mtext(ylab, side = 2, line = 3)
  axis(1, at=x_at, labels=x_labels, line = 1.5, tick=F, cex.axis=.7)
  axis(2, at=y_at, labels=y_labels, line = 1, tick=F, cex.axis=.7)
}

然后在做出corrgram之后调用createLabels:

corrgram(baseball,main="Baseball data PC2/PC1 order")
createLabels(xlab="Patient 1 ID", ylab="Patient 2 ID", x_labels=ids,
             y_labels=ids, x_at=x_at, y_at=y_at)