pgfplot 하나의 빈을 색상으로 채우기

pgfplot 하나의 빈을 색상으로 채우기

나는 pgfplot을 사용하여 ybar 그래프를 그립니다. 전체 그래픽의 색상을 채울 수 있지만 하나의 저장소만 빨간색으로 채우고 싶습니다. 예를 들어 빈 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를 제거해야 합니다 .-45ptbar 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}. 미학적 목적으로 유지하는 것이 좋지만 이 줄을 삭제하거나 주석 처리하여 제거하면 됩니다.

내용에는 Val이라고 하는 1부터 8까지의 값 번호가 부여되며, 이 경우 값 자체는 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}

여기에 이미지 설명을 입력하세요

관련 정보