|
From: Eric F. <ef...@ha...> - 2012-08-15 02:11:14
|
On 2012/08/14 3:15 PM, Damien Irving wrote:
> I've been plotting timeseries data using the matplotlib.dates module and
> have come across an issue when using it in conjunction with the subplot
> command.
>
> For figures with greater than one subplot in a particular column, the
> time (or x) axis ticks and their labels are only printed on the final
> subplot that is plotted, and are missing on all other subplots in that
> column (see example code below). The only exception is when the time
> axis is identical for each plot in the column (you can test this by
> editing my example code at ###) - then all time axis ticks and their
> labels are displayed correctly.
>
> Is this a bug in the subplot source code, or am I missing something?
You are missing something, but it is something that is quite
non-intuitive and easy to miss: Locators can't be shared among axes.
The set_major_locator() method assigns its axis to that Locator,
overwriting any axis that was previously assigned.
The solution is to make a new Locator instance for each axis that needs one.
Eric
>
>
> from pylab import *
> from matplotlib.dates import YEARLY, DateFormatter, rrulewrapper,
> RRuleLocator, drange
> import datetime
>
> # tick every 5th easter #
> rule = rrulewrapper(YEARLY, byeaster=1, interval=5)
> loc = RRuleLocator(rule)
> formatter = DateFormatter('%m/%d/%y')
>
> # data for subplot 1 #
> date1 = datetime.date( 1952, 1, 1 )
> date2 = datetime.date( 2004, 4, 12 )
> delta = datetime.timedelta(days=100)
>
> dates = drange(date1, date2, delta)
> s = rand(len(dates)) # make up some random y values
>
> # plot subplot 1 #
> ax1 = subplot(211)
> plot_date(dates, s)
> ax1.xaxis.set_major_locator(loc)
> ax1.xaxis.set_major_formatter(formatter)
> labels = ax1.get_xticklabels()
> setp(labels, rotation=30, fontsize=10)
>
> # data for subplot 2 #
> date1 = datetime.date( 2052, 1, 1 ) ###( 1952, 1, 1 )
> date2 = datetime.date( 2104, 4, 12 ) ###( 2004, 4, 12 )
>
> dates = drange(date1, date2, delta)
> s = rand(len(dates)) # make up some random y values
>
> # plot subplot 2 #
> ax2 = subplot(212)
> plot_date(dates, s)
> ax2.xaxis.set_major_locator(loc)
> ax2.xaxis.set_major_formatter(formatter)
> labels = ax2.get_xticklabels()
> setp(labels, rotation=30, fontsize=10)
>
> show()
>
>
> ------------------------------------------------------------------------------
> 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
> Mat...@li...
> https://lists.sourceforge.net/lists/listinfo/matplotlib-users
>
|