我已经为这个问题困扰了好几天了,所以我希望你能帮助我。
我正在尝试使用 为一个非常小的图表创建一条线性回归线pgfplots
。不幸的是,我的 x 轴有符号 x 坐标,而编译器似乎根本不喜欢线性回归。
即使没有线性回归线,图表也能很好地工作,但是一旦我添加它,一切都会变得一团糟。
83 \begin{figure}[h]
84 \centering
85 \begin{tikzpicture}
86 \begin{axis}[
87 title=Wavelength vs. Stopping Voltage,
88 xlabel={Wavelength},
89 ylabel={Stopping Voltage (Volts)},
90 symbolic x coords={Yellow, Green, Blue, Violet, U.V.}
91 ]
92
93 \addplot table {lab3.data};
94 \addplot table [
95 symbolic x coords={Yellow, Green, Blue, Violet, U.V.},
96 y={create col/linear regression={y=Voltage}}] {lab3.data};
97
98 \end{axis}
99 \end{tikzpicture}
100 \end{figure}
答案1
由于您没有提供平均能量损失.data
,我对你的文件的格式做了一些猜测:
Yellow 0
Green 1
Blue 2
Violet 3
U.V. 3
我使用filecontents
示例代码顶部的包创建了它。我使用了文件名,lab3-paul.data
这样它就不会覆盖您的真实数据文件。:-)
这里的主要问题是,pgfplots
需要某种 x 坐标的数值才能执行线性回归计算。如果可以选择修改数据文件,则可以添加数值 x 值列(例如,对于您的情况,可以是纳米光波长,但这实际上并不重要)。如果可以选择,请使用符号 x 坐标进行绘图,使用数值 x 坐标进行回归。
对于这个答案的其余部分,我假设修改数据文件不是一种选择。我们可以创建一个带有一些数值的虚拟列,以便在回归期间使用,但我们必须回到该pgfplotstable
级别直接可用的更复杂的工具。(pgfplots
通过 仅具有一组有限功能的接口\addplot table {...}
。)
第一步是加载数据,使用
\pgfplotstableread{lab3-paul.data}\loadedtable
\loadedtable
现在,从此刻起,我们可以将我们的表称为(该名称是任意的)。
接下来设置创建的列:
\pgfplotstableset{create on use/xnum/.style={create col/expr={\pgfplotstablerow}}}
这将创建一个名为xnum
(同样,任意名称)的列,该列将在使用时创建(即,在pgfplots
/pgfplotstable
命令中查询时)。该列的值只是当前行索引。
对于第一个图(原始数据),不需要改变,但由于我们已经将数据加载到中\loadedtable
,我们不妨使用它,而不是从文件中再次加载它:
\addplot table {\loadedtable};
然后,对于回归线,我们只需要指定我们要使用计算列xnum
作为回归计算的 x 值:
\addplot table [y={create col/linear regression={x=xnum}}] {\loadedtable};
在下面的完整代码中,为了清晰起见,我还添加了一些图例条目:
\RequirePackage{filecontents}
\begin{filecontents*}{lab3-paul.data}
Yellow 0
Green 1
Blue 2
Violet 3
U.V. 3
\end{filecontents*}
\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}
\pgfplotsset{compat=1.11}
\pgfplotstableread{lab3-paul.data}\loadedtable
\pgfplotstableset{create on use/xnum/.style={create col/expr={\pgfplotstablerow}}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
legend pos=south east,
title=Wavelength vs. Stopping Voltage,
xlabel={Wavelength},
ylabel={Stopping Voltage (Volts)},
symbolic x coords={Yellow, Green, Blue, Violet, U.V.}
]
\addplot table {\loadedtable};
\addlegendentry{Data};
\addplot table [y={create col/linear regression={x=xnum}}] {\loadedtable};
\addlegendentry{Regression};
\end{axis}
\end{tikzpicture}
\end{document}