6

What I want: \abs{S21/S12-1}*100% where S21 and S12 are columns in txt-files

What I have: no idea; really. I am profoundly unsure, if it is even possible in PGF/tikz to make this calculation. If not, what alternatives would there be in TeX? PGFmath?

(I can still just take all the stuff to Matlab, calculate, re-import in TeX, but ... meh.)

What I tried I read the following three posts and tried to adapt: 1, 2 and 3 - where the latter gave me the idea, that basic operations should be possible but tricky to achieve because of the parser.

Below is a MWE (optimistically called; it does not compile) of what i want to get.

\documentclass{article}
\usepackage{amsmath,amsthm}
\usepackage{tikz} 
\usetikzlibrary{calc}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.14}

% sample values, extracted from 100/dB_IC_10mA_S21.txt and 100/dB_IC_10mA_S12.txt 

\pgfplotstableread[col sep=space]{% 
f1  s21
3.00000000000000000E5   -5.37923824569095640E-1
9.24624999999999990E5   -5.23021516857375080E-1
1.54925000000000020E6   -5.24032299826929030E-1 
2.17387499999999980E6   -5.18575016774617570E-1
2.79850000000000020E6   -5.17614614317642550E-1
3.42312500000000020E6   -5.28421012169730810E-1
4.04774999999999970E6   -5.25424891213584110E-1
4.67237500000000060E6   -5.24097415339730870E-1 
5.29700000000000060E6   -5.28626243766300340E-1
5.92162500000000060E6   -5.38603437681817350E-1
6.54625000000000060E6   -5.24872720444434120E-1
7.17087499999999970E6   -5.26809061504114420E-1
7.79549999999999970E6   -5.21513983574569910E-1
8.42012500000000050E6   -5.35052438394172110E-1
}\datas

\pgfplotstableread[col sep=space]{% 
f2  s12
3.00000000000000000E5   -4.61253023410550080E-1
9.24624999999999990E5   -4.44818670150491350E-1
1.54925000000000020E6   -4.45906534066983800E-1
2.17387499999999980E6   -4.54506559283727720E-1
2.79850000000000020E6   -4.50208906640044760E-1
3.42312500000000020E6   -4.52753227856168470E-1
4.04774999999999970E6   -4.53657966529585540E-1
4.67237500000000060E6   -4.64282209437626040E-1
5.29700000000000060E6   -4.51387968956751350E-1
5.92162500000000060E6   -4.59361196203085690E-1
6.54625000000000060E6   -4.66558553131420340E-1
7.17087499999999970E6   -4.44614963756639090E-1
7.79549999999999970E6   -4.57214959955166740E-1
8.42012500000000050E6   -4.54436434169834770E-1
}\datat
\begin{document}    
\begin{tikzpicture}
    \begin{axis}[
    no markers,%
    ]
%       \addplot+[thin] table [col sep=space]{100/dB_IC_10mA_S12.txt};  
% complete file of measurement data
%       \addplot+[thin] table [col sep=space]{100/dB_IC_10mA_S21.txt};  
% complete file of measurement data
%       \addplot+[thin] table [col sep=space]\abs{{100/dB_IC_10mA_S12.txt}-{100/dB_IC_10mA_S21.txt}}; 
% not working
%       \addplot+[thin] table [col sep=space]\abs{\datas - \datat}; 
% not working
    \addplot+[thin] table [col sep=space] (${\abs{\datas - \datat}}$);
    \addplot+[thin] table[col sep=space, x=(${\abs{\datas - \datat}}$),y=f2] 
    \end{axis}
    \end{tikzpicture} 
\end{document}

1 Answers1

5

First I think you need to merge the two tables, to be able to use data from both in the same plot. See e.g. merge two tables into one for a way. Basically, you can insert a column from one table into another using

\pgfplotstablecreatecol[
  copy column from table={\datas}{[index] 1},
  ]{s21}{\datat}

To plot the result of a calculation based on columns in a table, you can use y expr=<calculation>, and in the calculation you can use \thisrow{<column name>} to access values in the table. So if I understand correctly, you want y expr={abs(\thisrow{s21}/\thisrow{s12}-1)*100}, which is used as

\addplot+[thin] table[x=f1,y expr={abs(\thisrow{s21}/\thisrow{s12}-1)*100}] {\datat};  

Complete code:

\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.13}

% sample values, extracted from 100/dB_IC_10mA_S21.txt and 100/dB_IC_10mA_S12.txt 

\pgfplotstableread[col sep=space]{% 
f1  s21
3.00000000000000000E5   -5.37923824569095640E-1
9.24624999999999990E5   -5.23021516857375080E-1
1.54925000000000020E6   -5.24032299826929030E-1 
2.17387499999999980E6   -5.18575016774617570E-1
2.79850000000000020E6   -5.17614614317642550E-1
3.42312500000000020E6   -5.28421012169730810E-1
4.04774999999999970E6   -5.25424891213584110E-1
4.67237500000000060E6   -5.24097415339730870E-1 
5.29700000000000060E6   -5.28626243766300340E-1
5.92162500000000060E6   -5.38603437681817350E-1
6.54625000000000060E6   -5.24872720444434120E-1
7.17087499999999970E6   -5.26809061504114420E-1
7.79549999999999970E6   -5.21513983574569910E-1
8.42012500000000050E6   -5.35052438394172110E-1
}\datas

\pgfplotstableread[col sep=space]{% 
f2  s12
3.00000000000000000E5   -4.61253023410550080E-1
9.24624999999999990E5   -4.44818670150491350E-1
1.54925000000000020E6   -4.45906534066983800E-1
2.17387499999999980E6   -4.54506559283727720E-1
2.79850000000000020E6   -4.50208906640044760E-1
3.42312500000000020E6   -4.52753227856168470E-1
4.04774999999999970E6   -4.53657966529585540E-1
4.67237500000000060E6   -4.64282209437626040E-1
5.29700000000000060E6   -4.51387968956751350E-1
5.92162500000000060E6   -4.59361196203085690E-1
6.54625000000000060E6   -4.66558553131420340E-1
7.17087499999999970E6   -4.44614963756639090E-1
7.79549999999999970E6   -4.57214959955166740E-1
8.42012500000000050E6   -4.54436434169834770E-1
}\datat

\pgfplotstablecreatecol[
  copy column from table={\datas}{[index] 0},
  ]{f1}{\datat}
\pgfplotstablecreatecol[
  copy column from table={\datas}{[index] 1},
  ]{s21}{\datat}
\begin{document}    
\begin{tikzpicture}
    \begin{axis}[
    no markers,%
    ]
       \addplot+[thin] table[x=f1,y=s21] {\datat};  
       \addplot+[thin] table[x=f2,y=s12] {\datat};  
    \end{axis}
    \end{tikzpicture} 

\begin{tikzpicture}
    \begin{axis}[
    no markers,%
    ]
       \addplot+[thin] table[x=f1,y expr={abs(\thisrow{s21}/\thisrow{s12}-1)*100}] {\datat};  
    \end{axis}
    \end{tikzpicture} 
\end{document}
Torbjørn T.
  • 206,688
  • Thank you, alas I cannot convert your solution to being file- (instead of table-)based – pogo-otter Aug 23 '16 at 08:58
  • @pogo-otter You can't read the files into tables first? – Torbjørn T. Aug 23 '16 at 09:01
  • I tried \pgfplotstableread[col sep=space]{100/dB_IC_10mA_S12.txt}{\datas} \pgfplotstableread[col sep=space]{100/dB_IC_10mA_S21.txt}{\datat} \pgfplotstablecreatecol[copy column from table={\datas}{[index] 0},]{f1}{\datax} \pgfplotstablecreatecol[copy column from table={\datas}{[index] 1}, ]{s21}{\datax} \pgfplotstablecreatecol[copy column from table={\datas}{[index] 1},]{s12}{\datax} and adressing it as \datax in the remaining code and was expecting a matrix of "datax"= f1 s21 s12

    edit: should i edit this facette of the problem into the main question?

    – pogo-otter Aug 23 '16 at 09:05
  • 1
    @pogo-otter \pgfplotstablecreatecol creates a new column in an already existing table, in your snippet \datax doesn't exist, so you should get an error (unless you've made the \datax table elsewhere). Note in my code I make new columns in the already existing \datat. – Torbjørn T. Aug 23 '16 at 09:09
  • Yes, thanks! I had misunderstood that and was able to fix it. :) However, - for others who might encounter the problem (or maybe you can tell me how to tweak it) - the code requires the files to have the same header names for the columns as in the initially introduced table. (just two columns without header need to be done in a different way, apperantly) – pogo-otter Aug 23 '16 at 09:16