Matplotlib和非常多的情节

时间:2018-04-08 18:51:29

标签: python matplotlib

我目前正在尝试编写一个用作近似方法的程序。主要思想是在较大的几何对象中“挖洞”,例如填充圆,可以使用Matplotlib进行如下操作:

from numpy import *
import matplotlib.pyplot as plt

phi = linspace(0, 2*pi, 200)
plt.fill(cos(phi), sin(phi), 'black')

precision = 20
for j in xrange(20):
    for i in xrange(precision):
        plt.fill((cos(phi)+j*cos(i*2*pi/precision))/precision, (sin(phi)+j*sin(i*2*pi/precision))/precision, 'white')
plt.show()

这会生成一个漂亮的小图像,总共有1 + 20*precision = 401个“子图”,即圆圈。对于我的应用程序,我实际上需要几十亿或更多的这些,这可以理解地产生错误(没有足够的内存,因为Matplotlib在绘制后仍然保留所有绘图,如果我想保留最终结果,我无法清除它们)。因此,我尝试将绘图保存为图像并在迭代期间重新加载:

for j in xrange(20):
    for i in xrange(precision):
       plt.fill((cos(phi)+j*cos(i*2*pi/precision))/precision, (sin(phi)+j*sin(i*2*pi/precision))/precision, 'white')
    plt.axis("off")
    plt.savefig("temp.png", bbox_inches = 'tight', pad_inches=0)
    plt.close("all")
    im = plt.imread("temp.png")
    plt.imshow(im, extent = [-1.0, 1.0, -1.0, 1.0])

这几乎可以正常工作:图像被正确保存,但左侧和底部似乎总是有轻微的填充,这会破坏整个过程,就像在每一步中图像向右移动一样。

我尝试了一切可能的方法来删除这个填充,但我找不到解决方案了。我试图手动创建轴(因为我认为填充是由于标签留下的空间等),但这也失败了。

如果有人知道如何删除这个填充,我会非常高兴。

1 个答案:

答案 0 :(得分:0)

一种解决方案可能是裁剪图像。您可以按照here所述执行此操作。如果您确切知道边框有多大,可以像这样切割边框:

  import matplotlib.pyplot as plt
  import numpy as np
  from PIL import Image
  data = np.arange(3000).reshape((100,30))
  plt.imshow(data)
  plt.savefig('test.png', bbox_inches='tight')

  img = Image.open('test.png')
  width, height = img.size
  img2 = img.crop((35,15,width-8,height-35))
  img2.save('test2.png')

在这里,我发现35,15,8和35使用了反复试验。

导致此图片无边框:

No borders