From: David T. <dav...@gm...> - 2006-11-24 19:47:36
Attachments:
two_scale_y.py
image.png
|
Hi all, I use sharey functionality on a regular basis for my plots. Nice,but ticks are sometime overlapping and are unreadable in the top-left corner (see figure joined). Also joined, a small script reproducing the problem. How could I avoid this overlapping? Thanks David |
From: Pierre GM <pgm...@gm...> - 2006-11-24 20:10:44
|
> How could I avoid this overlapping? What about deleting your first tick on ax2, with >>> ax2.set_xticks(ax2.get_xticks()[1:]) at the end of your code ? |
From: Darren D. <dd...@co...> - 2006-11-24 20:14:32
|
On Friday 24 November 2006 3:10 pm, Pierre GM wrote: > > How could I avoid this overlapping? > > What about deleting your first tick on ax2, with > > >>> ax2.set_xticks(ax2.get_xticks()[1:]) > > at the end of your code ? Or, you can change the formatter of your yaxis to OldScalarFormatter, which renders the scientific notation in each tick label, rather than at the top of the axis. |
From: Pierre GM <pgm...@gm...> - 2006-11-24 20:34:35
|
On Friday 24 November 2006 15:14, Darren Dale wrote: > Or, you can change the formatter of your yaxis to OldScalarFormatter, which > renders the scientific notation in each tick label, rather than at the top > of the axis. Thinking about it: is there a way to grab this scientific notation ? The idea would be to get the corresponding object as a string, and update the ylabel with it. |
From: Darren D. <dd...@co...> - 2006-11-24 20:43:39
|
On Friday 24 November 2006 3:34 pm, Pierre GM wrote: > On Friday 24 November 2006 15:14, Darren Dale wrote: > > Or, you can change the formatter of your yaxis to OldScalarFormatter, > > which renders the scientific notation in each tick label, rather than at > > the top of the axis. > > Thinking about it: is there a way to grab this scientific notation ? The > idea would be to get the corresponding object as a string, and update the > ylabel with it. Yes, the scientific notation is a matplotlib text object, which you can grab like this: plot([0,1e10]) a=gca() t=a.yaxis.get_offset_text() and then you can get the string: s=t.get_text() Darren |
From: David T. <dav...@gm...> - 2006-11-24 20:46:38
Attachments:
image.png
two_scale2_y.py
|
Well... deleting the first is not a solution for me My app use pan/zoom tool for manual adjustment of the plot. if I put the line you proposed at the end of my code, the x upper labels are not dynamically updated anymore and could be that one end bellow the "scaling factor" "x1e4" of the y labels... Change the formatter of the yaxis to OldScalarFormatter do the trick but I would prefer to use the default formatter. Would it be possible to move the "x1e4" to the left to avoid the overlapping? By the way I've just discover kind of bug: the scaling factor of the x top axis is displayed on the x bottom axis (???) (see bottom right of the new example). I join a new example reproducing both problems. 2006/11/24, Pierre GM < pgm...@gm...>: > > > > How could I avoid this overlapping? > > What about deleting your first tick on ax2, with > >>> ax2.set_xticks(ax2.get_xticks()[1:]) > at the end of your code ? > |
From: David T. <dav...@gm...> - 2006-11-24 20:56:44
|
Note: same problem applied for sharex... 2006/11/24, David TREMOUILLES <dav...@gm...>: > > Well... deleting the first is not a solution for me > My app use pan/zoom tool for manual adjustment of the plot. > if I put the line you proposed at the end of my code, the x upper labels > are not > dynamically updated anymore and could be that one end bellow the "scaling > factor" "x1e4" of the y labels... > > Change the formatter of the yaxis to OldScalarFormatter do the trick but I > would prefer to use the default formatter. > Would it be possible to move the "x1e4" to the left to avoid the > overlapping? > > By the way I've just discover kind of bug: the scaling factor of the x top > axis is displayed on the x bottom axis (???) (see bottom right of the new > example). > I join a new example reproducing both problems. > > > 2006/11/24, Pierre GM < pgm...@gm...>: > > > > > > > How could I avoid this overlapping? > > > > What about deleting your first tick on ax2, with > > >>> ax2.set_xticks(ax2.get_xticks()[1:]) > > at the end of your code ? > > > > > |
From: Darren D. <dd...@co...> - 2006-11-24 22:16:01
|
On Friday 24 November 2006 3:46 pm, David TREMOUILLES wrote: > Well... deleting the first is not a solution for me > My app use pan/zoom tool for manual adjustment of the plot. > if I put the line you proposed at the end of my code, the x upper labels > are not > dynamically updated anymore and could be that one end bellow the "scaling > factor" "x1e4" of the y labels... > > Change the formatter of the yaxis to OldScalarFormatter do the trick but I > would prefer to use the default formatter. > Would it be possible to move the "x1e4" to the left to avoid the > overlapping? > > By the way I've just discover kind of bug: the scaling factor of the x top > axis is displayed on the x bottom axis The patch at the end of this post *should* render the scaling factor above the xaxis labels on the top axis. It should, but it doesn't. Instead, it renders the scaling factor overlapping the tick labels on the top axis. I don't understand this behavior, considering the scaling factor is properly rendered if the bottom axis is the one that is labeled. As for overlapping with twinx and twiny, I don't know how best to proceed here. The offset_text's parent axis would have to inspect its own ticklabels as well as the ticklabels of the OTHER axis, and based on their extent, find a new location for the offset_text. This is starting to get in the realm of requiring a layout manager in order to implement properly. I'm preparing for a professional meeting next week (anyone else going to MRS in Boston?) and don't have time to continue working on this. Perhaps the patch is enough to get someone else pointed in the right direction. Darren Index: lib/matplotlib/axis.py =================================================================== --- lib/matplotlib/axis.py (revision 2898) +++ lib/matplotlib/axis.py (working copy) @@ -868,7 +868,7 @@ offsetText.set_transform( blend_xy_sep_transform( self.axes.transAxes, identity_transform() )) self._set_artist_props(offsetText) - self.offset_text_position='bottom' +## self.offset_text_position='bottom' return offsetText def get_label_position(self): @@ -923,13 +923,28 @@ boxes of all the ticklabels """ x,y = self.offsetText.get_position() - if not len(bboxes): - bottom = self.axes.bbox.ymin() + position = self.get_ticks_position() + if position == 'top': + if not len(bboxes): + top = self.axes.bbox.ymax() + else: + bbox = bbox_all(bboxes) + top = bbox.ymax() + self.offsetText.set_position((x, top+self.OFFSETTEXTPAD*self.figure.dpi.get()/72.0)) else: - bbox = bbox_all(bboxes) - bottom = bbox.ymin() - self.offsetText.set_position((x, bottom-self.OFFSETTEXTPAD*self.figure.dpi.get()/72.0)) + if not len(bboxes): + bottom = self.axes.bbox.ymin() + else: + bbox = bbox_all(bboxes) + bottom = bbox.ymin() + self.offsetText.set_position((x, bottom-self.OFFSETTEXTPAD*self.figure.dpi.get()/72.0)) + def set_offset_position(self, position): + assert position == 'top' or position == 'bottom' + + if position == 'top': self.offsetText.set_va('bottom') + else: self.offsetText.set_va('top') + def set_ticks_position(self, position): """ Set the ticks position (top, bottom, both or default) @@ -946,24 +961,28 @@ ticks.extend( self.minorTicks ) if position == 'top': + self.set_offset_position('top') for t in ticks: t.tick1On = False t.tick2On = True t.label1On = False t.label2On = True elif position == 'bottom': + self.set_offset_position('bottom') for t in ticks: t.tick1On = True t.tick2On = False t.label1On = True t.label2On = False elif position == 'default': + self.set_offset_position('bottom') for t in ticks: t.tick1On = True t.tick2On = True t.label1On = True t.label2On = False else: + self.set_offset_position('bottom') for t in ticks: t.tick1On = True t.tick2On = True @@ -1042,7 +1061,7 @@ offsetText.set_transform(blend_xy_sep_transform(self.axes.transAxes, identity_transform()) ) self._set_artist_props(offsetText) - self.offset_text_position='left' +## self.offset_text_position='left' return offsetText def get_label_position(self): |