小编Sel*_*lim的帖子

使用R计算热图中的箱柜数

这个问题来自以下两个主题:

如何使用stat_bin2d()来计算ggplot2中的计数标签?

如何在r中的热图单元格中显示数值单元格值

在第一个主题中,用户想要使用stat_bin2d生成热图,然后想要在热图上写入每个bin的计数.用户最初想要使用的方法不起作用,这是表明stat_bin2d设计为使用geom ="rect"而不是"text"的最佳答案.没有给出令人满意的答复.

第二个问题几乎与第一个问题相同,但有一个关键的区别,即第二个问题中的变量是文本,而不是数字.答案产生了所需的结果,将bin的计数值放在stat_2d热图中的bin上.

为了比较我准备以下代码的两种方法:

    library(ggplot2)
    data <- data.frame(x = rnorm(1000), y = rnorm(1000))
    ggplot(data, aes(x = x, y = y))
      geom_bin2d() + 
      stat_bin2d(geom="text", aes(label=..count..))
Run Code Online (Sandbox Code Playgroud)

我们知道这首先给你错误:

"错误:geom_text需要以下缺失的美学:x,y".

与第一个问题中的问题相同.有趣的是,从stat_bin2d更改为stat_binhex可以正常工作:

    library(ggplot2)
    data <- data.frame(x = rnorm(1000), y = rnorm(1000))
    ggplot(data, aes(x = x, y = y))
      geom_binhex() + 
      stat_binhex(geom="text", aes(label=..count..))
Run Code Online (Sandbox Code Playgroud)

这是伟大的,但一般来说,我不认为十六进制binning是非常清楚的,并且为了我的目的,我不会为我想要的数据工作.我真的想使用stat_2d.

为了实现这一点,我根据第二个答案准备了以下工作:

    library(ggplot2)
    data <- data.frame(x = rnorm(1000), y = rnorm(1000))
    x_t<-as.character(round(data$x,.1))
    y_t<-as.character(round(data$y,.1))
    x_x<-as.character(seq(-3,3),1)
    y_y<-as.character(seq(-3,3),1)
    data<-cbind(data,x_t,y_t)



    ggplot(data, aes(x = x_t, y = y_t)) +
      geom_bin2d() + 
      stat_bin2d(geom="text", aes(label=..count..))+
      scale_x_discrete(limits =x_x) …
Run Code Online (Sandbox Code Playgroud)

r heatmap ggplot2

10
推荐指数
1
解决办法
3970
查看次数

Arcpy 脚本以前快现在慢?

问题几乎概括了这一点。今天早些时候我在 PyCharm 中运行了以下脚本:

rasterfolder = "F:/1_Raster_Processing/Classified/"
vectorfolder = "H:/Output/SplitShapes/"
tablefolder = "H:/Output/Split_Tables_3/"


import arcview
import arcpy
from arcpy.sa import *
arcpy.CheckOutExtension("spatial")


arcpy.env.workspace = vectorfolder
flist = arcpy.ListFeatureClasses()
for f in flist:
    TabulateArea(f,"FID",rasterfolder + "KNN100_" + f[:-6] + ".tif","Value",tablefolder + f[:-4] + ".dbf",0.25)
Run Code Online (Sandbox Code Playgroud)

一个要素类大约需要 4 分钟,并且有几百个要素类需要运行。在一天中间的某个时刻,该进程挂起并且不再生成任何输出,因此我终止了它并重新开始(认为这是 pyCharm 问题)。当我重新开始时,每个要素类突然需要大约 1 小时以上才能执行完全相同的过程。我已经在 WingIDE 中尝试了相同的过程,但仍然遇到问题。我已经重新启动了所有内容,并且除了这台机器上的这个进程之外什么都不运行。想法?我需要在这里牺牲一只牲口吗?winRar 需要付费吗?

其他人在运行脚本时是否遇到过问题?前几次运行得很好,但突然间,没有明显的原因,速度大幅减慢?

python ide arcpy

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

在源脚本中使用 parLapply 会导致内存泄漏

这可能是哲学家的一个……(或@Steve Weston 或@Martin Morgan)

我在使用 parLapply 时遇到了一些内存泄漏问题,在深入研究了足够多的线程后,我认为这个问题是有道理的。我花了一些时间来尝试解决这个问题,虽然我对观察到的行为发生的原因有所了解,但我不知道如何解决它。

将以下内容视为源脚本,另存为: parallel_question.R

rf.parallel<-function(n=10){
  library(parallel)
  library(randomForest)

  rf.form<- as.formula(paste("Final", paste(c('x','y','z'), collapse = "+"), sep = " ~ "))

  rf.df<-data.frame(Final=runif(10000),y=runif(10000),x=runif(10000),z=runif(10000))

  rf.df.list<-split(rf.df,rep(1:n,nrow(rf.df))[1:nrow(rf.df)])

  cl<-makeCluster(n)
  rf.list<-parLapply(cl,rf.df.list,function(x,rf.form,n){
    randomForest::randomForest(rf.form,x,ntree=100,nodesize=10, norm.votes=FALSE)},rf.form,n)
  stopCluster(cl)

  return(rf.list)
  }
Run Code Online (Sandbox Code Playgroud)

我们使用以下命令获取并运行脚本:

scrip.loc<-"G:\\Scripts_Library\\R\\Stack_Answers\\parallel_question.R"

source(scrip.loc)

rf.parallel(n=10)
Run Code Online (Sandbox Code Playgroud)

相当直接……我们并行运行了几个随机森林。似乎是内存效率。我们可以稍后将它们组合起来,或者做其他事情。便利。好的。表现得很好。

现在考虑以下脚本,另存为 parallel_question_2.R

rf.parallel_2<-function(n=10){
  library(parallel)
  library(magrittr)
  library(randomForest)

  rf.form<- as.formula(paste("Final", paste(c('x','y','z'), collapse = "+"), sep = " ~ "))

  rf.df<-data.frame(Final=runif(10000),y=runif(10000),x=runif(10000),z=runif(10000))

  large.list<-rep(rf.df,10000)

  rf.df.list<-split(rf.df,rep(1:n,nrow(rf.df))[1:nrow(rf.df)])

  cl<-makeCluster(n)
  rf.list<-parLapply(cl,rf.df.list,function(x,rf.form,n){

    randomForest::randomForest(rf.form,x,ntree=100,nodesize=10, norm.votes=FALSE)},rf.form,n)

  stopCluster(cl)

  return(rf.list)
}
Run Code Online (Sandbox Code Playgroud)

在第二个脚本中,我们在源代码环境中有一个很大的列表。我们不会调用列表或将其带入我们的并行函数中。我已将列表的大小设置为在至少 32GB 的机器上可能是个问题。

scrip.loc<-"G:\\Scripts_Library\\R\\Stack_Answers\\parallel_question_2.R"

source(scrip.loc)

rf.parallel_2(n=10)
Run Code Online (Sandbox Code Playgroud)

当我们运行第二个脚本时,我们最终携带了大约 3gb(我们的大列表的大小)* 设置到集群的工作线程数,以及额外的材料。如果我们在无源环境中运行第二个脚本的内容,则不会出现这种行为;相反,我们得到一个 ~3gb 的列表,并行化的函数运行没有问题,这就是它的结束。

那么..如何/为什么工作环境从父环境中获取不必要的变量元素?为什么它只发生在源脚本中?当我有一个源代码、大型且复杂的脚本,其中包含并行化的子部分(但可能有 3-10gb 的中间数据被携带)时,我该如何缓解这种情况?

相关或类似的主题:

在函数内使用 …

parallel-processing r

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

标签 统计

r ×2

arcpy ×1

ggplot2 ×1

heatmap ×1

ide ×1

parallel-processing ×1

python ×1