Я использую pgfplot для рисования гистограммы. Он может заполнять цветом всю графику, но я хочу заполнить только один бин красным цветом. Например, заполнить бин 3 красным цветом.
Текущий код заполняет все ячейки красным цветом, как показано ниже:
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=left,
ymajorgrids = true,
%xticklabel interval boundaries,
x tick label style={rotate=30,anchor=east}
]]
\addplot[black,fill=red!5,ybar interval] table[x expr=\coordindex,y index=0] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Выходные данные:
Три вопроса:
- Как заполнить ячейку 3 только красным цветом?
- Как настроить ось Y так, чтобы она начиналась с 0 (сейчас это 5).
- Последняя ячейка должна быть 7, но, похоже, она не нанесена на график.
решение1
Вот еще одно предложение, использующее ybar
вместо этогоybar interval
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\newcommand\coordindexmax{7}% the maximum of the coordindex
\begin{axis}[
axis y line=left,
axis x line*=left,
ymajorgrids = true,
ymin=0,
x tick label style={rotate=30,anchor=east},
xtick={0,...,\coordindexmax},
ybar,
bar shift=0pt,
bar width=(\pgfkeysvalueof{/pgfplots/width}-45pt)/(\coordindexmax+1),
enlarge x limits={abs=\pgfkeysvalueof{/pgf/bar width}/2}
]
\addplot[black,fill=red!5] table[x expr=\coordindex,y index=0] {test.dat};
\addplot[black,fill=red] table[x expr=\coordindex,y index=0,
restrict expr to domain={\coordindex}{3:3}
] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
Обратите внимание: если вы используете эту опцию, scale only axis
вам придется удалить -45pt
из bar width
расчета.
Также возможно сместить xtick
иxticklabel
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\newcommand\coordindexmax{7}% the maximal coordindex
\begin{axis}[
axis y line=left,
axis x line*=left,
ymajorgrids = true,
ymin=0,
xtick style={xshift=-\pgfkeysvalueof{/pgf/bar width}/2},% shift the xtick
x tick label style={
xshift=-\pgfkeysvalueof{/pgf/bar width}/2, % shift the x xticklabel
rotate=30,anchor=east,
},
xtick={0,...,\coordindexmax},
ybar,
bar shift=0pt,
bar width=(\pgfkeysvalueof{/pgfplots/width}-45pt)/(\coordindexmax+1),
enlarge x limits={abs=\pgfkeysvalueof{/pgf/bar width}/2}
]
\addplot[black,fill=red!5] table[x expr=\coordindex,y index=0] {test.dat};
\addplot[black,fill=red] table[x expr=\coordindex,y index=0,
restrict expr to domain={\coordindex}{3:3}
] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
решение2
Вот решение с использованием discard if
и discard if not
, поскольку вы не можете раскрасить каждый столбец соответствующим образом, так сказать, вам нужно отфильтровать их с помощью макросов выше.
Пространство, которое вы видите перед и после столбцов, предоставлено enlarge x limits={abs=0.5}
, просто удалите или закомментируйте эту строку, чтобы убрать его, хотя я предлагаю сохранить ее в эстетических целях.
Содержимому присваивается номер значения от 1 до 8, называемый Val, а само значение в данном случае называется Num. Таким образом, вы рисуете red!5
и отбрасываете красный с помощью discard if={Val}{3}
, затем рисуете красный и отбрасываете остальное с помощью discard if not={Val}{3}
. Эта команда определена в преамбуле.
Кстати, последний столбец — 8, согласно содержимому вашего test.dat
файла.
Последнее, x expr=\coordindex
что было закомментировано при определении red!5
столбцов, потому что если этого не сделать, то это даст нежелательные результаты (честно говоря, я не уверен, почему, я не смог точно определить проблему). Я также удалил ybar interval
и оставил ybar
.
\documentclass[border=10pt]{standalone}
\usepackage{filecontents}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{
discard if/.style 2 args={
x filter/.code={
\ifdim\thisrow{#1} pt=#2pt
\def\pgfmathresult{inf}
\fi
}
},
discard if not/.style 2 args={
x filter/.code={
\ifdim\thisrow{#1} pt=#2pt
\else
\def\pgfmathresult{inf}
\fi
}
}
}
\pgfplotsset{compat=1.8}
\begin{document}
\begingroup\newif\ifmy
\IfFileExists{test.dat}{}{\mytrue}
\ifmy
\begin{filecontents}{test.dat}
#Val Num
1 15
2 20
3 22
4 10
5 5
6 15
7 33
8 27
\end{filecontents}
\fi\endgroup
\begin{tikzpicture}
\begin{axis}[ybar=0pt,
axis lines=left,
ymajorgrids = true,
bar width=1,
x tick label style={rotate=30,anchor=east},
xtick={1,...,8},
ytick={0,5,10,...,30},
xmin=0,
xmax=8,
ymin=0,
ymax=35,
enlarge x limits={abs=0.5}
]
\addplot[ draw,
fill=red!5,
discard if={Val}{3},
ybar
]
table[
%x expr=\coordindex,
y index=0,
x=Val,
y=Num,
meta=Num
] {test.dat};
\addplot[ draw,
fill=red,
discard if not={Val}{3},
ybar
]
table[
x expr=\coordindex,
y index=0,
x=Val,
y=Num,
meta=Num
] {test.dat};
\end{axis}
\end{tikzpicture}
\end{document}
решение3
Это не очень хороший код, но он работает.
\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{tikz}
\usepackage{filecontents}
\begin{filecontents}{test.dat}
15
20
22
10
5
15
33
27
27 % dummy
\end{filecontents}
\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=left,
ymajorgrids = true,
xmin=0, xmax=8.5,
ymin=0, ymax=40,
xtick={1,2,3,4,5,6,7,8},
ytick={0,5,10,15,20,25,30,35},
x tick label style={rotate=30,anchor=east}
]]
\addplot[black,fill=red!5,ybar interval] table[x expr=\coordindex,y index=0] {test.dat};
\addplot[fill=red] coordinates
{(2,0) (2,23) (3,23) (3,0)} --cycle;
\end{axis}
\end{tikzpicture}
\end{document}