相关疑难解决方法(0)

热图中x轴上的对角线标注方向

在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)

label r data-visualization heatmap lattice

26
推荐指数
5
解决办法
3万
查看次数

在函数中给定行设置调试代码的快速方法是什么?

前言:

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)

debugging r

21
推荐指数
2
解决办法
887
查看次数

R:将当前活动的R图导出到Powerpoint/Word/LibreOffice的功能

目前,我总是使用优秀的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 latticeggplot2plot,或者仅return(plot())用于基础R图),并且我不喜欢手动指定偏移量和大小(我通常更喜欢在幻灯片中获得几乎填充页面,居中的图形.我想知道如果相反,它不可能使你的情节第一(基础R情节,lattice情节或ggplot2情节),然后定义一个函数export2PPT,其捕获当前的图形装置的输出作为一个功能,并将其传递到ReporteRsaddPlot至将您的绘图导出为Powerpoint(居中和适当缩放),类似于以dev.copy2pdf相同方式导出为PDF的功能?

一旦我们有了这样的功能,甚至可能修改grDevices函数 …

powerpoint export r ggplot2 reporters

19
推荐指数
1
解决办法
1万
查看次数

修复轴标签中的排版

序言:我想从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的解决方案,我很乐意接受它.)

plot typography r

18
推荐指数
4
解决办法
1055
查看次数

是否有一个函数或包来模拟从lm()返回的对象的预测?

是否有单一的功能,类似于"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值模拟.

regression r lm

8
推荐指数
1
解决办法
2166
查看次数

修改包装功能

这是我第一次尝试此操作,因此如果我弄错了术语,我们深表歉意。我正在使用一个软件包(生物导体上的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

5
推荐指数
2
解决办法
2390
查看次数