14

Is there a way to interrupt the bar charts in pgfplots? More specifically, I have a plots with bar charts and one chart has extremely high values, so that you can hardly see the others in a scale. This is the code:

\documentclass{article} 

\usepackage{pgfplots}    

\usepackage{booktabs}

\usepackage[autolanguage, np]{numprint}          

\begin{document} 

    \begin{figure*}
    \centering
    \begin{tikzpicture}
    \begin{axis} [
    footnotesize,
    ybar=0,
/pgf/bar width = 5\heavyrulewidth,
width=\linewidth,
height=0.36\linewidth,
symbolic x coords={avrora,batik,eclipse,fop,h2,jython,luindex,lusearch,pmd,sunflow,xalan,Geo. mean},
xtick=data, % Ticks only at symbolic x coords
x tick label style={rotate=45,anchor=north east},
ylabel={Overhead},
ymajorgrids=true,
ymin=1,
yticklabel={\nprounddigits{0}\np[x]{\tick}},
legend style={at={(0,1)}, anchor=north west, legend columns=-1},
legend plot pos=right,
error bars/y dir=both,
error bars/y explicit,
xticklabels={
    \textsf{avrora},
    \textsf{batik},
    \textsf{eclipse},
    \textsf{fop},
    \textsf{h2},
    \textsf{jython},
    \textsf{luindex},
    \textsf{lusearch},
    \textsf{pmd},
    \textsf{sunflow},
    \textsf{xalan},
    Geo. mean},
cycle list={fill=white,fill=magenta,fill=cyan},
]
\addplot coordinates
{
(avrora,86.19)+-(0,11.9602)
(batik,27.56)+-(0,0.5393)
(eclipse,148.06)+-(0,70.1225)
(fop,61.0333333333333)+-(0,1.8024)
(h2,145.046666666667)+-(0,9.6426)
(jython,257.89)+-(0,25.3882)
(luindex,72.5366666666667)+-(0,1.5383)
(lusearch,1030.43666666667)+-(0,67.5483)
(pmd,39.0033333333333)+-(0,1.4052)
(sunflow,336.05)+-(0,27.3135)    
(xalan,483.416666666667)+-(0,45.2582)
(Geo. mean,139.201682374624)
};

\addplot coordinates
{
(avrora,455.47)+-(0,46.3514)
(batik,49.52)+-(0,0.9035)
(eclipse,88.48)+-(0,7.2219)
(fop,42.21)+-(0,7.9335)
(h2,295.56)+-(0,24.2355)
(jython,268.63)+-(0,24.3776)
(luindex,245.54)+-(0,5.7191)
(lusearch,3281.2)+-(0,160.5282)
(pmd,36.53)+-(0,1.1229)
(sunflow,475.62)+-(0,12.5994)
(xalan,1315.85)+-(0,124.721219258526)
(Geo. mean,235.434550719032)
};
\end{axis}
\end{tikzpicture}
\end{figure*}

that ends up in this plot: enter image description here

The bar for lusearch is extremely high and therefore other bars become really small. I would like to interrupt the values at 1500X and continue from 2500X to 3000X just to show the top of lusearch and so that other charts would be much bigger.

I hope I was clear with the explanation.

Thanks in advance!

UPD: I've updated the example, so that you can run it. Sorry for not doing at first.

  • Welcome to TeX.sx! A complete (compilable) minimal working example (MWE) would've been nice: \begin{figure*} but no \end{figure*}, undefined \heavyrulewidth (no \usepackage{booktabs} I guess) and undefined \np… stuff. – Qrrbrbirlbel Nov 18 '12 at 0:45
  • pgfplots can do discontinuity near 0. There exists a feature request for this. Or, as Christian Feuersänger said himself: “PGFPlots only has builtin solution for discontinuity marks at the upper or lower range of an axis, not in-between.” But maybe the duplicate question can help you here: Axis break in pgfplots – Qrrbrbirlbel Nov 18 '12 at 1:08
  • I think you should present the chart with horizontal bars. That way you won't need discontinuous bars, won't need rotated labels, and the chart will be much, much clearer. – user10274 Nov 18 '12 at 7:59
8

I have only a solution with PSTricks. Run the example with xelatex. Can be extended to your special example. Needs up-to-date TeXLive or pst-plot.tex from http://texnik.dante.de/tex/generic/pst-plot/

\documentclass{article}
\usepackage{pst-plot}    
\begin{document}   
\section*{An interrupted plot}

\psset{xunit=.44cm,yunit=.3cm}
\begin{pspicture}(-2,-3)(29,32)
\psaxes[axesstyle=axes,ticksize=-4pt 0,Dy=2,Dx=2](29,15)
\rput(0,15.4){\textbf{\huge$\approx$}}
\rput(0,16){\psaxes[xAxis=false,ticksize=-4pt 0,
  Dy=2,Oy=46,Dx=2](29,15)}
\psset{interrupt={15,1,30}}
\listplot[linecolor=red,plotstyle=bar,barwidth=0.3cm,
  fillcolor=red!30,fillstyle=solid]{
0 0  1 0 2  0  3  0  4  0  5  0  6  0  7  0  8  0  9 1  10 2  
11 1  12  50  13 55  14 14  15 7  16  9  17 7  18  4 
19  2  20  3  21  0  22  0  23  0  24  1 25  2  % 1st example
}
\listplot[linecolor=blue,plotstyle=bar,barwidth=0.3cm,
  fillcolor=blue!30,fillstyle=solid,opacity=0.5]{
0 0  1 0 2  0  3  0  4  0  5  0  6  0  7  0  8  0  9 3  10 10  
11 11  12  8  13 61  14 10  15 13  16  3  17 1  18  0 
19  0  20  2  21  0  22  0  23  0  24  0 25  0  % 2nd exa
}
\listplot[linecolor=green,plotstyle=bar,barwidth=0.3cm,
  fillcolor=green!30,fillstyle=solid,opacity=0.5]{
0 0 1 0 2  0  3  0  4  1  5  0  6  0  7  0  8  0  9 3  10 4  
11 11  12  59  13 11  14 12  15 7  16  3  17 1  18  0 
19  0  20  2  21  0  22  1  23  0  24  0 25  0  % 3rd exa
}
\end{pspicture}   
\end{document}

\psset{interrupt={15,1,30}}: start,sep,diff

enter image description here

  • Thanks Herbert! Given the strict time constraints I decided to go for a table instead of bar charts. I tried to extend your example, but after an hour of playing simply gave up. – bekon Nov 18 '12 at 15:05

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.