SourceForge logo
SourceForge logo
Menu

matplotlib-users

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):
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /