繁体   English   中英

如何在图的右侧添加一列标签

[英]How to add a column of labels to the right of a plot

我有代码在R中产生膨胀曲线。请检查!

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的宽高比。

如果可以使用parplot等方式完成,则还可以获得奖励积分。

这是一种可能性。 您可以添加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,它将把它转换成一个简单的向量。 因此,如果所有矩阵的排列方式相同,则每个单元格都将得到一个点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM