我使用Matplotlib生成散点图的PNG文件.现在,每个散点图,除了PNG文件,我也想在生成散点图中各点的像素坐标列表.
我用来为散点图生成PNG文件的代码基本上是这样的:
from matplotlib.figure import Figure
from matplotlib.pyplot import setp
from matplotlib.backends.backend_agg import FigureCanvasAgg
...
fig = Figure(figsize=(3, 3), dpi=100)
ax = fig.gca()
for (x, y), m, c in zip(points, markers, colors):
ax.scatter(x, y, marker=m, c=c, s=SIZE, vmin=VMIN, vmax=VMAX)
# several assorted tweaks like ax.spines['top'].set_color('none'), etc.
setp(fig, 'facecolor', 'none')
# FigureCanvasAgg(fig).print_png(FILEPATH)
Run Code Online (Sandbox Code Playgroud)
...(UPPERCASE中的变量代表可设置的参数).
我怎样才能(px, py)在结果PNG中产生一对像素坐标对应的点points?
[编辑:删除了一些废话imshow.]
[编辑:
好的,这是我最终提出的,基于Joe Kington的建议.
# continued from above...
cnvs = FigureCanvasAgg(fig)
fig.set_canvas(cnvs)
_, ht = cnvs.get_width_height()
pcoords = [(int(round(t[0])), int(round(ht - t[1]))) for t in
ax.transData.transform(points)]
fig.savefig(FILEPATH, dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)
得到的像素坐标(in pcoords)非常接近正确的值.事实上,y coords是完全正确的.x坐标是1或2像素关闭,这足以满足我的目的.
]
Joe*_*ton 12
这样做很简单,但是为了理解发生了什么,你需要阅读matplotlib的变换.该转换教程是一个良好的开端.
无论如何,这是一个例子:
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
points, = ax.plot(range(10), 'ro')
ax.axis([-1, 10, -1, 10])
# Get the x and y data and transform it into pixel coordinates
x, y = points.get_data()
xy_pixels = ax.transData.transform(np.vstack([x,y]).T)
xpix, ypix = xy_pixels.T
# In matplotlib, 0,0 is the lower left corner, whereas it's usually the upper
# right for most image software, so we'll flip the y-coords...
width, height = fig.canvas.get_width_height()
ypix = height - ypix
print 'Coordinates of the points in pixel coordinates...'
for xp, yp in zip(xpix, ypix):
print '{x:0.2f}\t{y:0.2f}'.format(x=xp, y=yp)
# We have to be sure to save the figure with it's current DPI
# (savfig overrides the DPI of the figure, by default)
fig.savefig('test.png', dpi=fig.dpi)
Run Code Online (Sandbox Code Playgroud)
这会产生:
Coordinates of the points in pixel coordinates...
125.09 397.09
170.18 362.18
215.27 327.27
260.36 292.36
305.45 257.45
350.55 222.55
395.64 187.64
440.73 152.73
485.82 117.82
530.91 82.91
Run Code Online (Sandbox Code Playgroud)
