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

时间:2014-05-26 20:32:56

标签: r layout plot

我有代码在R中生成一个膨胀图。检查出来!

A swell plot in 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()来做到这一点,但是当我这样做时它看起来像kludgy(在x轴标签上)并且因为我有非常可变的x轴长度的图我必须花很多钱试错时间,确保我的标签宽度不与最右边的绘图元素重叠。改进的情节看起来有点像这样:

Mock-up of an even sweller plot!

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

答案的奖励积分允许我专门(1)制作标签栏的宽度我想要增加我的膨胀图宽度的8%,以及(2)制作我的膨胀图(不包括标签)在右侧)保持1:1的宽高比。

如果可以使用parplot等完成此操作,也可以获得奖励积分。

1 个答案:

答案 0 :(得分: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)

swell plot

我刚用axis绘制了额外的名字,我确保通过调整par

为他们腾出空间

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