pgfplot llena un contenedor con color

pgfplot llena un contenedor con color

Estoy usando pgfplot para dibujar un gráfico de barras. Puede rellenar el color para un gráfico completo, pero solo deseo llenar un contenedor con color rojo. por ejemplo, llene el contenedor 3 con rojo.

El código actual llena todos los contenedores con color rojo como se muestra a continuación:

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

La salida es:

ingrese la descripción de la imagen aquí

Tres preguntas:

  1. ¿Cómo llenar solo el contenedor 3 con color rojo?
  2. Cómo configurar el eje y para que comience desde 0 (ahora es 5).
  3. El último contenedor debería ser 7, pero parece que no lo trazó.

Respuesta1

Aquí hay otra sugerencia usando ybaren su lugarybar interval

ingrese la descripción de la imagen aquí

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

Tenga en cuenta que si utiliza la opción, scale only axisdebe eliminarla -45ptdel bar widthcálculo.

También es posible cambiar el xtickyxticklabel

ingrese la descripción de la imagen aquí

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

Respuesta2

Aquí hay una solución usando discard ify discard if not, dado que no puedes colorear cada columna apropiadamente, por así decirlo, debes filtrarlas usando las macros anteriores.

El espacio que ve antes y después de las columnas lo proporciona enlarge x limits={abs=0.5}, simplemente borre o comente esta línea para eliminarla, aunque sugiero conservarlo por motivos estéticos.

Los contenidos reciben un número de valor del 1 al 8, llamado Val, y el valor en sí se llama Num en este caso. Entonces dibujas el red!5y descartas el rojo usando discard if={Val}{3}, luego dibujas el rojo y descartas el resto, usando discard if not={Val}{3}. Este comando está definido en el preámbulo.

Por cierto, la última columna es 8, según el contenido de su test.datarchivo.

Una última cosa x expr=\coordindexse ha comentado al definir las red!5columnas porque si no, se obtienen resultados no deseados (sinceramente, no estoy seguro de por qué, no pude identificar el problema). Yo también lo quité ybar intervaly me fui ybar.

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

Respuesta3

No es un buen código pero funciona.

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

ingrese la descripción de la imagen aquí

información relacionada