Während ich an einem wissenschaftlichen Thema arbeitete, fragte ich mich, ob Folgendes möglich ist: Ich möchte mit dem Befehl mehrere Exponentialkurven zeichnen \addplot
. Die Besonderheit besteht darin, dass die Exponenten nicht fest codiert sein müssen, sondern aus einer Textdatei gelesen werden müssen! Wie könnte dies erreicht werden? Ich habe ein MWE erstellt, um zu verdeutlichen, was ich möchte:
%% MWE for SX: Defining variables with numbers taken from a file
\documentclass{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
%% Use only sans-serif fonts; change to serif if desired
\renewcommand*\sfdefault{phv}
\renewcommand*{\familydefault}{\sfdefault}
\usepackage{arevmath}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{units}
\usetikzlibrary{spy, backgrounds}
\usepackage{pgfplotstable}
\usepackage{xcolor}
\usepackage{amsmath}
%% To read variables from file
\usepackage{datatool}
\usepackage{filecontents}
\newlength\figurewidth
\newlength\figureheight
\newlength\marksize
\begin{document}
%% Width and height of the output figure, adapt as necessary
\setlength{\figurewidth}{13cm}
\setlength{\figureheight}{8cm}
\setlength{\marksize}{2.4pt}
\setlength{\linewidth}{1pt}
%% Define the file in here, as whole files cannot be uploaded to Tex.SE
\begin{filecontents}{LsqExponents.csv}
4.012,3.456,2.345
\end{filecontents}
%% Now read these three values from the file
\DTLloaddb[noheader, keys={b_annu, b_rest, b_stra}]{LsqExponents}{LsqExponents.csv}
%\DTLdisplaydb{LsqExponents}
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=\figurewidth,
height=\figureheight,
scale only axis,
xmin=0.05,
xmax=0.5,
xtick={0.1,0.2,0.3,0.4,0.5},
xlabel={$\text{T G S } \gamma_\mathrm{g} \text{ (-)}$},
%xmajorgrids,
ymin=0,
ymax=0.12,
ylabel={$\text{G R P } h_\mathrm{g} \text{ (-)}$},
yticklabel style={/pgf/number format/fixed,
/pgf/number format/precision=2,
/pgf/number format/fixed zerofill},
%ymajorgrids,
name=plot1,
legend pos=north west,
legend style={anchor=north west,draw=black,fill=white,legend cell align=left, rounded corners=2pt, nodes={inner sep=4pt,text depth=0pt}}
]
%% Fits and functions
\addplot [color=cyan, solid, domain=0:0.5] {x^4.567};
\addlegendentry{Original TD Fit};
\addplot [color=magenta, dashed, domain=0:0.5] {x^3.456};
\addlegendentry{TD-like Fit for Rest};
\addplot [color=black, dashed, domain=0:0.5] {x^2.345};
\addlegendentry{TD-like Fit for Stra};
\end{axis}
\end{tikzpicture}
\end{document}
Wie man sieht, sind die Exponenten nun fest codiert (Zeilen 65-71), sollten aber Float-Variablen sein, die aus der CSV-Datei stammen (die vorher von einem anderen Programm generiert wird)! Ich habe ein bisschen mit dem großendatatool
Paket, aber ich bin mir nicht sicher, wie oder ob es überhaupt möglich ist, es für meine Zwecke einzusetzen. Der \DTLdisplaydb{LsqExponents}
Befehl schlägt fehl, deshalb ist er im MWE auskommentiert.
Ich vermute, die Lösung besteht aus zwei Schritten:
- Abrufen der drei Zahlen als einzelne Variablen in LaTeX/Tikz.
- Ersetzen der fest codierten Exponenten durch diese Variablen.
Jede Hilfe ist willkommen!
Antwort1
Hier mache ich eine Implementierung mit meinem readarray
Paket, das durch Leerzeichen getrennte Daten liest. Die wichtigsten Zeilen sind
\begin{filecontents*}{LsqExponents.ssv}
4.012 3.456 2.345
\end{filecontents*}
%% Now read these three values from the file
\readdef{LsqExponents.ssv}{\mydatadef}
\readArrayij{\mydatadef}{mydata}{1}
Dabei wird der Dateiinhalt in ein \def
benanntes gelesen \mydatadef
. Dann lese ich es aus \mydatadef
und sortiere es in eine 2-D-Array-Struktur mydata
mit dem Namen und der Spaltenbreite = 1 (also effektiv ein 1-D-Array). Auf die Datenwerte wird zugegriffen mit\arrayij{mydata}{<row value>}{1}
%% MWE for SX: Defining variables with numbers taken from a file
\documentclass{standalone}
\usepackage[utf8]{inputenx}
\usepackage[T1]{fontenc}
%% Use only sans-serif fonts; change to serif if desired
\renewcommand*\sfdefault{phv}
\renewcommand*{\familydefault}{\sfdefault}
\usepackage{arevmath}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepgfplotslibrary{units}
\usetikzlibrary{spy, backgrounds}
\usepackage{pgfplotstable}
\usepackage{xcolor}
\usepackage{amsmath}
%% To read variables from file
\usepackage{readarray}
\usepackage{filecontents}
\newlength\figurewidth
\newlength\figureheight
\newlength\marksize
\begin{document}
%% Width and height of the output figure, adapt as necessary
\setlength{\figurewidth}{13cm}
\setlength{\figureheight}{8cm}
\setlength{\marksize}{2.4pt}
\setlength{\linewidth}{1pt}
%% Define the file in here, as whole files cannot be uploaded to Tex.SE
\begin{filecontents*}{LsqExponents.ssv}
4.012 3.456 2.345
\end{filecontents*}
%% Now read these three values from the file
\readdef{LsqExponents.ssv}{\mydatadef}
\readArrayij{\mydatadef}{mydata}{1}
\begin{tikzpicture}[font=\large]
\begin{axis}[%
width=\figurewidth,
height=\figureheight,
scale only axis,
xmin=0.05,
xmax=0.5,
xtick={0.1,0.2,0.3,0.4,0.5},
xlabel={$\text{T G S } \gamma_\mathrm{g} \text{ (-)}$},
%xmajorgrids,
ymin=0,
ymax=0.12,
ylabel={$\text{G R P } h_\mathrm{g} \text{ (-)}$},
yticklabel style={/pgf/number format/fixed,
/pgf/number format/precision=2,
/pgf/number format/fixed zerofill},
%ymajorgrids,
name=plot1,
legend pos=north west,
legend style={anchor=north west,draw=black,fill=white,legend cell align=left, rounded corners=2pt, nodes={inner sep=4pt,text depth=0pt}}
]
%% Fits and functions
\addplot [color=cyan, solid, domain=0:0.5] {x^\arrayij{mydata}{1}{1}};
\addlegendentry{Original TD Fit};
\addplot [color=magenta, dashed, domain=0:0.5] {x^\arrayij{mydata}{2}{1}};
\addlegendentry{TD-like Fit for Rest};
\addplot [color=black, dashed, domain=0:0.5] {x^\arrayij{mydata}{3}{1}};
\addlegendentry{TD-like Fit for Stra};
\end{axis}
\end{tikzpicture}
\end{document}