在R中创建热图已成为许多帖子,讨论和迭代的主题.我的主要问题是将格子levelplot()或基本图形中可用解决方案的视觉灵活性image()与基本heatmap(),pheatmap pheatmap()或gplots'的轻松聚类结合起来很棘手heatmap.2().这是我想要改变的一个小细节 - x轴上标签的对角线方向.让我告诉你我在代码中的观点.
#example data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")
Run Code Online (Sandbox Code Playgroud)
您可以使用levelplot()以下方法轻松更改方向到对角
require(lattice)
levelplot(d, scale=list(x=list(rot=45)))
Run Code Online (Sandbox Code Playgroud)

但应用聚类似乎很痛苦.其他视觉选项也是如此,例如在热图单元格周围添加边框.
现在,转移到实际的heatmap()相关功能,聚类和所有基本视觉效果都非常简单 - 几乎不需要调整:
heatmap(d)
Run Code Online (Sandbox Code Playgroud)

所以在这里:
require(gplots)
heatmap.2(d, key=F)
Run Code Online (Sandbox Code Playgroud)

最后,我最喜欢的一个:
require(pheatmap)
pheatmap(d)
Run Code Online (Sandbox Code Playgroud)

但所有这些都无法旋转标签.手册pheatmap建议我可以使用grid.text自定义标签.真是太高兴 - 尤其是在聚类和更改显示标签的顺序时.除非我在这里遗漏了什么......
最后,还有一件旧货image().我可以旋转标签,一般来说它是最可定制的解决方案,但没有聚类选项.
image(1:nrow(d),1:ncol(d), d, axes=F, ylab="", xlab="")
text(1:ncol(d), 0, srt = 45, labels = rownames(d), xpd …Run Code Online (Sandbox Code Playgroud) R trace()是一个功能强大的调试工具,允许用户"在任何函数中的选定位置插入调试代码".不幸的是,从命令行使用它可能相当费力.
作为一个人为的例子,假设我想插入调试代码,该代码将报告计算的间隔时间间隔pretty.default().我想在delta计算值后立即插入代码,从函数定义的底部开始大约四行.(键入pretty.default以查看我的意思.)要指示该行,我需要找到它对应的代码中的哪一步.答案结果是步骤list(c(12, 3, 3)),我通过执行以下步骤来实现这一点:
as.list(body(pretty.default))
as.list(as.list(body(pretty.default))[[12]])
as.list(as.list(as.list(body(pretty.default))[[12]])[[3]])
as.list(as.list(as.list(body(pretty.default))[[12]])[[3]])[[3]]
Run Code Online (Sandbox Code Playgroud)
然后我可以插入这样的调试代码:
trace(what = 'pretty.default',
tracer = quote(cat("\nThe value of delta is: ", delta, "\n\n")),
at = list(c(12,3,3)))
## Try it
a <- pretty(c(1, 7843))
b <- pretty(c(2, 23))
## Clean up
untrace('pretty.default')
Run Code Online (Sandbox Code Playgroud)
所以这里有我的问题:有没有办法打印出一个函数(或它的解析版本),其中的行被它们所属的步骤很好地标记了?(根据Venables和Ripley的说法,S-plus有一个函数tprint()"产生一个函数体的编号列表,用于at参数trace",但R似乎没有等价物.)或者,还有另一种更简单的方法,从命令行,快速设置函数内特定行的调试代码?
我使用这个pretty.default()例子是因为它有合理的驯服,但是有了真实/有趣的功能,反复使用as.list()很快会变得烦人和分散注意力.这是一个例子:
as.list(as.list(as.list(as.list(as.list(as.list(as.list(as.list(as.list(body(#
model.frame.default))[[26]])[[3]])[[2]])[[4]])[[3]])[[4]])[[4]])[[4]])[[3]]
Run Code Online (Sandbox Code Playgroud) 目前,我总是使用优秀的ReporteRs包将我的R图导出为矢量格式的Powerpoint ,如
library(ReporteRs)
myplot = function() print(qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7)))
doc = pptx()
doc = addSlide(doc, slide.layout = "Blank")
doc = addPlot( doc, myplot, vector.graphic = TRUE, fontname="Arial",
offx = 0.1*dim(doc)$slide.dim["width"], offy = 0.05*dim(doc)$slide.dim["height"],
width = 0.8*dim(doc)$slide.dim["width"], height = 0.9*dim(doc)$slide.dim["height"])
writeDoc( doc, "plot.pptx")
Run Code Online (Sandbox Code Playgroud)

我觉得在这个工作流程中不方便的是,我现在必须将我的绘图命令包装在一个函数中(使用print()for lattice或ggplot2plot,或者仅return(plot())用于基础R图),并且我不喜欢手动指定偏移量和大小(我通常更喜欢在幻灯片中获得几乎填充页面,居中的图形.我想知道如果相反,它不可能使你的情节第一(基础R情节,lattice情节或ggplot2情节),然后定义一个函数export2PPT,其捕获当前的图形装置的输出作为一个功能,并将其传递到ReporteRs和addPlot至将您的绘图导出为Powerpoint(居中和适当缩放),类似于以dev.copy2pdf相同方式导出为PDF的功能?
一旦我们有了这样的功能,甚至可能修改grDevices函数 …
序言:我想从R创建出版级图形而不进行后处理.我所在研究所的其他研究人员总是在图形软件(如Adobe Illustrator)中进行后处理.我希望避免这种情况.
我的抱怨是R不对负数使用正确的减号(特别是在绘图轴上):
plot(-20:-1, rnorm(20) + 1 : 20)
Run Code Online (Sandbox Code Playgroud)

(我已经把犯罪者围了起来供你考虑.)
作为一个排版书呆子(这是真的!检查我的职业生涯简历!)这是不可接受的.我需要在这里使用正确的Unicode字符ᴍɪɴᴜꜱꜱɪɢɴ(U + 2212," - ").我的一个朋友在发布之前通过替换Adobe Illustrator中的所有减号来实现这一点,但我不禁认为必须有一种更好的方法 - 从R内部 - 来实现这一目标; 并且不会强迫我手动更换所有轴标签.
(我目前没有使用ggplot2,但如果有一个只适用于ggplot2的解决方案,我很乐意接受它.)
是否有单一的功能,类似于"runif","rnorm"等,它们将为线性模型产生模拟预测?我可以自己编写代码,但代码很难看,我认为这是以前有人做过的事情.
slope = 1.5
intercept = 0
x = as.numeric(1:10)
e = rnorm(10, mean=0, sd = 1)
y = slope * x + intercept + e
fit = lm(y ~ x, data = df)
newX = data.frame(x = as.numeric(11:15))
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是一个看起来如下所示的函数:
sims = rlm(1000, fit, newX)
Run Code Online (Sandbox Code Playgroud)
该函数将根据新的x变量返回1000个y值模拟.
这是我第一次尝试此操作,因此如果我弄错了术语,我们深表歉意。我正在使用一个软件包(生物导体上的snapCGH)。我调用了一个函数plotSegmentedGenome,该函数又调用了基因组图。这两个函数都在snapCGH命名空间中:
> environment(plotSegmentedGenome)
<environment: namespace:snapCGH>
> environment(genomePlot)
<environment: namespace:snapCGH>
Run Code Online (Sandbox Code Playgroud)
我想修改基因组图。我的第一次尝试是简单地运行
> genomePlot
Run Code Online (Sandbox Code Playgroud)
因此,我可以获取代码并从中创建一个新函数。我想更改两件小事。它以mb为单位标记x轴,而Id则以bp为单位标记(因此要乘以标签,但所绘制的值将不乘以1000000)。其次,它用令人讨厌的红色染色体标记了x轴。我想完全删除该标签。将此尝试另存为基因组图.R并获得了它。
如果然后运行plotSegmentedGenome,则没有任何变化。因此,我认为它仍在其命名空间中使用基因组绘图功能。如果在全局环境中创建自己的plotSegmentedGenome副本,则会收到错误“错误:找不到对象'chrominfo.Mb'”。这是plotSegmentedGenome的参数之一,我想是在环境中创建的。
我希望这是有道理的,并且有一个解决方案并不容易:)
ps:我在http://www.r-bloggers.com/environments-in-r/上阅读了此内容,虽然很有趣,但不够详尽,无法让我找出解决方法。如果我能写
snapCGH$genomePlot <- customGenomePlot
or
snapCGH:::genomePlot <- customGenomePlot
Run Code Online (Sandbox Code Playgroud)
更新:基于包函数内的重定向/拦截函数调用
我试过了
library(proto)
plotSegmentedGenome <- with(proto(environment( plotSegmentedGenome), plotSegmentedGenome = snapCGH:: plotSegmentedGenome, genomePlot = genomePlot), my_genomePlot)
Run Code Online (Sandbox Code Playgroud)
但是我仍然收到错误
Error in plotSegmentedGenome(SegInfo.Hom.runDNAcopy, array = array, chrom.to.plot = 19, :
object 'chrominfo.Mb' not found
>
Run Code Online (Sandbox Code Playgroud)
它至少正在调用该函数的版本,因为它会打印我卡在my_genomePlot中的消息(“它还活着!”)。
r ×6
debugging ×1
export ×1
ggplot2 ×1
heatmap ×1
label ×1
lattice ×1
lm ×1
plot ×1
powerpoint ×1
regression ×1
reporters ×1
typography ×1