我一直试图制作一个二维直方图,但是在savefig中一直出现错误。在hist2d中使用不等大小的bin时,似乎只会出现错误。 有没有人有任何见解?
这是一个复制错误的简单代码:
import matplotlib.pyplot as plt
import numpy as np
# This works...
fig1, ax1 = plt.subplots(figsize=(8,5))
x = np.random.randn(100000)
y = np.random.randn(100000)+5
h=ax1.hist2d(x,y,bins=([0,1,2,3],(2,3,4,5,6)))
fig1.savefig('test.pdf', bbox_inches='tight')
plt.close()
# This fails...(note unequal bin sizes)
fig1, ax1 = plt.subplots(figsize=(8,5))
x = np.random.randn(100000)
y = np.random.randn(100000)+5
h=ax1.hist2d(x,y,bins=([0,1,2,3],(2,3,5,6)))
fig1.savefig('test2.pdf', bbox_inches='tight')
plt.close()
我得到的错误信息在这里:
Traceback (most recent call last):
File "unequal_bins.py", line 15, in <module>
fig1.savefig('test.pdf', bbox_inches='tight')
File "/Users/earpwl/anaconda/lib/python3.5/site-packages/matplotlib/figure.py", line 1573, in savefig
self.canvas.print_figure(*args, **kwargs)
File "/Users/earpwl/anaconda/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 2210, in print_figure
bbox = a.get_window_extent(renderer)
File "/Users/earpwl/anaconda/lib/python3.5/site-packages/matplotlib/image.py", line 757, in get_window_extent
x0, x1, y0, y1 = self._extent
TypeError: 'NoneType' object is not iterable
答案 0 :(得分:0)
这是一个known issue,其中matplotlib&lt; = 2.1.0。
解决方案是将bbox_inches='tight'
参数省略为savefig
,或者如该问题所述,添加
h[-1].set_extent(h[-1].get_extent())
完整的解决方案:
import matplotlib.pyplot as plt
import numpy as np
fig1, ax1 = plt.subplots()
x = np.random.randn(100000)
y = np.random.randn(100000)+5
h=ax1.hist2d(x,y,bins=[[0,1,2,3],[2,3,5,6]])
h[-1].set_extent(h[-1].get_extent())
fig1.savefig('test2.pdf', bbox_inches='tight')
plt.close()
将matplotlib更新到最新版本当然也是一种选择。 ; - )