将图像插入饼图切片

时间:2017-06-13 17:31:50

标签: python image matplotlib python-imaging-library

我正在使用python 3.5.2 我想制作一个嵌入了png图像的饼图。我有一些我希望插入切片的批量产品的图片。例如,一片中的草莓和另一片中的覆盆子。与图片http://www.python-course.eu/images/pie_chart_with_raspberries.png显示的非常相似。

我可以生成图像,甚至可以绘制图像而不是点,如Matplotlib: How to plot images instead of points?

所示

然而,我找不到任何方法来解决我的建议。我想它可以在油漆中手动完成,但我试图避免这种情况。

1 个答案:

答案 0 :(得分:5)

HTML Publisher Plugin

这肯定是可能的。我们可以从正常enter image description here开始。然后我们需要将图像放入图中。这是使用plt.imread并使用pie chart完成的。我们需要找到良好的坐标和缩放级别来放置图像,使其与相应的饼形楔形完全重叠。然后,饼图的楔形路径用作图像的matplotlib.offsetbox.OffsetImage,这样只留下楔形内部的部分。将未填充的楔形的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()