pgfplots:使用 \pgfplotsinvokeforeach 时无法影响循环列表名称

pgfplots:使用 \pgfplotsinvokeforeach 时无法影响循环列表名称

我无法使用 中的自定义颜色 cycle list namepgfplotsinvokeforeach一些指针可以从帖子讨论了绘图函数中各个步骤的执行。

在下面的 MWE 中,我尝试将条形图分成两类,其中数值大于中位数,其他则小于中位数。

我使用x值范围作为值的pgfplotsinvokeforeach输入 restrict x to domain#1

来自 pgfplots 手册第 88 页第 4.6.6 节

/pgfplots/cycle list name={<macro>}

...如果您写入...,则将使用当前活动的循环列表 \addplot+[<keys>];或者如果您使用方括号,如 >\addplot[<explicit plot specication>]

cycle list name功能无法运行可能是因为我restrict x to domain明确指定了运行参数\addplot

代码:

\listfiles
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{xcolor}

\pgfplotsset{xticklabel={\tick},scaled x ticks=false}
\pgfplotsset{plot coordinates/math parser=false}


\definecolor{darkblue}{RGB}{0,34,68}
\definecolor{ochre}{RGB}{255,161,0}

\pgfplotscreateplotcyclelist{customcol}{%
{fill=darkblue, draw=black},
{fill=ochre, draw=black}
}



\begin{document}
\begin{center}
\pgfplotstableread[col sep=comma,header=true]{
number,label
0.031,A
0.038,B
0.043,C
0.046,D
0.056,E
0.063,F
}\data

\begin{tikzpicture}
\begin{axis}
    [
      cycle list name=customcol,
      width=5in,
      symbolic y  coords={A,B,C,D,E,F},
      tick label style={font=\footnotesize},
      label style={font=\footnotesize},
      axis x line*=bottom,
      axis y line*=left,
      yticklabel style={text width=3cm, align=right,inner sep=0pt, outer sep=0pt},
      xbar=5pt,
      bar width=4pt,
      point meta=x*100,
      xlabel=number,
      ylabel=label,
      y tick label style={text width=0.5cm,align=center},
      xticklabel=\pgfmathparse{100*\tick}\pgfmathprintnumber{\pgfmathresult}\,\%,
      xticklabel style={/pgf/number format/.cd,fixed,precision=2},
      nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=1]{\pgfplotspointmeta}$\%$},
      every node near coord/.append style={
                font=\footnotesize,
                /pgf/number format/precision=3,
                anchor=180
                }
    ]
\pgfplotsinvokeforeach{0:0.041,0.041:0.0693}{
    \addplot +[restrict x to domain=#1] table {\data};
    }
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}

可能的解决方案

下面的语法不是 100% 正确的,但可以说明思考过程:

有没有办法创建一个列表,例如{[partition1,color1],[partition2,color2]} 输入到哪个列表\pgfplotsinvokeforeach并将#1其解析为

\addplot [color1] +[restrict x to domain=[partition1] table {\data};

输出:

条形图

附录

1)节点标签的颜色与单个条的颜色相同,如果使用某些颜色,则可能无法读取。有没有办法强制所有节点标签使用统一的颜色,比如黑色。

2) y 轴刻度标签对齐有点偏离,对于第 1 类,刻度标签以下对于第 2 类,条形图和刻度标签为多于酒吧

多谢!

答案1

这里有几个问题:cycle list name是解决这个问题的正确方法,只要你使用,循环列表就会被尊重\addplot +[...]。然而,你需要使用cycle list name ybar,因为ybar设置了自己的列表。

此外,您需要确保将 放在%循环列表的最后一个条目之后,或者将结束符}直接放在其后面(而不是放在新行上)。

欲获得黑色标签,请添加blackevery node near coord样式中。

要将条形图与刻度标记对齐,请设置ybar=0pt, bar shift=0pt

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{xcolor}

\pgfplotsset{xticklabel={\tick},scaled x ticks=false}
\pgfplotsset{plot coordinates/math parser=false}


\definecolor{darkblue}{RGB}{0,34,68}
\definecolor{ochre}{RGB}{255,161,0}

\pgfplotscreateplotcyclelist{customcol}{%
{fill=darkblue, color=red, draw=black},
{fill=ochre, draw=black}%
}



\begin{document}
\begin{center}
\pgfplotstableread[col sep=comma,header=true]{
number,label
0.031,A
0.038,B
0.043,C
0.046,D
0.056,E
0.063,F
}\data

\begin{tikzpicture}
\begin{axis}
    [
      width=5in,
      symbolic y  coords={A,B,C,D,E,F},
      tick label style={font=\footnotesize},
      label style={font=\footnotesize},
      axis x line*=bottom,
      axis y line*=left,
      yticklabel style={text width=3cm, align=right,inner sep=0pt, outer sep=0pt},
      xbar=0pt,
      bar shift=0pt,
      bar width=4pt,
      point meta=x*100,
      xlabel=number,
      ylabel=label,
      y tick label style={text width=0.5cm,align=center},
      xticklabel=\pgfmathparse{100*\tick}\pgfmathprintnumber{\pgfmathresult}\,\%,
      xticklabel style={/pgf/number format/.cd,fixed,precision=2},
      nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=1]{\pgfplotspointmeta}$\%$},
      every node near coord/.append style={
                black,
                font=\footnotesize,
                /pgf/number format/precision=3,
                anchor=180
                },
      cycle list name=customcol
    ]
\pgfplotsinvokeforeach{0:0.041,0.041:0.0693}{
    \addplot +[restrict x to domain=#1] table {\data};
    }
\end{axis}
\end{tikzpicture}
\end{center}
\end{document}

相关内容