我有代码在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轴长度的图我必须花很多钱试错时间,确保我的标签宽度不与最右边的绘图元素重叠。改进的情节看起来有点像这样:
我想象必须有一些相对简单的方法来使用layout()
或mfcol
或其他一些方法,但文档和示例对我来说变得非常复杂。你会如何解决这个问题?
答案的奖励积分允许我专门(1)制作标签栏的宽度我想要增加我的膨胀图宽度的8%,以及(2)制作我的膨胀图(不包括标签)在右侧)保持1:1的宽高比。
如果可以使用par
和plot
等完成此操作,也可以获得奖励积分。
答案 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)
我刚用axis
绘制了额外的名字,我确保通过调整par
我还编辑了中间以取出两个循环。那些都很慢。你可以通过一次调用所有x,y对的点来完成所有操作。诀窍在于,如果传递data.frame,它会将其转换为简单的向量。因此,如果所有矩阵的排列方式相同,那么每个单元格都会得到一个点。