在Matplotlib中,如何将Imagedraw对象添加到PyPlot?

时间:2011-05-23 19:00:23

标签: image matplotlib

我需要为使用pyplot(plt)生成的预先存在的图像添加形状。我知道快速生成基本形状的最佳方法是使用Imagedraw的预定义形状。原始数据在line_holder和colorholder中具有相应颜色的点。我需要在绘图中添加一个边界框(或者在这种情况下是椭圆形),以便向用户显示数据是否在可接受的范围内。

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from PIL import Image
...
lines = LineCollection(mpl.line_holder, colors=mpl.colorholder , linestyle='solid')
plt.axes().add_collection(lines)
plt.axes().set_aspect('equal', 'datalim')
plt.axes().autoscale_view(True,True,True)
plt.draw()
plt.show()

我尝试在show()之前插入它:

image = Image.new('1',(int(ceil(disc/conv))+2,int(ceil(disc/conv))+1), 1)
draw = ImageDraw.Draw(image)
box=(1, 1, int(ceil(disc/conv)), int(ceil(disc/conv))) #create bounding box
draw.ellipse(box, 1, 0) #draw circle in black

但是我找不到将这个椭圆添加到pyplot的方法。有谁知道如何将图像组合在一起?如果无法将imagedraw对象添加到pyplot中,是否有很好的替代方法可以执行此类操作?

1 个答案:

答案 0 :(得分:4)

Matplotlib有几个看似满足您需求的补丁(形状)(并将PIL作为依赖项删除)。它们记录在案here。使用形状的有用示例是here

要在图中添加椭圆,首先要创建一个椭圆修补程序,然后将该修补程序添加到当前正在处理的轴上。请注意,如果纵横比不相等,Circle(或具有相等小半径的Ellipse)将显示为椭圆形。

在您的代码段中,您多次调用plt.axes()。这是不必要的,因为它只是返回当前轴对象。我认为保持轴对象并直接操作它更清楚,而不是通过plt.axes()重复获取相同的对象。至于你的代码片段中使用了axis(),gca()会做同样的事情。我脚本的结尾证明了这一点。

我还通过绘制一条线来替换你的add_collection()行。这些基本上做同样的事情,并允许我的代码段作为独立的脚本执行。

import matplotlib.pyplot as plt
import matplotlib as mpl

# set up your axes object
ax = plt.axes()
ax.set_aspect('equal', 'datalim')
ax.autoscale_view(True, True, True)

# adding a LineCollection is equivalent to plotting a line
# this will run as a stand alone script
x = range(10)
plt.plot( x, x, 'x-')

# add and ellipse to the axes
c = mpl.patches.Ellipse( (5, 5), 1, 6, angle=45)
ax.add_patch(c)

# you can get the current axes a few ways
ax2 = plt.axes()
c2 = mpl.patches.Ellipse( (7, 7), 1, 6, angle=-45, color='green')
ax2.add_patch(c2)

ax3 = plt.gca()
c3 = mpl.patches.Ellipse( (0, 2), 3, 3, color='black')
ax3.add_patch(c3)

print id(ax), id(ax2), id(ax3)

plt.show()