R 当绘制>1000点时,如何提高绘制条形图的速度?
我正在使用ggplot2为1200个观测值制作条形图。每个观测值都有一个误差条。还有一个平均值是用geom_线表示的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
我发现与较少的观察相比,运行时间非常慢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}