It does?! Do you mean that this is done automatically? Can you show me an example of this using only the time module (since I use python2.2, dont have datetime)? I thought that I had to manually set things up and tell matplotlib whether to use YearLocator, MonthLocator, etc.. via calls to: axes.xaxis.set_minor_locator(), axes.xaxis.set_major_locator(), axes.xaxis.set_major_formatter().
In other words for every plot, check the time range of my data, figure out how many ticks I want, and decide whether to use months, days, hours, etc...
In fact, because I was getting some inconsistent results with using the above, I decided that for the most part (excluding a few special cases), I would print the time ticks myself 'manually'. The script below shows what I mean.
On the other note, regarding the weird scaling that I talked about (and showed pretty pics for) in my last mail, I finally put together a small script that exposes the problem. It is a bit rough because I ripped bits and pieces from here and there, but shows the issue. Use the 'wantBadPlot' and 'wantStandardDateTics' to see how things go wrong.
···
--------------------------------
#!/usr/bin/env python
import time
from matplotlib.dates import EpochConverter
from matplotlib.matlab import *
from matplotlib.ticker import FuncFormatter, NullLocator, MinuteLocator, DayLocator, HourLocator, MultipleLocator, DateFormatter
wantBadPlot=1
wantStandardDateTics=1
wantLegend=1
if wantBadPlot:
time1=[1087192789.89]
data1=[-65.54]
else:
time1=[1087192289.89, 1087193789.89]
data1=[-44.343, -65.54]
time2=[
1087161589.89 ,
1087192289.0,
1087192389.0,
1087192489.0,
1087192589.0,
1087192689.0,
1087192789.89 ,
1087192889.0,
1087192989.0,
1087193089.0,
1087193189.0,
1087193289.0,
1087238100.0 ,
]
data2=[
-55.44
-64.54 ,
-66.54 ,
-61.54 ,
-69.54 ,
-45.66,
-55.54 ,
-77.54,
-65.54 ,
-49.54 ,
-57.54 ,
-68.54 ,
-55.54 ,
-23.44
]
ax = subplot(111)
p1Size=len(time1)
p2Size=len(time2)
p1=plot_date(time1, data1, None, '-', color='r')
p2=plot_date(time2, data2, None, '-', color='b')
if wantStandardDateTics:
fmt=DateFormatter('%H:%M')
hours=HourLocator(4)
ax.xaxis.set_minor_locator(NullLocator())
ax.xaxis.set_major_locator(hours)
ax.xaxis.set_major_formatter(fmt)
ax.autoscale_view()
else:
#Manually display dates for tick-labels. Technically could use plot() and
#get the same result.
now=time2[-1]
then=time2[0]
deltaSec=now-then
deltaTickSec=deltaSec/7.0
tickList=[item for item in list(arange(then, now, deltaTickSec))]
def tickString(x, pos):
return time.strftime("%H:%M:%S", time.localtime(x))
formatter = FuncFormatter(tickString)
ax.set_xticks(tickList)
ax.xaxis.set_major_formatter(formatter)
ax.xaxis.set_minor_locator(NullLocator())
ax.autoscale_view()
#This will fix the problem!!
#ax.set_xlim((then, now))
if wantLegend:
legend((p1, p2), ('small data set (%d)' % p1Size, 'large data set (%d)' % p2Size))
xlabel('time')
grid(True)
show()
#savefig('./blah.png')
-------------------------------
Any ideas?
Finally, just want to verify (form my last email) that in axes.py:
def get_ylim(self):
"Get the y axis range [ymin, ymax]"
return self.viewLim.intervalx().get_bounds()
should intervax() be intervaly()??
Thanks,
--
Peter Groszkowski Gemini Observatory
Tel: +1 808 974-2509 670 N. A'ohoku Place
Fax: +1 808 935-9235 Hilo, Hawai'i 96720, USA
John Hunter wrote:
> I found another issue with plot_date. Dont have a simple
> example yet, and hope that this is something 'obvious' and
> I don't have to bother.
There is clearly something wrong with the autoscale function of one of
the date tick locators. It would help to know which one. plot_date
looks at the range of your date data and tries to pick the appropriate
date tick locator based on that range (ie a YearLocator, MonthLocator,
MinuteLocator, etc). If I knew which tick locator was behaving badly,
it would help me fix the problem.
If you
print ax.xaxis._majorLocator
after the call to plot_date, and let me know which locator it is, I
can probably figure out where the problem is. To simplify, don't
explicitly set the date xlim range when you do this.
On a side note, in your example code you call
ax.viewLim.intervalx().set_bounds(minXValueImPlotting, maxXValueImPlotting)
I assume you did this to narrow down the possible causes of problems.
As you know, this is the call that ax.set_xlim makes under the hood.
But in general, it's safest to stick to the axes API, ie, call
ax.set_xlim(minXValueImPlotting, maxXValueImPlotting)
since this interface is guaranteed to be stable.
JDH
-------------------------------------------------------
This SF.Net email is sponsored by the new InstallShield X.
From Windows to Linux, servers to mobile, InstallShield X is the
one installation-authoring solution that does it all. Learn more and
evaluate today! http://www.installshield.com/Dev2Dev/0504
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
matplotlib-users List Signup and Options