Search code examples
pythonmatplotlibgraphicsreportlab

Matplotlib png output appears "broken" in reportlab's pdf


Does anyone know what could be the reason my matplotlib plot appears "broken" when I print it in PDF through reportlab.

So, this is the Python code I am using:

list = range(6)

fig = plt.figure(figsize=(10, 4))
ax = plt.subplot(111)

ax.plot(list, [2*x for x in list] , label='y = 2x')
ax.plot(list, [0.5*x for x in list], label='y = 0.5*x')
ax.plot(list, list, label='y = x')

plt.xlabel('x')
plt.ylabel('y')
plt.title("Sample Plot")

plt.grid(True, which='major', axis='y')

box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1, box.width, box.height * 0.9])

ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=3,
          fontsize='small')

plt.savefig('test.png',dpi=1000) 

c = canvas.Canvas("hello.pdf")
c.drawImage('test.png', 100, 600, width=4 * 100, height=4 * 40)
c.showPage()
c.save()

The matplotlib test.png output looks fine:

enter image description here

However, the same image in the hello.pdf file looks quite bad:

enter image description here


Solution

  • You don't need to use canvas for pdf. You can save image as pdf with desired quality by just changing the extension .png to .pdf in your following line:

    plt.savefig('test.pdf',dpi=1000)
    

    Also, if you want to adjust the size of the image -as you have written in your code- you can also do something like this (increasing the dpi will increase the picture quality, so broken lines should disappear):

    fig = plt.gcf()
    fig.set_size_inches(32, 18)
    plt.savefig('hello.pdf', bbox_inches='tight', dpi=1000)