理想代码

理想代码

切中要点...全球化共享格式(跨实例)和本地化数据(每个实例独有)

理想代码

\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}

目标

我的自定义环境horizo​​ntalbarchart 创建了一个漂亮的水平条形图。

  • 每个实例的宽度设置为.7\textwidth
  • n东西的个数。
  • 数据中的每个数字代表一个百分比。
  • 轴属性的全局 TikZ 样式
  • 条形标签(对于水平条形图,这意味着 y 刻度)是根据每个环境实例中的数据动态设置的。
  • 待办事项:可以根据百分比更改条形的颜色

答案1

我使用 的功能fancyvrb创建了一个新环境,将逐字环境内容写入文件(我认为您需要保留换行符,因为 pgfplotstableread 需要^^M,所以简单的标记列表不起作用)。在环境的末尾,我用 读取导出的文件,并用 ++对其\pgfplotsreadtable进行排版。tikzpictureaxisaddplot

我不确定这是否是最好的方法,因为我可能忽略了一种不需要辅助文件的方法。

代码

\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}

相关内容