解決Python 3 Matplotlib與Seaborn視覺化套件中文顯示問題
Windows 與Ubuntu User
套件整合與環境,對於初學者來說實為困擾,光為了安裝好套件包就扼殺了許多初學者的興趣,尤其是處理Python 3的套件安裝,更是一大難題。所以通常會介紹初學者Anaconda這個套件方便的幫大家解決基本的問題。當然如果有實力且資深一點的前輩就會建議你要自己搭建venv(Virtual Environment) ,做更好的編程環境管理。
恩…這主題跟行銷資料科學(MDS)有關係嗎?
「工欲善其事,必先利其器」,進行MDS 前,勢必先將程式工具快速且有效率的調整好,方不因「環境設置」而浪費時間。
所以本次文章便是要介紹一個會扼殺初學者興趣的「常見困擾」,那就是,
Python 3 各種視覺化圖表無法顯示中文的問題!
這雖然是個很常見的困擾,但由於網路上幾乎都是片段的解法,導致使用者特容易放棄。根據我們自身經驗統計,不熟悉的個人接案單位如果要「徹底」解決該問題通常要花上3–5小時的時間,而且通常是2人一同解決,半天時間就不見了;如果粗換算成金錢,通常就是千至萬元的營收。
所以與其讓自己花3–5小時、浪費破萬元損失且沒接案生產力的可能性,不如就來靜心閱讀我們「解決Python 3 Matplotlib與Seaborn視覺化套件中文顯示問題」的文章吧!
解決Python 3 視覺化套件中文顯示問題
本文就特別針對Windows 與 Ubuntu使用者來解決中文視覺化的顯示問題。
在 Python 上通常最常見的繪圖套件包就是Matplotlib。其他繪圖套件包的基礎也是以Matplotlib 為基礎作為改良,例如:Seaborn …等 。所以只要完成Matplotlib 設定基本上其他套件包的中文顯示設定也會迎刃而解!
其實,這個問題的最基本核心是「字體」問題。通常Anaconda 在安裝Matplotlib 的時候會順手幫你安裝一些字體,如:DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, sans-serif…等。但是這些字體本身是沒有內含中文字體的。所以每當要顯示中文時會去抓設定檔中預設的字體時,預設字體中沒有中文字型就只好噴框框給你拉。
解法有兩種:
1. 每次程式都,設定字體絕對路徑
在Matplotlib.font_manager 這個套件底下有個FontProperties 類別,可以指定fname 字體路徑就可以產生Matplotlib 指定字體的物件。官方也有是相似的範例檔、github text file。所以每個只要是有顯示中文的地方就都要加上fontproperties 這項參數,就可以顯示中文了。只是每一個標題都要設定其實非常麻煩,所以通常會建議還是用第二種方法設定好參數檔。
2. 設定rcParams 參數與matplotlibrc 設定檔
設定rcParams 參數是最常見的作法,如:官方解法,但該解法總是讓人搞不清楚到底有何字型可用,也不確定字形路徑在哪,所以非常混亂。實際上rcParams 預設的字體就是直接讀取matplotlibrc 的設定檔,如果沒有進行設定,那就是採用預設字型。
可先用以下程式碼找到目前字體路徑,確認目前是抓哪個字體:
a. 首先進入matplotlibrc 預設路徑
Windows Users:
C:\Users\您的使用者名稱\Anaconda3\Lib\site-packages\matplotlib\mpl-data
Ubuntu Users:
/home/您的使用者名稱/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/
或者可以使用以下程式碼去尋找設定檔路徑:
b. 用記事本開啟 matplotlibrc 設定檔
將font.family與font.serif註解(#)移除,並在font.serif後方加入Microsoft JhengHei,完整子句如下。
font.sans-serif : Microsoft JhengHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
c. 刪除.matplotlib快取資料夾
先到以下快取資料夾中,
Windows Users:
C:\Users\您的使用者名稱
Ubuntu Users:
/home/您的使用者名稱/.cache
然後刪除.matplotlib 資料夾,因為.matplotlib 資料夾裡面有舊有的matplotlib 快取(cache)檔案,為避免更新後的字體在讀取到舊的快取,所有要刪除。
d. 放入字體至matplotlib指定字體路徑
將msj文字檔(載點,為其他網友提供)下載,以msj命名之,在儲存到以下路徑資料夾 :
Windows Users:
C:\Users\您的使用者名稱\Anaconda3\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
Ubuntu Users:
/home/您的使用者名稱/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf
e. 使用rcParams 參數指定字體
開啟Python-IDE(本處使用Spyder當作操作IDE),執行下述程式:
顯示出中文~ 完成拉~
seaborn圖表如何顯示中文?
seaborn可以直接以絕對路徑指定msj.ttf檔案,可以執行下述程式碼:
亦或者您已經設定好matplotlib的中文路徑,就可以
刪除myfont=FontProperties(fname=r’C:\Users\使用者名稱\Desktop\msj.ttf’,size=14)將sns.set 改成 sns.set(font=[‘sans-serif’])
讀者可以直接執行下述程式碼:
顯示出中文~ 完成拉~
以上所有程式碼有放在以下github。
Q&A :如何查看現在matplotlib有存取的字體?
有時候檔名會跟字體名稱不一樣,而matplotlib 在rcParams 則是使用字體名稱做指定,可以使用以下程式碼收尋目前預設的字體。
Q&A :為什麼我沒有設定matplotlibrc, 我卻可以使用其他特殊字體呢?
通常是之前有放某個字體進入matplotlib的指定字體路徑,雖然沒有設定matplotlibrc還是有機會會吃到。但還是建議設定會比較好。
Q&A :Mac 也試用嗎?
邏輯都是一樣的,基本上可以。
Q&A :Ubuntu 用pip安裝的matplotlib也可以嗎?
完全可以,因為我有台電腦也是這樣安裝,完全可以執行喔。只是路徑要指到:
/usr/local/lib/python3.6/dist-packages/matplotlib/mpl-data/
或者可以直接使用下方程式碼找尋matplotlib路徑
Q&A :那要如何顯示表情圖案呢(emoji)?
網路上找到的解法,但經過我們測試中文跟表情圖案不能同時顯示哈~只要在後面加上 fontname=’symbola’參數就可以了~
作者:
林建興(臺灣行銷研究有限公司 技術長)
鍾皓軒(臺灣行銷研究有限公司 共同創辦人)
歡迎查看我們近期即將舉辦的課程資訊
您可能有興趣: