【问题标题】:Julia: Export results to table: example codeJulia:将结果导出到表:示例代码
【发布时间】:2017-06-03 08:20:43
【问题描述】:

请指向示例代码和文档,了解如何将一些数据和模拟结果导出到一个整洁、易读的表格中,该表格可以轻松复制粘贴或导入到文档中,尤其是使用LaTeX 进行后处理时。

我目前的做法是:

using DataFrames
function show_table(mp::ModelParameters, ms::ModelSolution)
    α = mp.α; δ = ms.δ;
    d = DataFrame(Name = @data(["α"]),
                  Description = @data(["alpha"]),
                  Value = @data([α])
    )
    push!(d, @data(["δ", "delta", δ]))
    return(d)
end

    2×3 DataFrames.DataFrame
    │ Row │ Name │ Description │ Value │
    ├─────┼──────┼─────────────┼───────┤
    │ 1   │ "α"  │ "alpha"     │ 1.01  │
    │ 2   │ "δ"  │ "delta"     │ 2.02  │

将上述内容转换为LaTeX 表需要一些工作。朝着正确方向迈出的任何一步都将受到赞赏。

我发现了一个名为LaTeX.jl 的有前途的软件包,它似乎没有得到维护和/或已被取代。梦想是为R 提供类似stargazer 的东西。

我在我的代码中使用了 unicode 希腊语,例如α,可以用XeLaTeX 编译,但也欢迎将α 转换为\alpha 的解决方案。另一种方法是手动替换我的便利函数show_table 中的名称,这还不错。

【问题讨论】:

  • 我显然在 Julia/LaTeX 滚动:https://stackoverflow.com/questions/44120903/julia-docstrings-and-latex
  • 在我(诚然非常个人)的经验中,如果您有一个非常具体的文档,而不是寻求一个通用的解决方案,您还不如通过写信生成您想要的确切 .tex一份文件。然后只需将该文件input 放入您的主.tex 文档中的正确位置。我在整个论文中都这样做了(使用八度音阶)并且效果很好。更不用说您可以将此类 julia / octave 脚本放入您的乳胶 makefile 中,以使它们自动重新编译(例如,在新数据的情况下)并自动重新输入到您的文档中。
  • @TasosPapastylianou,是的,这就是我想做的。你有关于如何在Julia.中导出回归结果的示例代码吗?或者输出我上面的表格的例子?谢谢。
  • show 在 DataFrame 上的输出是一个 html 表格 - 带有 | 的格式只是 julia repl 显示这些的方式。 Jupyter 以另一种方式处理它。我认为 stargazer 只是创建 html 表,对吧?
  • 明智的做法是导出 CSV,然后使用 PGFPlotsTable

标签: latex julia stargazer xelatex


【解决方案1】:

通常可能有也可能没有一个很好的包来导出乳胶表。我在上面的评论中所说的是,根据我的经验,对于任何 serious 文档,您的乳胶表都会很复杂,最好单独处理(例如,有些可能有多列,有些可能没有,其他人可能需要自定义间距等)。因此,可能值得让 julia 脚本生成这些表,即每个表一个脚本。这使您能够在编译最终的乳胶文档时制作您的 makefile 的这一部分。

例如,使用您提供的示例数据框:

%% main.tex -- example bare-bones document illustrating how 
 %             to import externally generated tables, without
 %             affecting the structure of your main document
 %             when those external tables get updated / replaced

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[table]{xcolor}
\begin{document}
  \begin{table}[htbp]
    \centering
    \input{./table1}        % I.e. simply dump julia-generated table here           
    \caption{This table was generated in Julia}
    \label{tbl:table1}
  \end{table}
\end{document}

### table1.jl script
  T[:,:Name] = "\$\\" * T[:,:Description] * "\$";  # replace symbol with latex math

# Generate table header
  Table  = "\\begin{tabular}{| " * "c |" ^ (ncol(T)+1) * "}\n";
  Table *= "    \\hline\n";
  Table *= "    % Table header\n";
  Table *= "    \\rowcolor[gray]{0.9}\n";
  Table *= "  Row"; for i in 1:ncol(T); Table *= " & " * string(names(T)[i]); end; Table *= " \\\\\n";

# Generate table body (with nice alternating row colours)
  toggleRowColour(x) = x == "0.8" ? "0.7" : "0.8";
  rowcolour = toggleRowColour(0.7);

  Table *= "    % Table body\n";
  for row in 1 : nrow(T)
    Table *= "  \\rowcolor[gray]{" * (rowcolour = toggleRowColour(rowcolour); rowcolour) * "}\n";
    Table *= "  " * string(row); for col in 1 : ncol(T) Table *= " & " * string(T[row,col]); end; Table *= " \\\\\n";
    Table *= "  \\hline\n"; 
  end
  Table *= "\\end{tabular}\n";

# Export result to .tex file
  write("table1.tex", Table);

在你的 julia REPL 中:

julia> using DataFrames
julia> # function show_table defined as above ...
julia> T = show_table(1.01,2.02);
julia> include("table1.jl")

导致以下table1.tex文件:

\begin{tabular}{| c |c |c |c |}
  \hline
  % Table header
  \rowcolor[gray]{0.9}
  Row & Name & Description & Value \\
  % Table body
  \rowcolor[gray]{0.7}
  1 & $\alpha$ & alpha & 1.01 \\
  \hline
  \rowcolor[gray]{0.8}
  2 & $\delta$ & delta & 2.02 \\
  \hline
\end{tabular}

编译生成的main.tex 文件给出:

                

现在,我想清楚我在这里说的是什么。我并不是说这是最通用的、自动化的 julia 方法。恰恰相反。这高度特定于您的文件。我 am 说的是,保留一个简单的 julia 脚本模板来生成适合您项目的此类表格,并针对您需要的每个特定乳胶表格进行调整,可能会更多在撰写论文或类似文档的情况下很简单,从长远来看,您可能需要对表格进行大量微调和控制。

因此,在您编写完第一个表并将其作为模板之后,这种方法对于后续表来说很快,因为您只需在这里和那里进行一些奇怪的调整,同时仍然可以使用新数据更新您的表当它们出现时,并允许您在更广泛的 Latex Makefile 编译序列中自动编译 julia 生成的表。

这是我在撰写论文时所采用的方法,它为我节省了 很多 时间。

【讨论】:

  • 另一种选择是使用 Mustache.jl
【解决方案2】:

请注意,DataTables.jl 中存在 LaTeX 导出:

julia> using DataTables

julia> dt = DataTable(Fish = ["Suzy", "Amir"], Mass = [1.5, 2])
2×2 DataTables.DataTable
│ Row │ Fish │ Mass │
├─────┼──────┼──────┤
│ 1   │ Suzy │ 1.5  │
│ 2   │ Amir │ 2.0  │

julia> reprmime("text/latex", dt)
"\\begin{tabular}{r|cc}\n\t& Fish & Mass\\\\\n\t\\hline\n\t1 & Suzy &     1.5 \\\\\n\t2 & Amir & 2.0 \\\\\n\\end{tabular}\n"

它可以很容易地向后移植到 DataFrames。

【讨论】:

  • 现在 DataFrames 0.11 支持它。
  • 是否可以保存tex文件而不包括具有行号的列?
【解决方案3】:

这是一个包:

https://github.com/jmboehm/RegressionTables.jl

我同意 OP 的观点,即快速解决输出回归结果很有用。我可能想在项目的某个阶段花一个小时来构建一个自定义表,但对于初学者和快速分享结果来说,Julia 的 stargazer(这是该软件包的目标)是理想的。

【讨论】:

  • 感谢您的跟进!
猜你喜欢
  • 2014-03-11
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多