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

在Matplotlib中,如何将Imagedraw对象添加到PyPlot?,image,matplotlib,Image,Matplotlib,我需要向使用pyplot(plt)生成的现有图像添加一个形状。我所知道的快速生成基本形状的最佳方法是使用Imagedraw的预定义形状。原始数据在第_holder和colorholder行中具有具有相应颜色的点。我需要在绘图中添加一个边界框(或者在本例中是椭圆),以便用户清楚地知道数据是否在可接受的范围内 import matplotlib.pyplot as plt from matplotlib.collections import LineCollection from PIL impor

我需要向使用pyplot(plt)生成的现有图像添加一个形状。我所知道的快速生成基本形状的最佳方法是使用Imagedraw的预定义形状。原始数据在第_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()
我试着在演出前插入这个()


但是我找不到一种方法把这个椭圆添加到pyplot中。有人知道如何把这些图像组合起来吗?如果无法将imagedraw对象添加到pyplot中,是否有执行此类型操作的好方法?

Matplotlib有几个补丁(形状)可以满足您的需要(并将PIL作为依赖项删除)。它们被记录在案。下面是一个使用形状的有用示例

要将椭圆添加到绘图,首先创建椭圆面片,然后将该面片添加到当前正在处理的轴。请注意,如果长宽比不相等,则圆(或具有相同小半径的椭圆)将显示为椭圆

在代码段中,您多次调用plt.axes()。这是不必要的,因为它只是返回当前轴对象。我认为保留Axis对象并直接对其进行操作比通过plt.axes()重复获取相同的对象更清晰。在代码段中使用axes()时,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()

Matplotlib有几个补丁(形状)可以满足您的需要(并将PIL作为依赖项删除)。它们被记录在案。下面是一个使用形状的有用示例

要将椭圆添加到绘图,首先创建椭圆面片,然后将该面片添加到当前正在处理的轴。请注意,如果长宽比不相等,则圆(或具有相同小半径的椭圆)将显示为椭圆

在代码段中,您多次调用plt.axes()。这是不必要的,因为它只是返回当前轴对象。我认为保留Axis对象并直接对其进行操作比通过plt.axes()重复获取相同的对象更清晰。在代码段中使用axes()时,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()

你能邮寄你的进口商品吗?很高兴看到所有东西都是从哪里来的。你能发布你的导入吗?如果能看到一切都来自何方,那就太好了。plt不是pylab。我的错,我没有包括上面的进口。现在我已经添加了它们。对于axes()、draw()和plot()来说,pylab和matplotlib.pyplot是相同的。为了更清楚,我已经更新了我的代码片段,使用mpl.pyplot。这和我写的不太一样。修补程序需要是一个可选功能,稍后添加。以上述代码为例,在plt.plot()之后调用show(),然后需要将补丁放在用户请求时生成的绘图上。此外,绘图的边界需要移动,以便补丁完全可见。要在渲染后修改绘图,您需要添加一个回调函数来进行修改()。别忘了用fig.canvas.draw()重新渲染plt不是pylab。我的错,我没有包括上面的进口。现在我已经添加了它们。对于axes()、draw()和plot()来说,pylab和matplotlib.pyplot是相同的。为了更清楚,我已经更新了我的代码片段,使用mpl.pyplot。这和我写的不太一样。修补程序需要是一个可选功能,稍后添加。以上述代码为例,在plt.plot()之后调用show(),然后需要将补丁放在用户请求时生成的绘图上。此外,绘图的边界需要移动,以便补丁完全可见。要在渲染后修改绘图,您需要添加一个回调函数来进行修改()。不要忘记使用fig.canvas.draw()重新渲染