我有一个文件,其中包含诸如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 手册中)。