Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7a29ad1

Browse files
committed
Merge pull request#5588 from mdboom/dynamic-ticking
Adjust number of ticks based on length of axis
2 parentsd0e7a36 +eafa79b commit7a29ad1

File tree

5 files changed

+55
-3
lines changed

5 files changed

+55
-3
lines changed

‎lib/matplotlib/axis.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,7 @@ def __init__(self, axes, pickradius=15):
654654
# Initialize here for testing; later add API
655655
self._major_tick_kw=dict()
656656
self._minor_tick_kw=dict()
657+
self._tick_space=None
657658

658659
self.cla()
659660
self._set_scale('linear')
@@ -785,6 +786,7 @@ def set_tick_params(self, which='major', reset=False, **kw):
785786
fortickinself.minorTicks:
786787
tick._apply_params(**self._minor_tick_kw)
787788
self.stale=True
789+
self._tick_space=None
788790

789791
@staticmethod
790792
def_translate_tick_kw(kw,to_init_kw=True):
@@ -1665,6 +1667,13 @@ def axis_date(self, tz=None):
16651667
tz=pytz.timezone(tz)
16661668
self.update_units(datetime.datetime(2009,1,1,0,0,0,0,tz))
16671669

1670+
defget_tick_space(self):
1671+
"""
1672+
Return the estimated number of ticks that can fit on the axis.
1673+
"""
1674+
# Must be overridden in the subclass
1675+
raiseNotImplementedError()
1676+
16681677

16691678
classXAxis(Axis):
16701679
__name__='xaxis'
@@ -1988,6 +1997,18 @@ def set_default_intervals(self):
19881997
self.axes.viewLim.intervalx=xmin,xmax
19891998
self.stale=True
19901999

2000+
defget_tick_space(self):
2001+
ifself._tick_spaceisNone:
2002+
ends=self.axes.transAxes.transform([[0,0], [1,0]])
2003+
length= ((ends[1][0]-ends[0][0])/self.axes.figure.dpi)*72.0
2004+
tick=self._get_tick(True)
2005+
# There is a heuristic here that the aspect ratio of tick text
2006+
# is no more than 3:1
2007+
size=tick.label1.get_size()*3
2008+
size*=np.cos(np.deg2rad(tick.label1.get_rotation()))
2009+
self._tick_space=np.floor(length/size)
2010+
returnself._tick_space
2011+
19912012

19922013
classYAxis(Axis):
19932014
__name__='yaxis'
@@ -2318,3 +2339,14 @@ def set_default_intervals(self):
23182339
ifnotviewMutated:
23192340
self.axes.viewLim.intervaly=ymin,ymax
23202341
self.stale=True
2342+
2343+
defget_tick_space(self):
2344+
ifself._tick_spaceisNone:
2345+
ends=self.axes.transAxes.transform([[0,0], [0,1]])
2346+
length= ((ends[1][1]-ends[0][1])/self.axes.figure.dpi)*72.0
2347+
tick=self._get_tick(True)
2348+
# Having a spacing of at least 2 just looks good.
2349+
size=tick.label1.get_size()*2.0
2350+
size*=np.cos(np.deg2rad(tick.label1.get_rotation()))
2351+
self._tick_space=np.floor(length/size)
2352+
returnself._tick_space

‎lib/matplotlib/tests/test_axes.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4191,6 +4191,12 @@ def test_axes_margins():
41914191
assertax.get_ybound()== (-0.5,9.5)
41924192

41934193

4194+
@image_comparison(baseline_images=["auto_numticks"],style='default',
4195+
extensions=['png'])
4196+
deftest_auto_numticks():
4197+
fig,axes=plt.subplots(4,4)
4198+
4199+
41944200
if__name__=='__main__':
41954201
importnose
41964202
importsys

‎lib/matplotlib/ticker.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ def get_data_interval(self):
202202
defset_data_interval(self,vmin,vmax):
203203
self.dataLim.intervalx=vmin,vmax
204204

205+
defget_tick_space(self):
206+
# Just use the long-standing default of nbins==9
207+
return9
208+
205209

206210
classTickHelper(object):
207211
axis=None
@@ -1349,7 +1353,9 @@ def __init__(self, *args, **kwargs):
13491353
Keyword args:
13501354
13511355
*nbins*
1352-
Maximum number of intervals; one less than max number of ticks.
1356+
Maximum number of intervals; one less than max number of
1357+
ticks. If the string `'auto'`, the number of bins will be
1358+
automatically determined based on the length of the axis.
13531359
13541360
*steps*
13551361
Sequence of nice numbers starting with 1 and ending with 10;
@@ -1387,7 +1393,9 @@ def __init__(self, *args, **kwargs):
13871393
defset_params(self,**kwargs):
13881394
"""Set parameters within this locator."""
13891395
if'nbins'inkwargs:
1390-
self._nbins=int(kwargs['nbins'])
1396+
self._nbins=kwargs['nbins']
1397+
ifself._nbins!='auto':
1398+
self._nbins=int(self._nbins)
13911399
if'trim'inkwargs:
13921400
self._trim=kwargs['trim']
13931401
if'integer'inkwargs:
@@ -1416,6 +1424,8 @@ def set_params(self, **kwargs):
14161424

14171425
defbin_boundaries(self,vmin,vmax):
14181426
nbins=self._nbins
1427+
ifnbins=='auto':
1428+
nbins=self.axis.get_tick_space()
14191429
scale,offset=scale_range(vmin,vmax,nbins)
14201430
ifself._integer:
14211431
scale=max(1,scale)
@@ -1901,7 +1911,11 @@ def tick_values(self, vmin, vmax):
19011911

19021912
classAutoLocator(MaxNLocator):
19031913
def__init__(self):
1904-
MaxNLocator.__init__(self,nbins=9,steps=[1,2,5,10])
1914+
ifrcParams['_internal.classic_mode']:
1915+
nbins=9
1916+
else:
1917+
nbins='auto'
1918+
MaxNLocator.__init__(self,nbins=nbins,steps=[1,2,5,10])
19051919

19061920

19071921
classAutoMinorLocator(Locator):

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp