我无法使用 中的自定义颜色 cycle list name
。pgfplotsinvokeforeach
一些指针可以从这帖子讨论了绘图函数中各个步骤的执行。
在下面的 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
设置了自己的列表。
此外,您需要确保将 放在%
循环列表的最后一个条目之后,或者将结束符}
直接放在其后面(而不是放在新行上)。
欲获得黑色标签,请添加black
到every 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}