pgfplot заполнить один контейнер цветом

pgfplot заполнить один контейнер цветом

Я использую 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}

Выходные данные:

введите описание изображения здесь

Три вопроса:

  1. Как заполнить ячейку 3 только красным цветом?
  2. Как настроить ось Y так, чтобы она начиналась с 0 (сейчас это 5).
  3. Последняя ячейка должна быть 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.

pgfplot рисунок

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

введите описание изображения здесь

Связанный контент