|
From: Peter G. <pgr...@ge...> - 2004-06-15 03:26:44
|
Hi John:
> 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).
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:
>>>>>> "Peter" == Peter Groszkowski <pio...@ho...> writes:
>>>>>>
>>>>>
>
> Peter> I found another issue with plot_date. Dont have a simple
> Peter> example yet, and hope that this is something 'obvious' and
> Peter> 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
> Mat...@li...
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
>
|