pgfplotstable: von gnuplot generierte Tabelle lesen und setzen

pgfplotstable: von gnuplot generierte Tabelle lesen und setzen

Ich bin neu beipgfplotstable, ich versuche zu lesengnuplotexportierte Tabelle in pgfplotstable.

Gnuplot-Skript:

set samples 91
set table "file.dat"
set angles degrees
plot [0:90] sin(x),cos(x),tan(x);
unset table

Die Gnuplot-Tabelle file.datist unten aufgeführt (der Kürze halber wurden 5 Punkte vergeben):

# Curve 0 of 3, 91 points
# Curve title: "sin(x)"
# x y type
 0  0  i
 1  0.0174524  i
 2  0.0348995  i
 3  0.052336  i
 4  0.0697565  i
 5  0.0871557  i

# Curve 1 of 3, 91 points
# Curve title: "cos(x)"
# x y type
 0  1  i
 1  0.999848  i
 2  0.999391  i
 3  0.99863  i
 4  0.997564  i
 5  0.996195  i

# Curve 2 of 3, 91 points
# Curve title: "tan(x)"
# x y type
 0  0  i
 1  0.0174551  i
 2  0.0349208  i
 3  0.0524078  i
 4  0.0699268  i
 5  0.0874887  i

Hinweis: Es ist möglich, die Tabellenüberschrift und das Tabellenformat (alle Daten in Spalten angeordnet) im Vergleich zum obigen Fall (alle Daten sequenziell angeordnet) zu lesen.

# A B C 
  1 2 3 
  4 5 7
  8 9 10

Frage

pgfplotstableIst es möglich, ASCII-Dateien im benutzerdefinierten Format in Gnuplot zu lesen, \pgfplotstableset{}oder gibt es andere Workarounds, um ein gutes Lesen und Setzen zu ermöglichen pgfplotstable?

Antwort1

Zuerst dachte ich, Sie wollten die Daten grafisch darstellen, aber wenn ich Ihre Frage nochmal lese, scheint es, Sie möchten sie einfach als Tabelle festlegen. pgfplotstableSie können so etwas tun, obwohl ich nicht sicher bin, pgfplotstableob es in diesem Fall wirklich hilft. Nachdem Sie die Daten zum Lesen neu angeordnet haben, \pgfplotstabletypesetkönnten Sie sie einfach als eins schreiben longtable, aber ...

Bildbeschreibung hier eingeben

[Update für nicht ganzzahlige erste Spalte]

\documentclass{article}
\usepackage{pgfplotstable,longtable,array}

\begin{document}
\makeatletter

\def\loopb#1\repeatb{\def\iterateb{#1\relax\expandafter\iterateb\fi}%
  \iterateb \let\iterateb\relax}
\let\repeatb\fi

\begingroup

\count@\z@
\catcode`\#12
\catcode`\*=6

\def\tstrelax{\relax}
\def\tsti{i}

\def\ca*1# Curve*2 of *3,*4 points*5!!{%
  \def\cnum{*2}\def\ctot{*3}\def\cpoints{*4}}

\def\cb*1# Curve title: "*2"*3!!{%
  \def\title{*2}}

\def\cc*1 *2 *3 *4!!{%
\def\x{*1}\def\y{*2}\def\ci{*3}}

\newread\myin
\openin\myin=file.dat

\@tempcnta\z@

\loop
\ifeof\myin\else
\read\myin to \tmp
\expandafter\ifx\expandafter\par\tmp
\else
  \expandafter\cb\tmp# Curve title: "\relax"!!%
  \ifx\title\tstrelax
    \expandafter\ca\tmp# Curve of \relax, points!!%
    \ifx\ctot\tstrelax
      \expandafter\cc\tmp. . . !!%
      \ifx\ci\tsti
        \expandafter\edef\csname my-\the\@tempcnta-\the\@tempcntb\endcsname{\ifnum\@tempcnta=1 \x\space\fi\y}
        \advance\@tempcntb\@ne
 \fi
    \else
      \let\total\ctot
      \let\points\cpoints
      \advance\@tempcnta\@ne
      \@tempcntb\z@
    \fi
  \else
    \expandafter\let\csname my-\the\@tempcnta-title\endcsname\title
  \fi
\fi
\repeat

{\let\\\relax

\gdef\mytable{}
\gdef\row{x}
\@tempcnta\z@
\loop
\advance\@tempcnta\@ne
\xdef\row{\row\space \csname my-\the\@tempcnta-title\endcsname}
\ifnum\@tempcnta<\total
\repeat
\xdef\mytable{\row\space\\\space}

\@tempcntb\z@
\loopb
\xdef\row{}
\@tempcnta\z@
\loop
\advance\@tempcnta\@ne
\xdef\row{\row\space \csname my-\the\@tempcnta-\the\@tempcntb\endcsname}
\ifnum\@tempcnta<\total
\repeat
\xdef\mytable{\mytable\row\space\\\space}
\advance\@tempcntb\@ne
\ifnum\@tempcntb<\points
\repeatb

\show\mytable
\xdef\tmp{\noexpand\pgfplotstabletypeset[row sep=\noexpand\\, begin table=\noexpand\begin{longtable}, 
end table=\noexpand\end{longtable}
sci,precision=5]{\mytable}}
}



\endgroup

\tmp

\end{document}

Antwort2

Obwohl es sich nicht um eine großartige TeX-Antwort auf niedriger Ebene wie oben handelt, wurde sie überraschenderweise zuvor übersehen und heute festgestellt, dass die Verwendung von pgfplotstable-Optionenignore chars={\i}gnuplotum die ganze Tabelle file.datin zwei Spalten zu lesen undselect equal part entry ofum zwei Spalten in gleich große Zeilen mit je drei Spalten umzuordnen. Es konnten jedoch keine pgfplotstable-Optionen zum automatischen Lesen mehrerer Header („sin(x)“, „cos(x)“ und „tan(x)“) gefunden werden.

Bildbeschreibung hier eingeben

\documentclass[12pt]{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usepackage{booktabs}
\usepackage{colortbl}
\usepackage{longtable}
\pgfplotstableset{begin table=\begin{longtable},end table=\end{longtable},%
every head row/.style={before row=\toprule,after row=\midrule},%
every last row/.style={after row=\bottomrule},%
every even row/.style={before row={\rowcolor[gray]{.8}}}%
}
\begin{document}
\pgfplotstabletypeset[columns={0,1,1,1},%
display columns/0/.style={select equal part entry of={0}{3},column name=$x$},%
display columns/1/.style={select equal part entry of={0}{3},column name=$sin(x)$},%
display columns/2/.style={select equal part entry of={1}{3},column name=$cos(x)$},%
display columns/3/.style={select equal part entry of={2}{3},column name=$tan(x)$},%
precision=5,ignore chars={\i}]{file.dat}
\end{document}

verwandte Informationen