
Я новичок вpgfplotstable
, я пытаюсь читатьgnuplotэкспортированная таблица в формате pgfplotstable
.
Скрипт gnuplot:
set samples 91
set table "file.dat"
set angles degrees
plot [0:90] sin(x),cos(x),tan(x);
unset table
Ниже приведена таблица gnuplot file.dat
(краткость оценивается в 5 баллов):
# 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
Примечание: можно прочитать заголовок и формат таблицы (все данные расположены в столбцах), приведенные ниже, в сравнении с приведенным выше случаем (все данные расположены последовательно).
# A B C
1 2 3
4 5 7
8 9 10
Вопрос
Можно ли прочитать файл пользовательского формата ASCII в , pgfplotstable
или \pgfplotstableset{}
есть ли какие-либо другие обходные пути в gnuplot, чтобы сделать его хорошо читаемым и набранным в pgfplotstable
?
решение1
Сначала я думал, что вы хотите построить график данных, но, прочитав ваш вопрос еще раз, я понял, что вы просто хотите представить их в виде таблицы, используя... pgfplotstable
Вы можете сделать что-то вроде этого, хотя я не уверен, pgfplotstable
что это действительно поможет в данном случае. К тому времени, как вы переорганизуете данные для чтения, \pgfplotstabletypeset
вы сможете просто записать их в виде longtable
...
[обновление для нецелочисленного первого столбца]
\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}
решение2
Хотя это и не очень хороший ответ TeX низкого уровня, как выше, на удивление ранее его упускали из виду, а сегодня я обнаружил, что использование опций pgfplotstableignore chars={\i}
прочитать полную gnuplot
таблицу file.dat
в двух столбцах иselect equal part entry of
переставить два столбца в равные строки по 3 столбца. Но не удалось найти опции pgfplotstable для автоматического чтения нескольких заголовков ("sin(x)", "cos(x)" и "tan(x)").
\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}