I've also done some additional testing to see if I could figure out what
was going on, and it turns out that it's not just a problem with eps files.
This problem also occurs in the other vector graphics formats,
ps/eps/pdf/svg. In all cases the entire image is actually contained within
the file, it's just shifted and clipped. Sometimes it's shifted so much
that none of it is within the axes window and thus the entire image gets
clipped and it appears not to be there at all.

I also discovered that the time axis isn't actually a factor.

I've also noticed that using interpolation seems to make a difference. When
I use the default interpolation the plots *seem* to come out fine, although
some of my other data do look a little bit shifted, but that could be some
other effect.

Another weird thing that I've noticed is that different viewers interpret
this shifting in different ways. For example, the pdfs all look fine when I
view them in Okular, but are shifted in xpdf. (At some point I submitted a
second email to the list re: this problem that had screenshots attached. I
don't know if it ever made it through however.)

I'll submit the but report on the git tracker.

Round-off error could make sense.

--Chad

Here's my most recent set of test code:

import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm

imgData = [[1.0/(x) + 1.0/(y) for x in range(1,100)] for y in range(1,100)]

tMin=734717.945208
tMax=734717.946366

# Case 0: Works
Case0={"id":0,
       "interp":None,
       "extents":(tMin,tMax,1,100)}

# Case 1: Works
Case1={"id":1,
       "interp":"none",
       "extents":(1,100,1,100)}

# Case 2: Doesn't work
Case2={"id":2,
       "interp":"none",
       "extents":(tMin,tMax,1,100)}


for Case in (Case2, Case1, Case0):
    plt.figure(Case["id"])
    axImg=plt.subplot(111)
    axImg.imshow(imgData,
                    norm=LogNorm(),
                    interpolation=Case["interp"],
                    extent=Case["extents"])
    axImg.set_aspect('auto')

    for filetype in ["png", "eps", "pdf", "svg"]:
        plt.savefig("imageshift-Case{0}.{1}".format(Case["id"], filetype))



On Tue, Aug 14, 2012 at 3:19 AM, Eric Firing <efir...@hawaii.edu> wrote:

> On 2012/08/13 3:58 PM, Benjamin Root wrote:
> >
> >
> > On Thu, Aug 2, 2012 at 7:21 PM, Chad Parker <parker.char...@gmail.com
> > <mailto:parker.char...@gmail.com>> wrote:
> >
> >     Hello everyone-
> >
> >     I'm a new Python/Matplotlib user, but I have quite a bit of plotting
> >     experience with octave/matlab and gnuplot. So, I apologize in
> >     advance if my python style is terrible and if I give you all the
> >     wrong information!
> >
> >     I'm having a problem saving figures that contain images as eps files
> >     when my x-axis is a date/time axis. The trouble is that in the
> >     resulting eps file, the image data is shifted relative to the axis.
> >     I've attached two images as an example. In the .png file the
> >     alignment is correct and in the eps file it's not. The png is also
> >     nearly identical to what I get when I plot to the screen. The script
> >     I wrote to generate these plots is at the end of this message.
> >
> >     It's worth noting that the two output images are identical if the
> >     x-axis is simply numerical and not a time series.
> >
> >     I'm using python 2.7.3 and Matplotlib 1.1.0
> >
> >     Some Google searches dug up this old thread, however, the shift that
> >     I'm experiencing seems to be much greater, so I don't know if it's
> >     related:
> >
> http://old.nabble.com/Saving-as-eps-file-shifts-image--td29232680.html
> >
> >     Can anyone help me solve this?
> >     Thanks in advance,
> >     --Chad
> >
> >
> >     Here is a minimal script that I used to generate these plots:
> >
> >     import matplotlib.pyplot as plt
> >     import matplotlib.dates as dts
> >     from matplotlib.colors import LogNorm
> >
> >     imgData = [[1.0/x + 1.0/y for x in range(1,100)] for y in
> range(1,100)]
> >
> >     tMin=dts.epoch2num(1343947266)
> >     tMax=dts.epoch2num(1343947266+100)
> >
> >     axImg=plt.subplot(111)
> >     axImg.imshow(imgData, norm=LogNorm(),extent=(tMin,tMax,1,100),\
> >                      interpolation='none', origin="upper")
> >     axImg.xaxis_date()
> >     axImg.set_aspect('auto')
> >
> >     plt.savefig("imageshift.png")
> >     plt.savefig("imageshift.eps")
> >
> >
> > Confirmed.  This is a fairly nasty-looking result.  And I am not exactly
> > sure what is happening here.  Note that it does not matter if the png or
> > the eps images were saved first.  It looks like an auto-scaling bug, but
> > given that it doesn't impact the png image, I am not so sure.
>
> This appears to be some sort of truncation error bug; it has nothing to
> do with dates.  Here is a modified illustration:
>
> import matplotlib.pyplot as plt
> from matplotlib.colors import LogNorm
>
> imgData = [[1.0/x + 1.0/y for x in range(1,10)] for y in range(1,10)]
>
> tMin = 1000000066 # Shifted by half
> tMin = 100000066  # Blank!
> tMin = 10000066   # OK
> tMax = tMin+10
>
> # The following combination is also shifted by half
> tMin = 10000066.1  # adding the 0.1 doesn't make a difference
> tMax = tMin+1
>
> print tMin, tMax
>
> axImg=plt.subplot(111)
> axImg.imshow(imgData, norm=LogNorm(), extent=(tMin,tMax,1,10),
>                  interpolation='none', origin="upper")
> axImg.set_aspect('auto')
>
> plt.savefig("imageshift.png")
> plt.savefig("imageshift.eps")
> plt.savefig("imageshift.pdf")
>
> I thought it might come from the use of str() instead of repr() when
> generating the concat matrix in the ps backend, but that's not it.  I'm
> suspecting it may be inherent in the ps language, when one uses a matrix
> to make an enormous translation in one direction, and then uses
> translate to sling everything back in the other direction.  Either that,
> or some sort of "snapping" is going on.
>
> Eric
>
> >
> > Could you file a bug report on this at the github tracker?  I would like
> > to see this fixed before the 1.2.0 release.
> >
> > Thanks!
> > Ben Root
> >
>
>
>
> ------------------------------------------------------------------------------
> Live Security Virtual Conference
> Exclusive live event will cover all the ways today's security and
> threat landscape has changed and how IT managers can respond. Discussions
> will include endpoint security, mobile security and the latest in malware
> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
> _______________________________________________
> Matplotlib-users mailing list
> Matplotlib-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to