在 matplotlib-basemap 图像上设置注释会导致无法撤消的 width/height 错误
Setting annotations on matplotlib-basemap image causes a width/height error that cannot be undone
我在底图上绘制注释并将图像保存到文件时遇到问题。我之前已经多次看到这个问题,但在我的情况下,遵循建议并没有奏效,然后即使将代码反转回没有注释的先前工作版本,错误仍然存在。
基本上,在没有注释的情况下,该图已经绘制了数周没有问题。现在,如果我向图表添加大约 130 个注释,我将得到:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:\Users\Joshua\Canopy\scripts\Client Model\nicoleheatmap3.py in <module>()
251 '''
252 #plt.show()
--> 253 plt.savefig('Demand_map.png',bbox_inches="tight",figsize=(800/96, 800/96),dpi=1600)
254 plt.close()
255
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\pyplot.pyc in savefig(*args, **kwargs)
575 def savefig(*args, **kwargs):
576 fig = gcf()
--> 577 res = fig.savefig(*args, **kwargs)
578 draw() # need this if 'transparent=True' to reset colors
579 return res
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\figure.pyc in savefig(self, *args, **kwargs)
1474 self.set_frameon(frameon)
1475
-> 1476 self.canvas.print_figure(*args, **kwargs)
1477
1478 if frameon:
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_qt5agg.pyc in print_figure(self, *args, **kwargs)
159
160 def print_figure(self, *args, **kwargs):
--> 161 FigureCanvasAgg.print_figure(self, *args, **kwargs)
162 self.draw()
163
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
2209 orientation=orientation,
2210 bbox_inches_restore=_bbox_inches_restore,
-> 2211 **kwargs)
2212 finally:
2213 if bbox_inches and restore_bbox:
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)
519
520 def print_png(self, filename_or_obj, *args, **kwargs):
--> 521 FigureCanvasAgg.draw(self)
522 renderer = self.get_renderer()
523 original_dpi = renderer.dpi
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in draw(self)
462 if __debug__: verbose.report('FigureCanvasAgg.draw', 'debug-annoying')
463
--> 464 self.renderer = self.get_renderer(cleared=True)
465 # acquire a lock on the shared font cache
466 RendererAgg.lock.acquire()
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in get_renderer(self, cleared)
479
480 if need_new_renderer:
--> 481 self.renderer = RendererAgg(w, h, self.figure.dpi)
482 self._lastKey = key
483 elif cleared:
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in __init__(self, width, height, dpi)
92 self.height = height
93 if __debug__: verbose.report('RendererAgg.__init__ width=%s, height=%s'%(width, height), 'debug-annoying')
---> 94 self._renderer = _RendererAgg(int(width), int(height), dpi, debug=False)
95 self._filter_renderers = []
96
ValueError: width and height must each be below 32768
所以我的第一个想法是我迭代添加注释的方式有问题(我之前有其他错误试图给它一个数组),所以散列代码,即回到我的旧代码库,问题依旧。我在 Enthought Canopy 中重新启动内核,它又很高兴,然后添加注释再次破坏它,直到内核重新启动。
这是代码:
m = Basemap(projection='merc',llcrnrlon=53.898184,llcrnrlat=24.019957,urcrnrlon=56.721985,urcrnrlat=26.076649,lon_0=55.545,lat_0=24.735,resolution='i')
base_image = plt.imread("UAEpeninsulagrey.jpg")
implot = plt.imshow(base_image)
m.imshow(base_image,origin='upper')
a,b = m(preparePlot[1],preparePlot[0])
m.scatter(a,b,marker="o",s=preparePlot[2],color="#0000FF",alpha=0.5,)
c,d = m(preparePlot[4],preparePlot[3])
m.scatter(c,d,marker="o",s=6,color="#FF0000",alpha=0.5,)
'''
for t in range(len(annotations[0])):
x,y = m(annotations[1][t],annotations[0][t])
x2,y2 = m(annotations[4][t],annotations[3][t])
plt.annotate(annotations[2][t],xy=(x,y),xytext=(x2,y2),arrowprops=dict(facecolor='black', shrink=0.05),fontsize=2)
'''
#plt.show()
plt.savefig('Demand_map.png',bbox_inches="tight",figsize=(800/96, 800/96),dpi=1600)
plt.close()
其他一些奇怪的事情。我相信我在限制 plt.savefig
中已经存在的宽度和高度方面是明确且正确的(取自以前的 SO 线程,例如 this )这不应该发生吗?此外,plt.show()
不会引发错误。我需要高分辨率才能在街道级别放大地图。我已经能够毫无问题地在图像上获得单个注释,甚至是地图区域之外的位置的注释,我认为这可能导致它尝试显示图像之外的东西。
将 DPI 设置为 200 并不能消除错误。重命名 annotations
数组没有任何区别(以防它以某种方式导致底图内部问题)。
有人对如何阻止它有任何建议吗?我是否在 plt.savefig
中设置错误?提前谢谢了。
P.S。注释数组:
annotations[0][0]
Out[14]: 26.053275624999998
annotations[1][0]
Out[15]: 56.068128225
annotations[2][0]
Out[16]: 'Tot: 1, 0%'
annotations[3][0]
Out[17]: 26.043275624999996
annotations[4][0]
Out[18]: 56.058128225000004
几个小时后,我发现它与 bbox_inches="tight"
有冲突,当标签稍微倾斜以超出原始图片的框架时(这是因为我的lat/long 标签位置的偏移量)。我不确定错误消息是否对问题的根本原因提供了任何有意义的反馈:(
我在底图上绘制注释并将图像保存到文件时遇到问题。我之前已经多次看到这个问题,但在我的情况下,遵循建议并没有奏效,然后即使将代码反转回没有注释的先前工作版本,错误仍然存在。
基本上,在没有注释的情况下,该图已经绘制了数周没有问题。现在,如果我向图表添加大约 130 个注释,我将得到:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:\Users\Joshua\Canopy\scripts\Client Model\nicoleheatmap3.py in <module>()
251 '''
252 #plt.show()
--> 253 plt.savefig('Demand_map.png',bbox_inches="tight",figsize=(800/96, 800/96),dpi=1600)
254 plt.close()
255
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\pyplot.pyc in savefig(*args, **kwargs)
575 def savefig(*args, **kwargs):
576 fig = gcf()
--> 577 res = fig.savefig(*args, **kwargs)
578 draw() # need this if 'transparent=True' to reset colors
579 return res
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\figure.pyc in savefig(self, *args, **kwargs)
1474 self.set_frameon(frameon)
1475
-> 1476 self.canvas.print_figure(*args, **kwargs)
1477
1478 if frameon:
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_qt5agg.pyc in print_figure(self, *args, **kwargs)
159
160 def print_figure(self, *args, **kwargs):
--> 161 FigureCanvasAgg.print_figure(self, *args, **kwargs)
162 self.draw()
163
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backend_bases.pyc in print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, **kwargs)
2209 orientation=orientation,
2210 bbox_inches_restore=_bbox_inches_restore,
-> 2211 **kwargs)
2212 finally:
2213 if bbox_inches and restore_bbox:
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in print_png(self, filename_or_obj, *args, **kwargs)
519
520 def print_png(self, filename_or_obj, *args, **kwargs):
--> 521 FigureCanvasAgg.draw(self)
522 renderer = self.get_renderer()
523 original_dpi = renderer.dpi
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in draw(self)
462 if __debug__: verbose.report('FigureCanvasAgg.draw', 'debug-annoying')
463
--> 464 self.renderer = self.get_renderer(cleared=True)
465 # acquire a lock on the shared font cache
466 RendererAgg.lock.acquire()
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in get_renderer(self, cleared)
479
480 if need_new_renderer:
--> 481 self.renderer = RendererAgg(w, h, self.figure.dpi)
482 self._lastKey = key
483 elif cleared:
C:\Users\Joshua\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\backends\backend_agg.pyc in __init__(self, width, height, dpi)
92 self.height = height
93 if __debug__: verbose.report('RendererAgg.__init__ width=%s, height=%s'%(width, height), 'debug-annoying')
---> 94 self._renderer = _RendererAgg(int(width), int(height), dpi, debug=False)
95 self._filter_renderers = []
96
ValueError: width and height must each be below 32768
所以我的第一个想法是我迭代添加注释的方式有问题(我之前有其他错误试图给它一个数组),所以散列代码,即回到我的旧代码库,问题依旧。我在 Enthought Canopy 中重新启动内核,它又很高兴,然后添加注释再次破坏它,直到内核重新启动。
这是代码:
m = Basemap(projection='merc',llcrnrlon=53.898184,llcrnrlat=24.019957,urcrnrlon=56.721985,urcrnrlat=26.076649,lon_0=55.545,lat_0=24.735,resolution='i')
base_image = plt.imread("UAEpeninsulagrey.jpg")
implot = plt.imshow(base_image)
m.imshow(base_image,origin='upper')
a,b = m(preparePlot[1],preparePlot[0])
m.scatter(a,b,marker="o",s=preparePlot[2],color="#0000FF",alpha=0.5,)
c,d = m(preparePlot[4],preparePlot[3])
m.scatter(c,d,marker="o",s=6,color="#FF0000",alpha=0.5,)
'''
for t in range(len(annotations[0])):
x,y = m(annotations[1][t],annotations[0][t])
x2,y2 = m(annotations[4][t],annotations[3][t])
plt.annotate(annotations[2][t],xy=(x,y),xytext=(x2,y2),arrowprops=dict(facecolor='black', shrink=0.05),fontsize=2)
'''
#plt.show()
plt.savefig('Demand_map.png',bbox_inches="tight",figsize=(800/96, 800/96),dpi=1600)
plt.close()
其他一些奇怪的事情。我相信我在限制 plt.savefig
中已经存在的宽度和高度方面是明确且正确的(取自以前的 SO 线程,例如 this )这不应该发生吗?此外,plt.show()
不会引发错误。我需要高分辨率才能在街道级别放大地图。我已经能够毫无问题地在图像上获得单个注释,甚至是地图区域之外的位置的注释,我认为这可能导致它尝试显示图像之外的东西。
将 DPI 设置为 200 并不能消除错误。重命名 annotations
数组没有任何区别(以防它以某种方式导致底图内部问题)。
有人对如何阻止它有任何建议吗?我是否在 plt.savefig
中设置错误?提前谢谢了。
P.S。注释数组:
annotations[0][0]
Out[14]: 26.053275624999998
annotations[1][0]
Out[15]: 56.068128225
annotations[2][0]
Out[16]: 'Tot: 1, 0%'
annotations[3][0]
Out[17]: 26.043275624999996
annotations[4][0]
Out[18]: 56.058128225000004
几个小时后,我发现它与 bbox_inches="tight"
有冲突,当标签稍微倾斜以超出原始图片的框架时(这是因为我的lat/long 标签位置的偏移量)。我不确定错误消息是否对问题的根本原因提供了任何有意义的反馈:(