【问题标题】:Clash between plots and printed text in Julia notebookJulia notebook 中的绘图和打印文本之间的冲突
【发布时间】:2020-08-16 19:08:09
【问题描述】:

我有一个 Julia Jupyter 笔记本,我在其中使用 Plots 生成绘图,例如,类似

thxpplot=plot(title=title,xlabel="T (K)",ylabel="V/V0")
thxpplot=plot!(Tplt,Vplt/V0,label=mat,color="red")
display((thxpplot))

还有文本输出,例如,

@printf("%s: %s (%d atoms)\n","Material",mat,N)

令人讨厌的是,两个输出流似乎并不同步。它经常发生,特别是在比这更大的示例中,打印文本的一部分出现在情节之前,其余部分出现在情节之后,即使代码给出的连续指令清楚地将两者分开。如何确保这些输出流之间的正确同步,或者换句话说,如何立即刷新输出缓冲区?我不认为这是 Python 笔记本中的问题。

托马斯

【问题讨论】:

    标签: plot jupyter-notebook julia


    【解决方案1】:

    你可以用

    刷新标准输出
    flush(stdout)
    

    但是,如果您将绘图与文本混合使用,请注意绘图使用 display 命令而不是 println,有时您可能仍会遇到同步问题,因为这些流由 Jupyter 单独处理。

    在这种情况下的解决方案是使用:

    display("some text you want to display")
    

    这样你就可以控制输出的顺序了。

    在您的情况下,您可能想要使用 @printf 而不是:

    display(@sprintf("whatever you want to print"))
    

    然而,这使用默认的text/plain MIME 类型(并添加引号等)。

    通过不同的 MIME 类型,您的结果可能会更好:

    display("text/json", @sprintf("%s: %s (%d atoms)\n","Material",4,5))
    

    或者你甚至可以使用 HTML

    display("text/html", @sprintf("%s: <b>%s</b> (<b>%d</b> atoms)\n","Material",4,5))
    

    【讨论】:

    • 虽然这似乎解决了订单问题,但我发现至少有两个缺点: 1. @sprintf 的参数显示在引号中,与我的初衷相反; 2. 并非所有格式化指令都被翻译,具体\t\n是逐字转载的。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2015-05-04
    • 2013-11-24
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    相关资源
    最近更新 更多