Pgfplots - 如何处理数据文件中的特殊字符?

Pgfplots - 如何处理数据文件中的特殊字符?

我有一个文件,其中包含诸如AAA-BBB或类似的列标题CC_DD_8734-20°

如果我只想使用这样的文件,我该如何处理?

或者我应该为每组数据准备x-y列?(这会非常麻烦,但绝对有效)

平均能量损失

\documentclass[
a4paper
]{scrartcl}

\usepackage{
    lmodern,
    tikz,
    pgfplots,
    pgfplotstable
    }
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\begin{filecontents}{data.csv}
AA-BB;Min;Max
CC_DD-01;-28.035191;19.114903
CC_DD-02°;-26.760864;22.937884
CC_DD-03°;-29.309518;16.566249
CC_DD-04;-28.035191;20.38923
CC_DD-05;-26.760864;19.114903
CC_DD-06;-25.486538;16.566249
\end{filecontents}

\pgfplotstableread[col sep=semicolon]{data.csv}{\tableabcdef}

\begin{document}
Test.
\begin{center}
\centering
\begin{tikzpicture}
\begin{axis}[
xbar,
xlabel={Values},
ylabel={Subject},
xmin=-4,
ytick=data,
nodes near coords, nodes near coords align={horizontal},
yticklabels from table={\tableabcdef}{AA-BB},
]
\foreach \i in {Min,Max}{
\addplot table [meta=AA-BB, y expr=\coordindex, x=\i] {\tableabcdef};}
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}

答案1

有点笨拙,但确实管用。filecontents环境应该在加载之前inputenc

\begin{filecontents}{\jobname.csv}
AA-BB;Min;Max
CC_DD-01;-28.035191;19.114903
CC_DD-02°;-26.760864;22.937884
CC_DD-03°;-29.309518;16.566249
CC_DD-04;-28.035191;20.38923
CC_DD-05;-26.760864;19.114903
CC_DD-06;-25.486538;16.566249
\end{filecontents}

\documentclass[
a4paper
]{scrartcl}

\usepackage{
    lmodern,
    tikz,
    pgfplots,
    pgfplotstable
    }
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

% for the ° character
\usepackage{newunicodechar}
\newunicodechar{°}{\ensuremath{^\circ}}

% make the underscore into a printable symbol,
% but first remember its meaning
\edef\rememberuscatcode{%
  \catcode`_=\the\catcode`_ 
  \let\noexpand\rememberuscatcode\relax
}
\catcode`_=12

\pgfplotstableread[col sep=semicolon]{\jobname.csv}{\tableabcdef}

% revert the underscore to its former meaning
\rememberuscatcode

\begin{document}
Test.

\begin{center}
\centering
\begin{tikzpicture}
\begin{axis}[
xbar,
xlabel={Values},
ylabel={Subject},
xmin=-4,
ytick=data,
nodes near coords, nodes near coords align={horizontal},
yticklabels from table={\tableabcdef}{AA-BB},
]
\foreach \i in {Min,Max}{
\addplot table [meta=AA-BB, y expr=\coordindex, x=\i] {\tableabcdef};}
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}

在此处输入图片描述

注意:我使用这个\jobname是为了不破坏我的文件。使用你喜欢的任何名称。

答案2

您的问题与如何在 pgfplotstable 中使用下划线?因为您有一些纯字符串作为输入,并且您想要“按原样但进行一些数学模式调整”自动排版该字符串。

链接问题的解决方案是对纯文本字符串应用搜索和替换,以便可以通过 TeX 排版。这里也可以使用相同的方法:

\documentclass{standalone}

\usepackage{
    pgfplots,
    pgfplotstable
    }

\pgfplotsset{compat=1.5}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\pgfplotstableread[col sep=semicolon]{data.csv}{\tableabcdef}

\begin{document}
\begin{tikzpicture}
\begin{axis}[
xbar,
xlabel={Values},
ylabel={Subject},
xmin=-4,
ytick=data,
nodes near coords, nodes near coords align={horizontal},
yticklabel={%
    \pgfplotstablegetelem{\ticknum}{AA-BB}\of{\tableabcdef}%
    \def\marshal{\pgfplotsutilstrreplace{_}{\_}}%
    \expandafter\marshal\expandafter{\pgfplotsretval}%
    \def\marshal{\pgfplotsutilstrreplace{°}{$^\circ$}}%
    \expandafter\marshal\expandafter{\pgfplotsretval}%
    %
    \texttt{\pgfplotsretval}%
},
enlarge x limits={upper,0.3},
]
\foreach \i in {Min,Max}{
\addplot table [meta=AA-BB, y expr=\coordindex, x=\i] {\tableabcdef};}
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

它的作用是

  • 定义yticklabel以便它接受\ticknum输入并从输入表中读取相应的行。
  • \pgfplotsretval该值将按原样存储在- 中。
  • 然后运行\pgfplotsutilstrreplace{°}{$^\circ$}{<value>},下划线也一样。这与如何在 pgfplotstable 中使用下划线?,只不过它使用扩展魔法,因为<value>在搜索和替换开始之前必须扩展一次(比较我应该从哪里开始 LaTeX 编程?了解详情)
  • 最后,它用打字机字体排版标签(希望这是您想要的——否则您可能还想用它替换减号${-}$)。

此外,我补充说

  • \pgfplotset{compat=1.5}使得 y 标签定位正确
  • 扩大限制

我的答案实际上是少用 pgfplots,多用普通的 TeX。如果有人想研究这种方法,他可能想把问题简化为不那么复杂的东西。这是一个简化的例子。

\documentclass{standalone}

\usepackage{pgfplots}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\begin{document}
\def\pgfplotsretval{CC_DD-03°}

% FAILS:
% \pgfplotsretval

        \def\marshal{\pgfplotsutilstrreplace{_}{\_}}%
        \expandafter\marshal\expandafter{\pgfplotsretval}%
        \def\marshal{\pgfplotsutilstrreplace{°}{$^\circ$}}%
        \expandafter\marshal\expandafter{\pgfplotsretval}%

\ttfamily
\pgfplotsretval
\end{document}

尽管如此,我的印象是,一旦要从数据文件中读取字符串,数据文件中的特殊字符就需要进行一些智能处理。这可能值得一些关于如何在 pgfplotstable 中“正确”执行此操作的想法。如果有人有好主意:请告诉我(可能通过电子邮件,我的地址在 pgflotstable 手册中)。

相关内容