切中要点...全球化共享格式(跨实例)和本地化数据(每个实例独有)
理想代码
\begin{horizontalbarchart}
17,Sales
24,Marketing
31,Finance
42,Operations
\end{horizontalbarchart}
我的尝试
使用 xparse 和 的组合newenviron
。请注意,我仅使用\pgfplotstableread
以避免使用symbolic y coords
,因为使用symbloc y coords
意味着重复已在绘图数据中指定的数据。
\documentclass{article}
\usepackage{fontspec}%xelatex
\usepackage{pgfplots,pgfplotstable}
\usepackage{newenviron}
\usepackage{xparse}
\pgfplotsset{horizontalbarchartpgfplotstableread/.style={
% symbolic y coords=,% set dict of expected textual y coordinates
axis lines*=left,
y=1cm,% vertical spacing (define the length of a unit in the y direction )
xbar,
bar width=5mm,% bar thickness
y axis line style = { opacity = 0 },
width=.7\textwidth,
xmajorgrids,
xminorgrids,
xlabel={}, % optional label below x axis but useless in global style
xmin=0,
xmax=100,
point meta={x},
nodes near coords={\pgfmathprintnumber\pgfplotspointmeta\%},% puts text (set in "point meta" key) near coordinates.
nodes near coords align={horizontal},% alignment of "nodes near coords"
color=orange,
enlarge y limits={abs=10mm},% add space above and below bars
yticklabels from table={\datatable}{1}, % necessary for pgfplotstableread data
ytick=data,%
}
}
\NewEnviron{horizontalbarchartBODY}
{%
% Inject BODY into pgfplotstableread
\pgfplotstableread[col sep=comma, header=false]{
\BODY
\datatable
% Use \datatable for plot data
\begin{tikzpicture}
\begin{axis}[horizontalbarchartpgfplotstableread]
\addplot table [col sep=comma, y expr=\coordindex, x=0] {\datatable};
\end{axis}
\end{tikzpicture}
}
\NewDocumentEnvironment{horizontalbarchart}{}{\horizontalbarchartBODY\endhorizontalbarchartBODY}{}
\begin{document}
% Insert Easy Bar Chart Environment here.
\end{document}
目标
我的自定义环境horizontalbarchart 创建了一个漂亮的水平条形图。
- 每个实例的宽度设置为
.7\textwidth
。 n
东西的个数。- 数据中的每个数字代表一个百分比。
- 轴属性的全局 TikZ 样式
- 条形标签(对于水平条形图,这意味着 y 刻度)是根据每个环境实例中的数据动态设置的。
- 待办事项:可以根据百分比更改条形的颜色
答案1
我使用 的功能fancyvrb
创建了一个新环境,将逐字环境内容写入文件(我认为您需要保留换行符,因为 pgfplotstableread 需要^^M
,所以简单的标记列表不起作用)。在环境的末尾,我用 读取导出的文件,并用 ++对其\pgfplotsreadtable
进行排版。tikzpicture
axis
addplot
我不确定这是否是最好的方法,因为我可能忽略了一种不需要辅助文件的方法。
代码
\documentclass{article}
\usepackage{fontspec}
\usepackage{pgfplots,pgfplotstable}
\usepackage{fancyvrb}
\pgfplotsset{horizontalbarchartpgfplotstableread/.style={
% symbolic y coords=,% set dict of expected textual y coordinates
axis lines*=left,
y=1cm,% vertical spacing (define the length of a unit in the y direction )
xbar,
bar width=5mm,% bar thickness
y axis line style = { opacity = 0 },
width=.7\textwidth,
xmajorgrids,
xminorgrids,
xlabel={}, % optional label below x axis but useless in global style
xmin=0,
xmax=100,
point meta={x},
nodes near coords={\pgfmathprintnumber\pgfplotspointmeta\%},% puts text (set in "point meta" key) near coordinates.
nodes near coords align={horizontal},% alignment of "nodes near coords"
color=orange,
enlarge y limits={abs=10mm},% add space above and below bars
yticklabels from table={\datatable}{1}, % necessary for pgfplotstableread data
ytick=data,%
}
}
\newenvironment{horizontalbarchart}
{\VerbatimOut{\jobname-barchart.export}}
{\endVerbatimOut
% Inject BODY into pgfplotstableread
\pgfplotstableread[col sep=comma, header=false]{\jobname-barchart.export}{\datatable}
% Use \datatable for plot data
\begin{tikzpicture}
\begin{axis}[horizontalbarchartpgfplotstableread]
\addplot table [col sep=comma, y expr=\coordindex, x=0] {\datatable};
\end{axis}
\end{tikzpicture}
}%
\begin{document}
\begin{horizontalbarchart}
17,Sales
24,Marketing
31,Finance
42,Operations
\end{horizontalbarchart}
\end{document}