如何将matplotlib路径对象转换为位图?

4 投票
1 回答
1050 浏览
提问于 2025-04-18 10:10

我有一个matplotlib.path.Path对象。我该如何将它渲染成位图(或者说是带有颜色值的数组)呢?

我想我得用后端/渲染器来绘制这个对象,但我该怎么做呢?

编辑:

大多数matplotlib可以绘制的对象(比如标记、坐标轴等)都是矢量格式的。这些对象都是Path的子类。我想把它们渲染成位图,换句话说就是光栅化它们。

举个例子:我画了一个圆形标记'bo'。我需要做什么才能得到一个圆形标记的位图呢?我不能仅仅画一个圆并把它涂成蓝色。我想从一个图中获取任何标记,并得到它的位图。就是那个标记,带着正确的颜色、形状和大小,以及所有其他属性。而且图中不应该有背景、前景或其他任何元素。这种情况类似于图例是如何绘制它的符号的。我该怎么做呢?

1 个回答

2

这里有一个小技巧可以让它工作。基本上,你需要先创建一个空的图形,然后把路径画到这个画布的中心。接着,把这个画布转成字符串。最后,找到这个图形的中心。我会先用这个方法,直到有更好的解决方案出现。下面的代码中,X是一个包含栅格化符号的数组。下面是一个显示栅格化符号的图。rasterized symbol

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure
import numpy
import pylab

# create figure and draw symbol with three points
fig = Figure(figsize=(5,4), dpi=600)
ax = fig.add_subplot(111)
ax.plot([0,1,2],[0,0,0], '-o', mec='b', mfc='g')

# get canvas, draw and get as string
canvas = FigureCanvasAgg(fig)
canvas.draw()
s = canvas.tostring_rgb()  

# convert to array
l,b,w,h = fig.bbox.bounds
w, h = int(w), int(h)
X = numpy.fromstring(s, numpy.uint8)
X.shape = h, w, 3

# plot only the center as bitmap
pylab.imshow(X[h/2-50:h/2+50, w/2-0:w/2+80,:])
pylab.show()

撰写回答