我最近学习了如何在 pgfplots 中绘图,并且非常喜欢它的输出。我在 matlab 中生成数据,然后将其写入文件。文件的一行将包含两个条目,首先是 x 轴数据,然后是相应的 y 轴数据。现在我意识到,我实际上希望 y 轴数据以 dB 为单位,即无论该文件中的当前值是什么,我都希望“x”对应“10*log(y)”,其中对数以 10 为底。但是,现在我无法返回 matlab 并再次生成所有这些数据。所以我必须在 pgfplots 中执行此操作。这可能吗?
对于 MWE,这是我在名为 fig1-line1.dat 的文件中拥有的数据
0 0.095529
1 0.12026
2 0.1514
3 0.19061
4 0.23996
5 0.30209
6 0.38031
7 0.47878
8 0.60275
9 0.75882
10 0.95529
这是我当前绘制它的代码。
\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,shapes,shadows,fit,calc}
\usetikzlibrary[arrows,decorations.pathmorphing,backgrounds,positioning,fit,petri]
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}% <-- moves axis labels near ticklabels (respects tick label widths)
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\pgfplotsset{every axis legend/.append style={legend pos = north west},legend cell align = {left}}
\pgfplotsset{%
tick label style={font=\normalsize},
title style={font=\normalsize,align=center},
label style={font=\normalsize,align=center},
legend style={font=\normalsize}
}
\begin{axis}[%
xlabel = {Iterations},
ylabel = {Relative Error in Convergence $\epsilon_i$},
title = {Convergence Rate v/s Iterations},
enlargelimits = true,
cycle list name = {color},
grid = major,
smooth,
scale = 1]
\addlegendentry{$K=2$, $M=3$}
\addplot [ color = {blue},
mark = {o},
style = {solid},
line width = 2pt] table {fig1-line1.dat};
\end{axis}
\end{tikzpicture}
\caption{A larger example}
\end{figure}
\end{document}
因此,当前的图是“x”对“y”。现在我想将其改为“x”对“10*log(y)”?我该怎么做?
答案1
您可以使用以下方式转换数据y filter/.code={\pgfmathparse{10*log10(\pgfmathresult))}
:
\documentclass[a4paper]{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
y filter/.code={\pgfmathparse{10*log10(\pgfmathresult)}}
]
\addplot table {
0 0.095529
1 0.12026
2 0.1514
3 0.19061
4 0.23996
5 0.30209
6 0.38031
7 0.47878
8 0.60275
9 0.75882
10 0.95529
};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
我不知道为什么你有 10 但是分贝有 20 作为因子但你可以根据你的意愿修改它。
\documentclass[border=3mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{every axis legend/.append style={legend pos = north west},legend cell align = {left}}
\begin{document}
\begin{tikzpicture}
\begin{semilogyaxis}[
log basis y=10,
yticklabel={\pgfmathparse{20*(\tick)}\pgfmathprintnumber[fixed]{\pgfmathresult}},
xlabel = {Iterations},
ylabel = {Relative Error in Convergence $\epsilon_i$ [dB]},
title = {Convergence Rate v/s Iterations},
enlargelimits = true,
cycle list name = {color},
grid = major,
smooth,
scale = 1]
\addlegendentry{$K=2$, $M=3$}
\addplot [ color = {blue},
mark = {o},
style = {solid},
line width = 2pt] table {
0 0.095529
1 0.12026
2 0.1514
3 0.19061
4 0.23996
5 0.30209
6 0.38031
7 0.47878
8 0.60275
9 0.75882
10 0.95529
};
\end{semilogyaxis}
\end{tikzpicture}
\end{document}