如何让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
相关产品推荐
相关产品推荐

