pythonpython-2.7matplotlibpgf

Matplotlib 2.0 stripes in histogram


I get vertical stripes between the bins when creating a histogram with matplotlib 2.0.2, python2.7, Win7,64bit, visible both in the pdf and png created. I am usig pgf with latex to create a PDF which I will use by includegraphics in a pdflatex document. The PNG created is just a quick check.

This was not the case in Matplotlib 1.5.3. How do I get rid of these white lines separating individual bins?

Things tried:

Code to produce the image

import matplotlib as mpl
mpl.use('pgf')
pgf_with_latex = {                      # setup matplotlib to use latex for output
    "pgf.texsystem": "pdflatex",        # change this if using xetex or lautex
    "text.usetex": True,                # use LaTeX to write all text
    "font.family": "serif",
    "font.serif": [],                   # blank entries should cause plots to inherit fonts from the document
    "font.sans-serif": [],
    "font.monospace": [],
    "axes.labelsize": 10,               # LaTeX default is 10pt font.
    "font.size": 8,
    "legend.fontsize": 7,               # Make the legend/label fonts a little smaller
    "xtick.labelsize": 7,
    "ytick.labelsize": 7,
    "pgf.preamble": [
        r"\usepackage[utf8x]{inputenc}",    # use utf8 fonts becasue your computer can handle it :)
        r"\usepackage[T1]{fontenc}",        # plots will be generated using this preamble
        r"\usepackage{siunitx}",
        r"\DeclareSIUnit[number-unit-product = {}] ",
        r"\LSB{LSB}",
        ]
    }
mpl.rcParams.update(pgf_with_latex)

import matplotlib.pyplot as pl
import numpy as np

fig=pl.figure(figsize=(3,2))

ax1 = fig.add_subplot(111)
dat=np.random.normal(-120-60,40,200000).astype(int)
bins=np.arange(int(np.amin(dat))-.5,127.5,2)
ax1.hist(dat, bins = bins, stacked = True)
ax1.set_title("\\emph{(a)} minimal example")
ax1.set_yscale("log", nonposy="clip")
ax1.set_ylim(0.8, 20000)
ax1.set_xlim(None, 130)
ax1.set_ylabel("frequency")
ax1.set_xlabel("data")
ax1.set_xticks([-300,-200, -127,0,127])
fig.tight_layout(h_pad=1,w_pad=0.2)

pl.savefig('test.png', bbox_inches='tight',dpi=600)
pl.savefig('test.pdf', bbox_inches='tight',dpi=600)

Output of the above code:
output of the above code


Solution

  • 1. Not using pgf backend

    As @unutbu pointed out in his (unfortunately now deleted) answer, not using the pgf backend will actually produce the expected plot.

    Removing the line

    mpl.use('pgf')
    

    will give

    enter image description here

    2. Step function

    If for some reason the use of the pgf backend cannot be avoided, a workaround may be to use a step function to plot the histogram. Removing ax1.hist(...) from the code and replacing it with

    hist, ex = np.histogram(dat, bins = bins)
    ax1.fill_between(bins[:-1], hist, lw=0.0, step="post")
    

    gives

    enter image description here