Ticket #4194 (closed defect: fixed)
pylab plots cut off
| Reported by: | malb | Owned by: | was |
|---|---|---|---|
| Priority: | major | Milestone: | sage-4.7.2 |
| Component: | graphics | Keywords: | plot |
| Cc: | mvgnu, mhansen, jason | Work issues: | |
| Report Upstream: | Fixed upstream, in a later stable release. | Reviewers: | |
| Authors: | Ryan Grout | Merged in: | |
| Dependencies: | Stopgaps: |
Description
On Thursday 25 September 2008, Stan Schymanski wrote on [sage-support]:
Dear all,
When I upgraded to 3.1.2, I found that some of my plots generated using pylab in the notebooks miss their bottom bits. It seems to be related to the dpi setting. Example:
import pylab
x1 = srange(0,1.1,0.01)
d1 = [2*x+x^2 for x in x1]
pylab.clf() # clear the figure first
pylab.figure(1)
pylab.plot(x1,d1, label="d1")
pylab.ylabel("$f(x)$") # label the axes
pylab.xlabel("$x$")
pylab.savefig('foo.png',dpi=72) # fire!
If I leave the "dpi=72" out in the last line, the plot is larger and complete. This problem did not occur in sage 3.1.1, so I assume that it is a bug.
Attachments
Change History
comment:2 Changed 4 years ago by kcrisman
To release manager: This now works, given #5448 (and possibly earlier).
sage: import pylab
sage: x1 = srange(0,1.1,0.01)
sage: d1 = [2*x+x^2 for x in x1]
sage: pylab.clf() # clear the figure first
sage: pylab.figure(1)
<matplotlib.figure.Figure object at 0x16d41d0>
sage: pylab.plot(x1,d1, label="d1")
[<matplotlib.lines.Line2D object at 0x102ceb0>]
sage: pylab.ylabel("$f(x)$") # label the axes
<matplotlib.text.Text object at 0x4413f0>
sage: pylab.xlabel("$x$")
<matplotlib.text.Text object at 0x1038890>
sage: pylab.savefig('foo.png',dpi=72)
foo.png is attached.
comment:3 Changed 4 years ago by jason
- Cc mvgnu added
kcrisman says this works now, so should be closed.
comment:4 Changed 4 years ago by jason
Don't close this.
Something really, really weird is going on.
In a fresh Sage session (not even in the notebook, just in a Sage console session), running the following (simplified from above) code produces png that is cut off which is about 12K:
import matplotlib.pyplot as plt
import numpy
plt.figure()
plt.plot(numpy.arange(0,1.1,0.01))
plt.savefig('foo.png',dpi=72) # fire!
However, immediately saving the figure again using plt.savefig('foo.png',dpi=72) writes a 13K file which is not cut off.
Doing the same test with sage -python yields the correct figure the first time. Doing the same test with the system python yields the correct figure the first time. This is with the matplotlib 0.99.1 spkg installed.
comment:6 Changed 4 years ago by jason
I've posted to the matplotlib-user mailing list today about this issue.
comment:7 Changed 2 years ago by ryan
- Report Upstream set to N/A
With sage 4.6.0 it is still cut off (matplotlib 1.0.0)
Changed 2 years ago by ryan
-
attachment
trac_4196_mpl_workaround.patch
added
workaround for matplotlib 1.0.0 bug
comment:9 Changed 2 years ago by ryan
- Status changed from new to needs_review
- Authors set to Ryan Grout
according to the matplotlib-users discussion, the issue arises because the file is not flushed before being closed. This patch correctly opens, writes and most importantly flush the file before closing.
The bug still appears to exist upstream.
comment:10 Changed 2 years ago by ryan
- Cc jason added
- Status changed from needs_review to needs_work
- Report Upstream changed from N/A to Fixed upstream, in a later stable release.
comment:11 Changed 2 years ago by ryan
see #10588. Upgrading to matplotlib 1.0.1 should fix the issue
comment:12 Changed 19 months ago by jason
- Status changed from needs_work to closed
- Resolution set to fixed
Indeed, this is now fixed.

This is because matplotlib doesn't like the Sage Integer 72. If you change the 72 to int(72), then things work. We should probably write an email to the matplotlib mailing list asking them how hard it would be to make it play nicely with Sage types.
We also encounter similar issues with numpy and scipy.