Re: [Matplotlib-users] Overlapping labels in pie charts

2010-03-28 Thread Rune V . Sjøen
Hello again, and thanks.

I did not have a chance to look at this until now but using arc instead of
angle worked out great.

2010/3/24 Jae-Joon Lee lee.j.j...@gmail.com

 You should not use angle style if you change the x,y position (this
 is due to the algorithm of how the line connecting two points are
 create).

 Try something like below instead.

   if foo:
   if theta - foo  10:
   print sys.stderr, Overlapping, offsetting a little bit
   y1 = y1 + 0.1
if x1  0 :
   cstyle=arc,angleA=180,armA=30,armB=10,angleB=%f%(-theta,)
   else:
   cstyle=arc,angleA=0,armA=30,armB=10,angleB=%f%(theta,)

 There is not much documentation of how each algorithm works (it is
 beyond my english skill). They are loosely based on the latex pstrick
 package and the screenshot in the following link may be useful to get
 some idea though.


 http://matplotlib.sourceforge.net/users/annotations_guide.html#annotating-with-arrow

 Regards,

 -JJ


 2010/3/24 Rune V. Sjøen rvsj...@gmail.com:
  Hello again, and thank you very much for the answer, suddenly it all got
  much clearer to me. The only 'issue' I am having is (from screenshot)
 what
  happens to the line pointing to Logs when I try to offset it a little bit
 on
  the Y axis. It looks like either the angleA or angleB is wrong, but I
 don't
  see and reason why it would be as the X coordinates does not change.
 
  Another thing I do not quite understand is what that patchB does.
 
  figure(1, figsize=(6,6))
  ax = axes([0.1, 0.1, 0.8, 0.8])
 
  labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
  fracs = [45, 135 ,1, 1]
 
  p = pie(fracs)
 
  foo = None
  for p1, l1 in zip(p[0], labels):
 
 r = p1.r
 dr = r*0.1
 t1, t2 = p1.theta1, p1.theta2
 theta = (t1+t2)/2.
 
 xc = cos(theta/180.*pi)*r
 yc = sin(theta/180.*pi)*r
 x1 = cos(theta/180.*pi)*(r+dr)
 y1 = sin(theta/180.*pi)*(r+dr)
 
 if x1  0 :
 x1 = r+2*dr
 ha, va = left, center
 cstyle=angle,angleA=180,angleB=%f%(-theta,)
 print  sys.stderr, ha, ,A,, va
 else:
 x1 = -(r+2*dr)
 ha, va = right, center
 cstyle=angle,angleA=0,angleB=%f%(theta,)
 print  sys.stderr, ha, ,B,, va
 
 if foo:
 if theta - foo  10:
 print sys.stderr, Overlapping, offsetting a little
  bit
 y1 = y1 + 0.1
 foo = theta
 
 annotate(l1,
  (xc, yc), xycoords=data,
  xytext=(x1, y1), textcoords=data, ha=ha, va=va,
  arrowprops=dict(arrowstyle=-,
  connectionstyle=cstyle,
  patchB=p1))
 
  - Rune
 
  2010/3/23 Jae-Joon Lee lee.j.j...@gmail.com
 
  This should be doable using the annotation. Here is a simple cook-up I
  just did. it uses a  naive algorithm to place the labels, but I guess
  it gives you an idea how things work.
  a screenshot is attached.
 
  Regards,
 
  -JJ
 
 
  from pylab import *
 
  # make a square figure and axes
  figure(1, figsize=(6,6))
  ax = axes([0.1, 0.1, 0.8, 0.8])
 
  labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
  fracs = [15,30,45, 10]
 
  explode=(0, 0.05, 0, 0)
  p = pie(fracs, explode=explode, shadow=True)
  title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5})
 
  for p1, l1 in zip(p[0], labels):
 r = p1.r
 dr = r*0.1
 t1, t2 = p1.theta1, p1.theta2
 theta = (t1+t2)/2.
 
 xc, yc = r/2.*cos(theta/180.*pi), r/2.*sin(theta/180.*pi)
 x1, y1 = (r+dr)*cos(theta/180.*pi), (r+dr)*sin(theta/180.*pi)
 if x1  0 :
 x1 = r+2*dr
 ha, va = left, center
 tt = -180
 cstyle=angle,angleA=0,angleB=%f%(theta,)
 else:
 x1 = -(r+2*dr)
 ha, va = right, center
 tt = 0
 cstyle=angle,angleA=0,angleB=%f%(theta,)
 
 annotate(l1,
  (xc, yc), xycoords=data,
  xytext=(x1, y1), textcoords=data, ha=ha, va=va,
  arrowprops=dict(arrowstyle=-,
  connectionstyle=cstyle,
  patchB=p1))
 
  show()
 
 

--
Download Intel#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] Overlapping labels in pie charts

2010-03-24 Thread Rune V . Sjøen
Hello again, and thank you very much for the answer, suddenly it all got
much clearer to me. The only 'issue' I am having is (from screenshot) what
happens to the line pointing to Logs when I try to offset it a little bit on
the Y axis. It looks like either the angleA or angleB is wrong, but I don't
see and reason why it would be as the X coordinates does not change.

Another thing I do not quite understand is what that patchB does.

figure(1, figsize=(6,6))
ax = axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [45, 135 ,1, 1]

p = pie(fracs)

foo = None
for p1, l1 in zip(p[0], labels):

   r = p1.r
   dr = r*0.1
   t1, t2 = p1.theta1, p1.theta2
   theta = (t1+t2)/2.

   xc = cos(theta/180.*pi)*r
   yc = sin(theta/180.*pi)*r
   x1 = cos(theta/180.*pi)*(r+dr)
   y1 = sin(theta/180.*pi)*(r+dr)

   if x1  0 :
   x1 = r+2*dr
   ha, va = left, center
   cstyle=angle,angleA=180,angleB=%f%(-theta,)
   print  sys.stderr, ha, ,A,, va
   else:
   x1 = -(r+2*dr)
   ha, va = right, center
   cstyle=angle,angleA=0,angleB=%f%(theta,)
   print  sys.stderr, ha, ,B,, va

   if foo:
   if theta - foo  10:
   print sys.stderr, Overlapping, offsetting a little
bit
   y1 = y1 + 0.1
   foo = theta

   annotate(l1,
(xc, yc), xycoords=data,
xytext=(x1, y1), textcoords=data, ha=ha, va=va,
arrowprops=dict(arrowstyle=-,
connectionstyle=cstyle,
patchB=p1))

- Rune

2010/3/23 Jae-Joon Lee lee.j.j...@gmail.com

 This should be doable using the annotation. Here is a simple cook-up I
 just did. it uses a  naive algorithm to place the labels, but I guess
 it gives you an idea how things work.
 a screenshot is attached.

 Regards,

 -JJ


 from pylab import *

 # make a square figure and axes
 figure(1, figsize=(6,6))
 ax = axes([0.1, 0.1, 0.8, 0.8])

 labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
 fracs = [15,30,45, 10]

 explode=(0, 0.05, 0, 0)
 p = pie(fracs, explode=explode, shadow=True)
 title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5})

 for p1, l1 in zip(p[0], labels):
r = p1.r
dr = r*0.1
t1, t2 = p1.theta1, p1.theta2
theta = (t1+t2)/2.

xc, yc = r/2.*cos(theta/180.*pi), r/2.*sin(theta/180.*pi)
x1, y1 = (r+dr)*cos(theta/180.*pi), (r+dr)*sin(theta/180.*pi)
if x1  0 :
x1 = r+2*dr
ha, va = left, center
tt = -180
cstyle=angle,angleA=0,angleB=%f%(theta,)
else:
x1 = -(r+2*dr)
ha, va = right, center
tt = 0
cstyle=angle,angleA=0,angleB=%f%(theta,)

annotate(l1,
 (xc, yc), xycoords=data,
 xytext=(x1, y1), textcoords=data, ha=ha, va=va,
 arrowprops=dict(arrowstyle=-,
 connectionstyle=cstyle,
 patchB=p1))

 show()

attachment: tmpkZslt5.png--
Download Intel#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] Overlapping labels in pie charts

2010-03-24 Thread Jae-Joon Lee
You should not use angle style if you change the x,y position (this
is due to the algorithm of how the line connecting two points are
create).

Try something like below instead.

   if foo:
   if theta - foo  10:
   print sys.stderr, Overlapping, offsetting a little bit
   y1 = y1 + 0.1
   if x1  0 :
   cstyle=arc,angleA=180,armA=30,armB=10,angleB=%f%(-theta,)
   else:
   cstyle=arc,angleA=0,armA=30,armB=10,angleB=%f%(theta,)

There is not much documentation of how each algorithm works (it is
beyond my english skill). They are loosely based on the latex pstrick
package and the screenshot in the following link may be useful to get
some idea though.

http://matplotlib.sourceforge.net/users/annotations_guide.html#annotating-with-arrow

Regards,

-JJ


2010/3/24 Rune V. Sjøen rvsj...@gmail.com:
 Hello again, and thank you very much for the answer, suddenly it all got
 much clearer to me. The only 'issue' I am having is (from screenshot) what
 happens to the line pointing to Logs when I try to offset it a little bit on
 the Y axis. It looks like either the angleA or angleB is wrong, but I don't
 see and reason why it would be as the X coordinates does not change.

 Another thing I do not quite understand is what that patchB does.

     figure(1, figsize=(6,6))
     ax = axes([0.1, 0.1, 0.8, 0.8])

     labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
     fracs = [45, 135 ,1, 1]

     p = pie(fracs)

     foo = None
     for p1, l1 in zip(p[0], labels):

    r = p1.r
    dr = r*0.1
    t1, t2 = p1.theta1, p1.theta2
    theta = (t1+t2)/2.

    xc = cos(theta/180.*pi)*r
    yc = sin(theta/180.*pi)*r
    x1 = cos(theta/180.*pi)*(r+dr)
    y1 = sin(theta/180.*pi)*(r+dr)

    if x1  0 :
    x1 = r+2*dr
    ha, va = left, center
    cstyle=angle,angleA=180,angleB=%f%(-theta,)
    print  sys.stderr, ha, ,A,, va
    else:
    x1 = -(r+2*dr)
    ha, va = right, center
    cstyle=angle,angleA=0,angleB=%f%(theta,)
    print  sys.stderr, ha, ,B,, va

    if foo:
    if theta - foo  10:
    print sys.stderr, Overlapping, offsetting a little
 bit
    y1 = y1 + 0.1
    foo = theta

    annotate(l1,
     (xc, yc), xycoords=data,
     xytext=(x1, y1), textcoords=data, ha=ha, va=va,
     arrowprops=dict(arrowstyle=-,
     connectionstyle=cstyle,
     patchB=p1))

 - Rune

 2010/3/23 Jae-Joon Lee lee.j.j...@gmail.com

 This should be doable using the annotation. Here is a simple cook-up I
 just did. it uses a  naive algorithm to place the labels, but I guess
 it gives you an idea how things work.
 a screenshot is attached.

 Regards,

 -JJ


 from pylab import *

 # make a square figure and axes
 figure(1, figsize=(6,6))
 ax = axes([0.1, 0.1, 0.8, 0.8])

 labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
 fracs = [15,30,45, 10]

 explode=(0, 0.05, 0, 0)
 p = pie(fracs, explode=explode, shadow=True)
 title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5})

 for p1, l1 in zip(p[0], labels):
    r = p1.r
    dr = r*0.1
    t1, t2 = p1.theta1, p1.theta2
    theta = (t1+t2)/2.

    xc, yc = r/2.*cos(theta/180.*pi), r/2.*sin(theta/180.*pi)
    x1, y1 = (r+dr)*cos(theta/180.*pi), (r+dr)*sin(theta/180.*pi)
    if x1  0 :
        x1 = r+2*dr
        ha, va = left, center
        tt = -180
        cstyle=angle,angleA=0,angleB=%f%(theta,)
    else:
        x1 = -(r+2*dr)
        ha, va = right, center
        tt = 0
        cstyle=angle,angleA=0,angleB=%f%(theta,)

    annotate(l1,
             (xc, yc), xycoords=data,
             xytext=(x1, y1), textcoords=data, ha=ha, va=va,
             arrowprops=dict(arrowstyle=-,
                             connectionstyle=cstyle,
                             patchB=p1))

 show()


--
Download Intel#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


[Matplotlib-users] Overlapping labels in pie charts

2010-03-23 Thread Rune V . Sjøen
Hello,

I am having some issues generating pie charts, when some of the slices
become very small, their labels
will draw on top of each other, making it impossible to distinguish between
them. And I am trying to avoid using a legend.

Does anyone know if there is a way to properly position labels of pie charts
to avoid overlapping.
(By for example distributing them vertically with lines pointing to their
respective slices)

Similar to what is done here:

http://chart.apis.google.com/chart?cht=pchd=s:Uf9achs=250x100chl=January|February|March|April

--
Regards
Rune V. Sjoen
--
Download Intel#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users


Re: [Matplotlib-users] Overlapping labels in pie charts

2010-03-23 Thread Jae-Joon Lee
This should be doable using the annotation. Here is a simple cook-up I
just did. it uses a  naive algorithm to place the labels, but I guess
it gives you an idea how things work.
a screenshot is attached.

Regards,

-JJ


from pylab import *

# make a square figure and axes
figure(1, figsize=(6,6))
ax = axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15,30,45, 10]

explode=(0, 0.05, 0, 0)
p = pie(fracs, explode=explode, shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor':'0.8', 'pad':5})

for p1, l1 in zip(p[0], labels):
r = p1.r
dr = r*0.1
t1, t2 = p1.theta1, p1.theta2
theta = (t1+t2)/2.

xc, yc = r/2.*cos(theta/180.*pi), r/2.*sin(theta/180.*pi)
x1, y1 = (r+dr)*cos(theta/180.*pi), (r+dr)*sin(theta/180.*pi)
if x1  0 :
x1 = r+2*dr
ha, va = left, center
tt = -180
cstyle=angle,angleA=0,angleB=%f%(theta,)
else:
x1 = -(r+2*dr)
ha, va = right, center
tt = 0
cstyle=angle,angleA=0,angleB=%f%(theta,)

annotate(l1,
 (xc, yc), xycoords=data,
 xytext=(x1, y1), textcoords=data, ha=ha, va=va,
 arrowprops=dict(arrowstyle=-,
 connectionstyle=cstyle,
 patchB=p1))

show()
attachment: new_piechart.png--
Download Intel#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev___
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users