You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Julia的Weave包正确处理文档中的多幅绘图?

在Weave脚本中正确生成多幅独立绘图的解决方法

问题描述

我尝试用Weave生成简易文档,编写了.jl格式的Julia脚本,用注释作为文本内容,代码单独成行。使用Plots包(搭配GR或PyPlots后端)生成两幅绘图,绘图代码由文本块分隔,示例代码如下:

using Plots

#' Paragraph 1
plot( randn(16) )
hline!( [0] )

#' Paragraph 2
plot( rand(32) )
hline!( [0,1] )

运行后,段落和代码片段能正常显示,但两幅绘图都显示成最后一幅。我试过添加#+分隔代码块、设置term=true选项、给plot命令加reuse=false参数,问题仍存在;设置term=true时甚至生成3幅顺序错误的图。

系统信息:Mac系统,Julia 1.9.0版本,Weave 0.10.12版本,在VSCode(未使用绘图面板)和独立终端REPL中均出现此问题。

解决方法

以下几种方式可以确保Weave正确生成并展示多幅独立绘图:

1. 显式调用display()展示绘图

Plots默认会复用当前绘图对象,即使调用新的plot(),若没有显式显示,Weave可能只会捕获最后一个绘图状态。在每个绘图代码块末尾添加display(current()),强制展示当前绘图:

using Plots

#' Paragraph 1
plot(randn(16))
hline!([0])
display(current())  # 显式展示第一幅图

#' Paragraph 2
plot(rand(32))
hline!([0,1])
display(current())  # 显式展示第二幅图

2. 创建独立的绘图对象并显式显示

直接给每个绘图分配变量,然后显示该变量,彻底避免对象复用问题:

using Plots

#' Paragraph 1
p1 = plot(randn(16))
hline!(p1, [0])
display(p1)

#' Paragraph 2
p2 = plot(rand(32))
hline!(p2, [0,1])
display(p2)

3. 调整Weave的代码块选项

在每个绘图代码块前添加#+ results="hold",告诉Weave保留该代码块的所有输出(包括绘图),避免覆盖:

using Plots

#' Paragraph 1
#+ results="hold"
plot(randn(16))
hline!([0])

#' Paragraph 2
#+ results="hold"
plot(rand(32))
hline!([0,1])

4. 全局禁用Plots的绘图复用功能

在脚本开头设置default(reuse=false),让每次调用plot()都创建新的绘图对象,而非复用之前的:

using Plots
default(reuse=false)  # 全局禁用绘图复用

#' Paragraph 1
plot(randn(16))
hline!([0])

#' Paragraph 2
plot(rand(32))
hline!([0,1])

内容的提问来源于stack exchange,提问作者aquaticapetheory

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:22:40