2017-06-13 7 views
2

私はpython 3.5.2を使用しています png画像を埋め込んだ円グラフを作りたいと思います。私はスライスに挿入したい特定のバルク製品の写真を持っています。たとえば、あるスライスのイチゴと別のスライスのラズベリー。写真のようなものがhttp://www.python-course.eu/images/pie_chart_with_raspberries.pngです。画像を円グラフに挿入

私は画像を生成し、ここでもMatplotlib: How to plot images instead of points?

実証されたように、画像の代わりに点をプロットすることができますしかし、私は私が提案しています何に向けた任意のアプローチを見つけることができませんでした。私はペイントで手作業で行うことができると思いますが、私はそれを避けようとしていました。確認可能です

答えて

4

enter image description here

。通常はpie chartから始めることができます。それから私たちはプロットに画像を取得する必要があります。これは、plt.imreadを使用し、matplotlib.offsetbox.OffsetImageを使用して行われます。画像を配置するためには、それぞれの円弧と完全に重なり合うように、適切な座標とズームレベルを見つける必要があります。次に、ウェッジの内側の部分だけが残るように、パイのウェッジのパスが画像のclip pathとして使用されます。塗りつぶされていないくさびのzorderを高い数値に設定すると、境界が画像の上に配置されます。このようにして、ウェッジがイメージで満たされているように見えます。

import matplotlib.pyplot as plt 
from matplotlib.patches import PathPatch 
from matplotlib.offsetbox import OffsetImage, AnnotationBbox 

total = [5,7,4] 
labels = ["Raspberries", "Blueberries", "Blackberries"] 
plt.title('Berries') 
plt.gca().axis("equal") 
wedges, texts = plt.pie(total, startangle=90, labels=labels, 
         wedgeprops = { 'linewidth': 2, "edgecolor" :"k","fill":False, }) 


def img_to_pie(fn, wedge, xy, zoom=1, ax = None): 
    if ax==None: ax=plt.gca() 
    im = plt.imread(fn, format='png') 
    path = wedge.get_path() 
    patch = PathPatch(path, facecolor='none') 
    ax.add_patch(patch) 
    imagebox = OffsetImage(im, zoom=zoom, clip_path=patch, zorder=-10) 
    ab = AnnotationBbox(imagebox, xy, xycoords='data', pad=0, frameon=False) 
    ax.add_artist(ab) 

positions = [(-1,0.3),(0,-0.5),(0.5,0.5)] 
zooms = [0.4,0.4,0.4] 

for i in range(3): 
    fn = "data/{}.png".format(labels[i].lower()) 
    img_to_pie(fn, wedges[i], xy=positions[i], zoom=zooms[i]) 
    wedges[i].set_zorder(10) 

plt.show() 
+1

ありがとう。できます。私はそれを理解するために少し時間を費やす必要があるが、私はそれを働かせた。もう一度ありがとう、私はこれに長い時間を費やし、私は尋ねることにしました。私はこれを完全に作動させようとします。投票には十分な評判はないが、投票に値する。 – CJD