Matplotlib: Max OSX系統上pyplot.show()無法顯示圖片問題分析

劉近光發表於2018-12-08

問題描述

環境配置:系統執行Max OSX 10.14.1版本,Anaconda的Python版本為3.6.5,控制檯使用的iTerm2。
需要用matplotlib繪製披薩尺寸與價格關係圖片,程式碼非常簡單:

import matplotlib

import matplotlib.pyplot as plt

x = [[6], [8], [10], [14], [18]]
y = [[7], [9], [13], [17.5], [18]]

plt.figure()
plt.title('Pizza price plotted against diameter')
plt.xlabel('Diameter in inches')
plt.ylabel('Price in dollars')
plt.plot(x, y, 'k.')
plt.axis([0, 25, 0, 25])
plt.grid(True)
plt.show()

通過執行下面的程式碼,應該可以繪製出下列的關於披薩尺寸與價格的關係圖:
在這裡插入圖片描述
在iTerm2終端上執行該指令碼時,發現上述圖框並沒有繪製出來。

問題排查

經過一番排查後發現,使用matplotlib的get_backend()函式獲取iTerm2終端上使用的backend後端為MacOSX,是否該後端有什麼特殊之處呢?為做對比,將後端更換為TkAgg,相應的模組匯入程式碼修改如下:

import matplotlib
matplotlib.use('TkAgg')

import matplotlib.pyplot as plt

更換後端後,繪圖功能變能正常繪製了。這裡需要提醒一點的是,更換後端的命令必須在匯入pylot模組之前使用方能生效。
macosx後端本身是支援GUI繪製的,導致這個問題的根本原因是什麼呢?作者的習慣是一定要挖到root cause,並給出一個比較make sense的解釋。最終在官網上,找到了https://matplotlib.org/faq/usage_faq.html關於maxosx後端的描述:
在這裡插入圖片描述
從對maxosx後端描述上看,在非互動模式下,現在不能夠阻止show()。這就是根本原因啊。換成了系統自帶的互動模式的終端,發現這個問題並不存在。

相關文章