我想绘制一个简化的热图,使用我正在使用的标量矢量图形程序(inkscape)编辑并不困难。下面生成的原始热图包含大量矩形,我想知道它们是否可以在不同的扇区中合并在一起以简化输出pdf文件:
nentries=100000
ci=rainbow(nentries)
set.seed=1
mean=10
## Generate some data (4 factors)
i = data.frame(
a=round(abs(rnorm(nentries,mean-2))),
b=round(abs(rnorm(nentries,mean-1))),
c=round(abs(rnorm(nentries,mean+1))),
d=round(abs(rnorm(nentries,mean+2)))
)
minvalue = 10
# Discretise values to 1 or 0
m0 = matrix(as.numeric(i>minvalue),nrow=nrow(i))
# Remove rows with all zeros
m = m0[rowSums(m0)>0,]
# Reorder with 1,1,1,1 on top
ms =m[order(as.vector(m %*% matrix(2^((ncol(m)-1):0),ncol=1)), decreasing=TRUE),]
rowci = rainbow(nrow(ms))
colci = rainbow(ncol(ms))
colnames(ms)=LETTERS[1:4]
limits=c(which(!duplicated(ms)),nrow(ms))
l=length(limits)
toname=round((limits[-l]+ limits[-1])/2)
freq=(limits[-1]-limits[-l])/nrow(ms)
rn=rep("", nrow(ms))
for(i in toname) rn[i]=paste(colnames(ms)[which(ms[i,]==1)],collapse="")
rn[toname]=paste(rn[toname], ": ", sprintf( "%.5f", freq ), "%")
heatmap(ms,
Rowv=NA,
labRow=rn,
keep.dendro = FALSE,
col=c("black","red"),
RowSideColors=rowci,
ColSideColors=colci,
)
dev.copy2pdf(file="/tmp/file.pdf")
答案 0 :(得分:1)
你为什么不试试RSvgDevice?使用它你可以将你的图像保存为svg文件,这对于Inkscape比pdf
更方便答案 1 :(得分:1)
我使用Cairo
包生成svg。这非常容易。这是一个比你的例子更简单的情节:
require(Cairo)
CairoSVG(file = "tmp.svg", width = 6, height = 6)
plot(1:10)
dev.off()
在Inkscape中打开后,您可以取消组合元素并根据需要进行编辑。
答案 2 :(得分:0)
我认为我们(互联网)对此并不够清楚。
让我先从一个成功的导出示例开始
png("heatmap.png") #Ruby dev's think of this as kind of like opening a `File.open("asdfsd") do |f|` block
heatmap(sample_matrix, Rowv=NA, Colv=NA, col=terrain.colors(256), scale="column", margins=c(5,10))
dev.off()
在我看来,dev.off()
位让我想起了end
对ruby块或方法的调用,其中,“嵌套”或封闭的最后一行({{1}之间}和png()
)代码的输出被转储到png文件中。
例如,如果您运行此代码:
dev.off()
它会将第二个(绿色配色方案,我刚刚测试过)热图输出到heatmap4.png文件,就像ruby方法默认返回其最后一行一样