我在 csv 文件中有以下损失图数据。列 (a) Epochs、(b) Test_loss、(c) Train_loss 和此数据的 10,000 行条目(总共 10,000 个 epoch)。我想以 tikz 格式绘制此图,该怎么做?
我的格式为;
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{loglogaxis}[
xmin=0, xmax=1e2,
ymin=1e-7, ymax=1e1,
xlabel={Number of Epochs},
ylabel={Normalized MSE: $\log_{10} (e)$ },
label style={font=\bfseries\boldmath},
tick label style={font=\bfseries\boldmath},
scatter/classes={a={mark=square*, blue}, b={mark=triangle*, red}, c={mark=o, black}},
]
\addplot[scatter, only marks,
scatter src=explicit symbolic]
table[meta=label] {
x y label
};
\end{loglogaxis}
\end{tikzpicture}
\end{document}
我的 csv 文件看起来像这样。
周期、测试损失、训练损失
0,0.203095777,0.234712227
1,0.202614659,0.234308232
2,0.202137079,0.233968432
csv 文件链接:我已将 2000 行数据集的前 20 行复制到此文件中,并将其命名为 3N5H_test.csv 。
答案1
我不确定您的 CSV 文件是什么样的,但根据您的描述猜测,一种简单的方法可能如下:我了解您得到了一个内容类似于以下内容的 CSV 文件:
Epoch, Test_loss, Train_loss, Test_metric
1, 0.02, 0.03, 0.025
1000, 0.01, 0.005, 0.015
...
\addplot
在这种情况下,您可以通过为要绘制的每一列添加一个宏来简单地解析它,让其x
成为Epoch
列,并y
让其具有相关值:
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
% your CSV file:
\begin{filecontents}{data.csv}
Epoch, Test_loss, Train_loss, Test_metric
1, 0.02, 0.03, 0.025
1000, 0.01, 0.005, 0.015
\end{filecontents}
% =====
\begin{document}
\begin{tikzpicture}
\begin{semilogyaxis}[
xmin=0, xmax=1e4,
ymin=1e-4, ymax=1e-1,
scaled x ticks=false,
xlabel={Number of Epochs},
ylabel={Normalized MSE: $\log_{10} (e)$},
label style={font=\bfseries\boldmath},
tick label style={font=\bfseries\boldmath},
]
\addplot[scatter, no marks, draw=blue]
table [x=Epoch, y=Test_loss, col sep=comma] {data.csv};
\addplot[scatter, no marks, draw=red]
table [x=Epoch, y=Train_loss, col sep=comma] {data.csv};
\addplot[scatter, no marks, draw=orange]
table [x=Epoch, y=Test_metric, col sep=comma] {data.csv};
\end{semilogyaxis}
\end{tikzpicture}
\end{document}
当然,您不需要将 CSV 数据包含在 TeX 文件中。只需将 CSV 文件放在存储 TeX 文件的同一目录中,然后写入,例如。在这种情况下,您可以忽略和\addplot[scatter, no marks, draw=blue] table [...] {<file name>};
之间的内容(包括这两行),因为这只是为了使上述示例可编译。\begin{filecontents}{data.csv}
\end{filecontents}
抱歉,我无法真正重现您遇到的问题。我根据您提供的数据调整了上述示例:
该文件3N5H.csv
(请注意,CSV 文件中可能不应该有空行,因为这些空行会被解释为(空)数据点):
Epochs,Test_loss,Train_loss
0,0.203095777,0.234712227
1,0.202614659,0.234308232
2,0.202137079,0.233968432
TeX 文件:
\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{semilogyaxis}[
% xmin=0, xmax=1e4, % The output would not be visible otherwise
% ymin=1e-4, ymax=1e-1, % The output would not be visible otherwise
scaled x ticks=false,
enlargelimits,
xlabel={Number of Epochs},
ylabel={Normalized MSE: $\log_{10} (e)$},
label style={font=\bfseries\boldmath},
tick label style={font=\bfseries\boldmath},
]
\addplot[scatter, no marks, draw=blue] table [x=Epochs, y=Test_loss, col sep=comma] {3N5H.csv};
\addplot[scatter, no marks, draw=red] table [x=Epochs, y=Train_loss, col sep=comma] {3N5H.csv};
\end{semilogyaxis}
\end{tikzpicture}
\end{document}
结果: