2

I want your help in drawing the following figure. I think it is called as stacked bar graph. enter image description here

1
  • 7
    Search the pgfplots documentation for "ybar stacked". – erik Apr 12 '13 at 5:50
7

This type of graph is easy to produce with the pgfplots package. See below for an example. For more details on ybar stacked graphs, see p77 of the pgfplots manual.

You should also consider transforming your ybar stacked graph into an xbar stacked graph (see p78 of the pgfplots manual); those tend to be easier to parse.

EDIT: I have shamelessly adapted Jake's very detailed answer to Center nodes near coords in a stacked ybar plot to add values in the bars:

enter image description here

\documentclass{article}

\usepackage{pgfplots}

\pgfplotstableread{
1   15  12  03  24  16  19
2   15  12  03  24  16  19
3   15  12  03  24  16  19
4   15  12  03  24  16  19
5   15  12  03  24  16  19
6   15  12  03  24  16  19  
}\datatable

\makeatletter
\pgfplotsset{
    calculate offset/.code={
        \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
        \pgfmathsetmacro\testmacro{%
            (\pgfplotspointmeta*10^\pgfplots@data@scale@trafo@EXPONENT@y)%
            /2*\pgfplots@y@veclength)%
        }
        \pgfkeys{/pgf/fpu=false}
        },
    nodes near coords vertically centered/.style={
        every node near coord/.append style={
            /pgfplots/calculate offset,
            yshift=-\testmacro
        },
        nodes near coords align=center
    }
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    ybar stacked,%
    bar width=15pt,%
    legend style={%
        at={(0,0)},%
        anchor=west,%
        at={(axis description cs:1.05,+0.5)}},%
    reverse legend,%
    xtick={1,2,...,6},%
    xticklabels={1,2,3,4,5,6},%
    enlarge x limits=0.1,%
    enlarge y limits=false,%
    ymin=0,%
    ymax=100.01,%
    ytick={0,10,...,100},%
    yticklabels={0\%,10\%,20\%,30\%,40\%,50\%,60\%,70\%,80\%,90\%,100\%},%
    xlabel={\textbf{Company}},%
    ylabel={\textbf{\% Distribution of efforts}},%
    point meta=explicit,
    nodes near coords={\pgfmathprintnumber[fixed zerofill,precision=1]{\pgfplotspointmeta}
    },
    every node near coord/.style={%
        check for zero/.code={ %
            \pgfmathfloatifflags{\pgfplotspointmeta}{0}{%
                \pgfkeys{/tikz/coordinate}%
            }{}%
        },%
        check for zero,%
        fill=white,%
        fill opacity=0.75,%
        text opacity=1,%
        font=\scriptsize,%
        inner ysep=0.5pt,%
    },%
    nodes near coords vertically centered,%
]
\addplot table [y=1, meta=1] \datatable;
\addlegendentry{A}
\addplot table [y=2, meta=2] \datatable;
\addlegendentry{B}
\addplot table [y=3, meta=3] \datatable;
\addlegendentry{C}
\addplot table [y=4, meta=4] \datatable;
\addlegendentry{D}
\addplot table [y=5, meta=5] \datatable;
\addlegendentry{E}
\addplot table [y=6, meta=6] \datatable;
\addlegendentry{F}
\end{axis}
\end{tikzpicture}
\end{document}
1
  • Thanks Jubobs.. Is there a way to also write in the values in the bars as given in the picture? – Divya Apr 12 '13 at 10:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.