【问题标题】:How to have axis labels in R corrgram?如何在 R corrgram 中有轴标签?
【发布时间】:2016-11-03 22:21:38
【问题描述】:

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

您可以通过设置标签 = 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个测试数据

测试 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 的函数。在corrgram() 之后启动一个函数createLabels(),你就会得到结果。这可能吗?

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

【问题讨论】:

    标签: r labels


    【解决方案1】:

    对于轴,您可以使用 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 或轴来完成,但如果您调整图形的大小,它将不适合其余部分。所以这并不是最理想的。如果你知道你的身材有多大,它应该仍然有效;例如 800x800 像素,优化位置(at 参数):

    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 个 corrgram,那么只需将数据放入 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)
    

    【讨论】:

    • 当然,你可以构建一个函数。我已经编辑了我的答案,以包含一种可能的解决方案,该解决方案也可用于多个 corrgram,而无需一遍又一遍地输入代码。
    • x_at 和 y_at 是标签的位置;它实际上只是轴的“at”参数:axis(at=...)。不幸的是我不熟悉这个包,所以我不知道如何硬编码。绘图区域从左下角到右上角从 (0,0) 到 (1,1),我只是试图将轴放在两者之间的某个位置(例如对于 x:0.075、0.925),大约在 corrgram 框所在的位置;但正如你所见,我之前写过调整图像大小会破坏标签的位置。我认为必须由更有能力的人来解决这个问题,抱歉。
    • 我在stackoverflow.com/q/40436727/54964 扩展了关于标签的更好可读性的线程,关于如何调整输入数据的标签字体大小并在 y 轴上水平调整。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多