【问题标题】:How to add a column of labels to the right of a plot如何在绘图右侧添加一列标签
【发布时间】:2014-05-26 20:32:56
【问题描述】:

我有在 R 中生成膨胀图的代码。检查一下!

我用这个代码做到了:

SwellPlot <- function(Data,P) {
  par(mfcol=c(1,1), mar=c(4, 4.5, 0, 0) + 0.1)
  plot(c(0.5,P+0.5), c(-0.5,P+0.5), type="n", cex=1, lab=c(20,20,1), cex.lab=1.5, yaxs="i", xaxs="i", xlab=~bold("Stuff!"), ylab=~bold("Other stuff!"))
  for (f in 1:(P+1)) {
      for (r in 0:P) {
          points(r,(f-1), pch=15, cex=(60/P)*sqrt(Data[f,r]/200))
          }
      }
  }

将Data 输入为矩阵,就像上面例子中使用的那样:

Data <- matrix(c(0, 117, 76, 7, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 200, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 188, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 90, 
109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 38, 143, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 18, 142, 39, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 8, 114, 75, 3, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 4, 95, 99, 2, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 68, 121, 7, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 65, 122, 10, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 
120, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
2, 42, 132, 23, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 35, 135, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 44, 128, 27, 1, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 33, 139, 27, 1, 0, 0, 0, 0, 
0, 0, 0, 0), 17, 16, byrow=FALSE)

我想在膨胀图的右侧添加一系列垂直标签(这些标签与 y 轴标签不同,我需要保持原样)。我已经通过扩展 x 轴并使用 text() 来做到这一点,但是当我这样做时,它看起来很笨拙(在 x 轴标签上),而且因为我的绘图的 x 轴长度变化很大,所以我不得不花很多钱试错时间确保我的标签的宽度不与最右边的绘制元素重叠。改进后的情节看起来像这样:

我想象必须有一些相对简单的方法来使用layout() 或mfcol 或类似的方法,但文档和示例对我来说很快变得复杂。你会如何解决这个问题?

允许我专门 (1) 制作标签列的宽度我想添加膨胀图宽度的 8%,以及 (2) 制作膨胀图(不包括标签在右侧)保持其 1:1 的纵横比。

如果可以使用par 和plot 等来完成,也可以获得奖励积分。

【问题讨论】:

  • 你需要分享你的代码来生成上面的图。还包括样本数据以重现该图,以便我们对其进行测试。您还没有明确说明您使用的是哪种绘图系统,因此无法提出具体建议。你能制作一张图片来展示最终产品的样子吗?您可以使用 Paint 或其他工具在当前绘图上绘制。
  • @MrFlick 我希望我已经成功整合了您要求的改进。如果我能做更多,请告诉我。我希望你会考虑在我的改进之后修改你的反对票。
  • @RichardScriven 你可以添加赏金;)
  • 您能帮我理解为什么您建议使用structure() 以及L 后缀在修订版中的含义吗?
  • @RichardScriven 在口语英语中,“奖励积分......”的意思是“如果你能超越基本要求,那就给你额外的荣誉”。更直接地回答:“更感激。” :)

标签: r layout plot


【解决方案1】:

这是一种可能性。您可以将 rownames 添加到您的 Data 中,也可以传入名称向量

SwellPlot <- function(Data,P=nrow(Data), labels=!is.null(rownames(Data))) {
  par(mfcol=c(1,1), mar=c(4, 4.5, 0, 3) + 0.1)
  plot(c(0.5,P+0.5), c(-0.5,P+0.5), 
      type="n", cex=1, lab=c(20,20,1), 
      cex.lab=1.5, yaxs="i", xaxs="i", 
      xlab=~bold("Stuff!"), ylab=~bold("Other stuff!")
  )
  cex<-(60/P)*sqrt(Data/200)
  points(col(Data), row(Data), pch=15, cex=cex)
  if(is.logical(labels) && labels) {
    labels = rownames(Data)
  }
  if(is.character(labels)) {
    axis(4, labels=labels, at=1:P, las=1, tick=F)
  }
} 

#add names for labeling
lbl<-c("",rev(c("Ant","Bat","Cat","Dog","Eel","Fly","Gar","Hog")), rep("",8))
rownames(Data)<-lbl
SwellPlot(Data)

我刚刚用axis 绘制了额外的名称,并通过调整par 确保为它们腾出空间

我还编辑了中间以取出两个循环。那些很慢。您可以通过一次调用一次通过所有 x,y 对的点来完成所有操作。诀窍是,如果您传递一个 data.frame,它会将其转换为一个简单的向量。因此,如果所有矩阵的排列方式相同,则每个单元格都会得到一个点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多