簡體   English   中英

Julia:將結果導出到表:示例代碼

[英]Julia: Export results to table: example code

請指出有關將一些數據和模擬結果導出到一個整潔,可讀的表格的示例代碼和文檔,這些表格可以輕松地復制粘貼或導入到文檔中,特別是對於使用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一樣的觀星者。

我在我的代碼中使用了unicode Greeks,例如α,可以用XeLaTeX編譯,但是α轉換為\\alpha的解決方案也是受歡迎的。 另一種方法是手動替換我的便利函數show_table的名稱,這並不是那么糟糕。

可能有也可能沒有通常出口乳膠表的好包裝。 我在上面的評論中說的是,根據我的經驗,對於任何嚴肅的文件,你的乳膠表將是復雜的並且最好單獨處理(例如,一些可能有多列,有些可能沒有,有些可能需要自定義間距等) )。 所以可能值得讓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);

在你的朱莉婭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文件給出:

現在,我想清楚我在這里說的是什么。 我不是說這是最通用的自動化朱莉婭方法。 恰恰相反。 這非常適合您的文件。 的意思是,保持用於生成這樣的表,適用於您的項目,並適應它,你需要每一個具體的乳膠表的簡單朱莉婭腳本模板,則可能會是很多寫的情況下更簡單論文或類似的文檔,從長遠來看,你可能需要對你的表進行大量的微調和控制。

因此,在您編寫了第一個表並將其作為模板后,這種方法對於后續表來說很快,因為您只需在此處進行奇怪的調整,同時仍然可以使用新數據更新表,並允許您在更廣泛的Latex Makefile編譯序列中自動編譯julia生成的表。

這是我自己的論文所遵循的方法,它為我節省了很多時間。

請注意,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。

這是一個包:

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

我同意OP的觀點,即快速解決輸出回歸結果很有用。 我可能想花一個小時在一個項目的某個階段建立一個自定義表,但對於初學者和快速分享結果,Julia的stargazer(這是該程序包的目標)是理想的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM