Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics R将热图简化为pdf_Graphics_Svg_Inkscape_R - Fatal编程技术网

Graphics R将热图简化为pdf

Graphics R将热图简化为pdf,graphics,svg,inkscape,r,Graphics,Svg,Inkscape,R,我想绘制一个简化的热图,它不难用我正在使用的标量矢量图形程序(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

我想绘制一个简化的热图,它不难用我正在使用的标量矢量图形程序(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")

你为什么不试试RSvgDevice呢?使用它,您可以将图像保存为svg文件,这对于Inkscape来说比pdf方便得多。我使用
Cairo
包来生成svg。这非常容易。下面是一个比示例中的图简单得多的图:

require(Cairo)
CairoSVG(file = "tmp.svg", width = 6, height = 6)
plot(1:10)
dev.off()
在Inkscape中打开后,可以取消对元素的分组并根据需要进行编辑

示例(移动点,添加漩涡): 我认为我们(互联网)在这一点上还不够清楚

让我从一个成功的导出示例开始

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()
位让我想起了对ruby块或方法的
end
调用,其中,“嵌套”或封闭(介于
png()
dev.off()
之间)代码输出的最后一行就是转储到png文件中的内容

例如,如果运行此代码:

png("heatmap4.png")
heatmap(sample_matrix, Rowv=NA, Colv=NA, col=terrain.colors(32), scale="column", margins=c(5,15))
heatmap(sample_matrix, Rowv=NA, Colv=NA, col=greenred(32), scale="column", margins=c(5,15))
dev.off()

它会将第二个(绿红色配色方案,我刚刚测试过)热图输出到heatmap4.png文件,就像ruby方法在默认情况下返回最后一行一样

您可以在
heatmap
调用中尝试
useRaster=TRUE
,它将被传递到
图像
,并生成一个光栅对象,而不是一堆矩形。我不知道Inkscape将如何处理它,但它确实使PDF缩小了5倍……我的PC上的Inkscape设法用
useRaster=TRUE
加载它,但此时它占用了我70%的RAM。我杀死了inkscape,它试图加载非useRaster版本,但却占用了80%的RAM。老实说,R处理得不太好,如果我调整绘图窗口的大小,它会全部改变,可能会在数据和显示像素之间出现锯齿。放弃,更智能地可视化。我尝试了useRaster=TRUE,但图像仅显示为白色,甚至在我执行dev.copy2pdf之前。唯一显示的是左侧和顶部的两个彩虹条…谢谢。除了对于
dev.copy2svg
,还有一种类似于方便的
dev.copy2pdf
的方法吗?