Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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
R 当绘制>1000点时,如何提高绘制条形图的速度?_R_Performance_Ggplot2_R Markdown_Geom Bar - Fatal编程技术网

R 当绘制>1000点时,如何提高绘制条形图的速度?

R 当绘制>1000点时,如何提高绘制条形图的速度?,r,performance,ggplot2,r-markdown,geom-bar,R,Performance,Ggplot2,R Markdown,Geom Bar,我正在使用ggplot2为1200个观测值制作条形图。每个观测值都有一个误差条。还有一个平均值是用geom_线表示的 我发现与较少的观察相比,运行时间非常慢2秒,例如,如果使用500或粘贴ProfVis运行以解决此问题: 粘贴此问题的ProfVis跑步记录: 我现在假设您的目标是原始速度和描述所需数据内容的可视化。我不确定你是否需要geom_酒吧,如果只有一个酒吧是不同的颜色。如果你的真实世界场景中有7种不同的颜色在1255条中随机混合。。。此解决方案对您不起作用:希望这会有所帮助!: geom

我正在使用ggplot2为1200个观测值制作条形图。每个观测值都有一个误差条。还有一个平均值是用geom_线表示的


我发现与较少的观察相比,运行时间非常慢2秒,例如,如果使用500或粘贴ProfVis运行以解决此问题:


粘贴此问题的ProfVis跑步记录:


我现在假设您的目标是原始速度和描述所需数据内容的可视化。我不确定你是否需要geom_酒吧,如果只有一个酒吧是不同的颜色。如果你的真实世界场景中有7种不同的颜色在1255条中随机混合。。。此解决方案对您不起作用:希望这会有所帮助!:

geom_功能区的渲染速度比geom_栏快得多。对于1255个位置,我没有对它的选项进行调整,但我知道它有步进功能,可以在放大时使它看起来像条。Ymmv

它快得多,我决定使用它两次:一次渲染条,一次渲染错误条。为了让geom_ribbon为我工作,我为x轴值Xval创建了一个数字列,请参见下文

geom_text步骤实际上只打印一个标签,在此步骤中对数据进行子集设置可以节省大量渲染时间。您可以根据需要进行调整

与注释步骤相同,它实际上要打印和重新打印相同的标签1255次,这需要很多时间。显然你不需要这样

上述三个步骤中的每一步都可节省约0.6到0.7秒。也许你可以根据需要与其他几何图形混合搭配

我的系统的最终结果是0.2秒

diamonds4$Xval <- as.numeric(reorder(diamonds4$ID, diamonds4$x))

DiamondCutChartNew <- diamonds4 %>% 
   ggplot(aes(x = Xval, y = x)) + 
   geom_ribbon(aes(ymin = 0, ymax = x), fill="#32572C") +
   geom_col(data = subset(diamonds4, nchar(CutLabel) > 0),
      aes(x = Xval, y = x),
      fill = "#41B1B1") +
   geom_ribbon(data = diamonds4,
      aes(ymin = lower, ymax = upper), fill="#FF000077") +
   geom_line(aes(y = x)) +
   geom_text(data = subset(diamonds4, nchar(CutLabel) > 0),
      aes(label = CutLabel),
      position = position_stack(vjust = 0.5), 
      size = 2.7, angle = 90, fontface = "bold") +
   geom_line(aes(x = Xval, y = Mean), group = 1, linetype = 2, colour = "#0000ff") +
   annotate("text", x = 1, y = head(diamonds4$Mean, 1), hjust = 0, vjust = -0.5, 
      size = 3.2, colour = "#0000ff",
      label=paste0("Mean ", head(diamonds4$Mean, 1))) +
   theme_classic() +
   theme(axis.title.x=element_blank(),
      axis.title.y=element_blank(),
      axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      legend.position = "top") +
   labs(fill = "") 

{StartTime = Sys.time()  
print(DiamondCutChartNew)
EndTime = Sys.time()
EndTime - StartTime}
对我来说,最初的结果是: 时差为2.05秒

新的结果是:
时差为0.229秒

我现在假设您的目标是原始速度和描述所需数据内容的可视化。我不确定你是否需要geom_酒吧,如果只有一个酒吧是不同的颜色。如果你的真实世界场景中有7种不同的颜色在1255条中随机混合。。。此解决方案对您不起作用:希望这会有所帮助!:

geom_功能区的渲染速度比geom_栏快得多。对于1255个位置,我没有对它的选项进行调整,但我知道它有步进功能,可以在放大时使它看起来像条。Ymmv

它快得多,我决定使用它两次:一次渲染条,一次渲染错误条。为了让geom_ribbon为我工作,我为x轴值Xval创建了一个数字列,请参见下文

geom_text步骤实际上只打印一个标签,在此步骤中对数据进行子集设置可以节省大量渲染时间。您可以根据需要进行调整

与注释步骤相同,它实际上要打印和重新打印相同的标签1255次,这需要很多时间。显然你不需要这样

上述三个步骤中的每一步都可节省约0.6到0.7秒。也许你可以根据需要与其他几何图形混合搭配

我的系统的最终结果是0.2秒

diamonds4$Xval <- as.numeric(reorder(diamonds4$ID, diamonds4$x))

DiamondCutChartNew <- diamonds4 %>% 
   ggplot(aes(x = Xval, y = x)) + 
   geom_ribbon(aes(ymin = 0, ymax = x), fill="#32572C") +
   geom_col(data = subset(diamonds4, nchar(CutLabel) > 0),
      aes(x = Xval, y = x),
      fill = "#41B1B1") +
   geom_ribbon(data = diamonds4,
      aes(ymin = lower, ymax = upper), fill="#FF000077") +
   geom_line(aes(y = x)) +
   geom_text(data = subset(diamonds4, nchar(CutLabel) > 0),
      aes(label = CutLabel),
      position = position_stack(vjust = 0.5), 
      size = 2.7, angle = 90, fontface = "bold") +
   geom_line(aes(x = Xval, y = Mean), group = 1, linetype = 2, colour = "#0000ff") +
   annotate("text", x = 1, y = head(diamonds4$Mean, 1), hjust = 0, vjust = -0.5, 
      size = 3.2, colour = "#0000ff",
      label=paste0("Mean ", head(diamonds4$Mean, 1))) +
   theme_classic() +
   theme(axis.title.x=element_blank(),
      axis.title.y=element_blank(),
      axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      legend.position = "top") +
   labs(fill = "") 

{StartTime = Sys.time()  
print(DiamondCutChartNew)
EndTime = Sys.time()
EndTime - StartTime}
对我来说,最初的结果是: 时差为2.05秒

新的结果是:
在我的系统上,0.229秒的时差也需要2秒。基准测试的R方法是system.time{…},还有microbenchmark库和。我通过profvis运行了您的代码,但我不知道如何帮助加快运行时。您需要在我的系统上显式地编写PrintDiamondCutchart代码也需要2秒钟。基准测试的R方法是system.time{…},还有microbenchmark库和。我通过profvis运行了您的代码,但我不知道如何帮助加快运行时。您将需要显式地编写PrintDiamondCutchart代码非常感谢-这大大加快了速度。我也不知道geom_col的事。但是,我不完全确定如何将填充添加到geom_col,因此它也会突出显示其他类似的列。我已经更新了我原始问题中的代码以反映这一点-它现在有3个刻度填充手动值。我不太确定如何将此合并到您提供的代码中?我还需要一个图例来显示这3种颜色。在我的测试中,geom_col甚至比geom_bar慢,不知道为什么。它的渲染方式也略有不同,但或多或少是兼容的。它是这样的:geom_colaesx=Xval,y=x,fill=CutLabel,但我建议使用data=subset。。。所以你只能用高亮显示的颜色来渲染条。非常感谢-这大大加快了渲染速度。我也不知道geom_col的事。但是,我不完全确定如何将填充添加到geom_col,因此它也会突出显示其他类似的列。我已经更新了我原始问题中的代码以反映这一点-它现在有3个刻度填充手动值。我不太确定如何将此合并到您提供的代码中?我还需要一个图例来显示这3种颜色。在我的测试中,geom_col甚至比geom_bar慢,不知道为什么。它呈现出一种神秘感 也略有不同,但或多或少兼容。它是这样的:geom_colaesx=Xval,y=x,fill=CutLabel,但我建议使用data=subset。。。因此,只渲染具有高亮显示颜色的条。
diamonds4$Xval <- as.numeric(reorder(diamonds4$ID, diamonds4$x))

DiamondCutChartNew <- diamonds4 %>% 
   ggplot(aes(x = Xval, y = x)) + 
   geom_ribbon(aes(ymin = 0, ymax = x), fill="#32572C") +
   geom_col(data = subset(diamonds4, nchar(CutLabel) > 0),
      aes(x = Xval, y = x),
      fill = "#41B1B1") +
   geom_ribbon(data = diamonds4,
      aes(ymin = lower, ymax = upper), fill="#FF000077") +
   geom_line(aes(y = x)) +
   geom_text(data = subset(diamonds4, nchar(CutLabel) > 0),
      aes(label = CutLabel),
      position = position_stack(vjust = 0.5), 
      size = 2.7, angle = 90, fontface = "bold") +
   geom_line(aes(x = Xval, y = Mean), group = 1, linetype = 2, colour = "#0000ff") +
   annotate("text", x = 1, y = head(diamonds4$Mean, 1), hjust = 0, vjust = -0.5, 
      size = 3.2, colour = "#0000ff",
      label=paste0("Mean ", head(diamonds4$Mean, 1))) +
   theme_classic() +
   theme(axis.title.x=element_blank(),
      axis.title.y=element_blank(),
      axis.text.x=element_blank(),
      axis.ticks.x=element_blank(),
      legend.position = "top") +
   labs(fill = "") 

{StartTime = Sys.time()  
print(DiamondCutChartNew)
EndTime = Sys.time()
EndTime - StartTime}