为了账号安全,请及时绑定邮箱和手机立即绑定

将 matplotlib 图形转换为相同形状的 numpy 数组

将 matplotlib 图形转换为相同形状的 numpy 数组

MM们 2022-01-11 16:46:56
我有一个 256x256 的图像,我希望能够通过这些点绘制一条回归线。为此,我将图像转换为散点图,然后尝试将散点图转换回 numpy 数组。但是,转换回 numpy 数组会使 numpy 数组变为 480x640。谁能向我解释为什么形状会发生变化,主要是为什么它不再是方形图像,以及是否有任何转换可以修复它?从二进制图像制作我的 x 和 y 点imagetile = a[2]x, y = np.where(imagetile>0)imagetile.shape输出:(256L,256L)版本 1from numpy import polyfitfrom numpy import polyvalimagetile = a[2]x, y = np.where(imagetile>0)from numpy import polyfitfrom numpy import polyvalp2 = polyfit(x, y, 2)fig = plt.figure()ax = fig.add_axes([0.,0.,1.,1.])xp = np.linspace(0, 256, 256)plt.scatter(x, y)plt.xlim(0,256)plt.ylim(0,256)plt.plot(xp, polyval(p2, xp), "b-")plt.show()fig.canvas.draw()X = np.array(fig.canvas.renderer._renderer)X.shape输出:(480L、640L、4L)版本 2def fig2data ( fig ):    """    @brief Convert a Matplotlib figure to a 4D numpy array with RGBA channels and return it    @param fig a matplotlib figure    @return a numpy 3D array of RGBA values    """    # draw the renderer    fig.canvas.draw ( )     # Get the RGBA buffer from the figure    w,h = fig.canvas.get_width_height()    buf = np.fromstring ( fig.canvas.tostring_argb(), dtype=np.uint8 )    buf.shape = ( w, h,4 )     # canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to have it in RGBA mode    buf = np.roll ( buf, 3, axis = 2 )    return buffigure = matplotlib.pyplot.figure(  )plot   = figure.add_subplot ( 111 ) x, y = np.where(imagetile>0)p2 = polyfit(x, y, 2)plt.scatter(x, y)plt.xlim(0,256)plt.ylim(0,256)plt.plot(xp, polyval(p2, xp), "b-")data = fig2data(figure)data.shape输出:(640L、480L、4L)谢谢
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

如果您在不设置参数 figsize 的情况下调用matplotlib.pyplot.figure,它将采用默认形状(引用自文档):


figsize : (float, float),可选,默认值:无 宽度,高度,以英寸为单位。如果未提供,则默认为 rcParams["figure.figsize"] = [6.4, 4.8]。


所以,你可以通过这样做来设置形状


matplotlib.pyplot.figure(figsize=(2.56,2.56))

不知道您的数据是什么样的,我认为您的方法相当迂回,所以,我建议这样:


import numpy as np

import matplotlib.pyplot as plt


# generating simulated polynomial data:

arr = np.zeros((256, 256))

par = [((a-128)**2, a) for a in range(256)]

par = [p for p in par if p[0]<255]

arr[zip(*par)] = 1


x, y = np.where(arr>0)

p2 = np.polyfit(y, x, 2)

xp = np.linspace(0,256,256)


plt.imshow(arr) # show the image, rather than the conversion to datapoints


p = np.poly1d(p2) # recommended in the documentation for np.polyfit


plt.plot(xp, p(xp))


plt.ylim(0,256)

plt.xlim(0,256)


plt.show()


查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信