2

次のコードを使用して、matplotlib で円グラフをプロットしています。

ax = axes([0.1, 0.1, 0.6, 0.6])
labels = 'Twice Daily', 'Daily', '3-4 times per week', 'Once per week','Occasionally'
fracs = [20,50,10,10,10]

explode=(0, 0, 0, 0,0.1)
patches, texts, autotexts = ax.pie(fracs, labels=labels, explode = explode,         
                             autopct='%1.1f%%', shadow =True)
proptease = fm.FontProperties()
proptease.set_size('xx-small')
setp(autotexts, fontproperties=proptease)
setp(texts, fontproperties=proptease)
rcParams['legend.fontsize'] = 7.0
savefig("pie1")

これにより、次の円グラフが生成されます。 円グラフ 1

ただし、最初のウェッジを上にして円グラフを開始したいのですが、これに対して見つけることができた唯一の解決策は、このコードを使用することでした

ただし、これを以下のように使用すると、

from pylab import *
from matplotlib import font_manager as fm
from matplotlib.transforms import Affine2D
from matplotlib.patches import Circle, Wedge, Polygon
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)

labels = 'Twice Daily', 'Daily', '3-4 times per week', 'Once per week','Occasionally'
fracs = [20,50,10,10,10]

 wedges, plt_labels = ax.pie(fracs, labels=labels)
 ax.axis('equal')

 starting_angle = 90
 rotation = Affine2D().rotate(np.radians(starting_angle))

for wedge, label in zip(wedges, plt_labels):
  label.set_position(rotation.transform(label.get_position()))
  if label._x > 0:
    label.set_horizontalalignment('left')
  else:
    label.set_horizontalalignment('right')

  wedge._path = wedge._path.transformed(rotation)

plt.savefig("pie2")

これにより、次の円グラフが生成されます

ここに画像の説明を入力

ただし、これは前の円グラフのようにウェッジに分数を出力しません。いくつかの異なることを試しましたが、フラックスを保存できません。正午に最初のウェッジを開始し、ウェッジにもフラックスを表示するにはどうすればよいですか??

4

1 に答える 1

2

通常、ツールのソースを変更することはお勧めしませんが、これを外部で修正し、内部で簡単に修正するのはハッキーです。したがって、Right Now(tm) を機能させるためにこれが必要な場合は、次のようにします。

ファイルmatplotlib/axes.pyで、パイ関数の宣言を次のように変更します。

def pie(self, x, explode=None, labels=None, colors=None,
        autopct=None, pctdistance=0.6, shadow=False,
        labeldistance=1.1, start_angle=None):

start_angle=Noneつまり、単に引数の最後に追加します。

次に、「# 追加」で囲まれた 5 行を追加します。

    for frac, label, expl in cbook.safezip(x,labels, explode):
        x, y = center
        theta2 = theta1 + frac
        thetam = 2*math.pi*0.5*(theta1+theta2)

        # addition begins here
        if start_angle is not None and i == 0:
            dtheta = (thetam - start_angle)/(2*math.pi)
            theta1 -= dtheta
            theta2 -= dtheta
            thetam = start_angle
        # addition ends here

        x += expl*math.cos(thetam)
        y += expl*math.sin(thetam)

次に、start_angle が None の場合は何も起こりませんが、start_angle に値がある場合、それが最初のスライス (この場合は 20%) の中心となる位置です。例えば、

patches, texts, autotexts = ax.pie(fracs, labels=labels, explode = explode,         
                             autopct='%1.1f%%', shadow =True, start_angle=0.75*pi)

生産する

ここに画像の説明を入力

一般に、ソースにパッチを適用することは避けるべきであることに注意してください.

于 2012-02-10T01:23:37.337 に答える