解決Python 3 Matplotlib與Seaborn視覺化套件中文顯示問題

Windows 與Ubuntu User

行銷資料科學
Marketingdatascience
11 min readJun 19, 2018

--

套件整合與環境,對於初學者來說實為困擾,光為了安裝好套件包就扼殺了許多初學者的興趣,尤其是處理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 的設定檔,如果沒有進行設定,那就是採用預設字型。

可先用以下程式碼找到目前字體路徑,確認目前是抓哪個字體:

在Windows 上查詢字體路徑結果,Ubuntu 也適用

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/
在Windows matplotlibrc設定檔目錄

或者可以使用以下程式碼去尋找設定檔路徑:

在Windows 上查詢字體設定檔結果,Ubuntu 也適用

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路徑

圖、matplotlib預設字體路徑

Q&A :那要如何顯示表情圖案呢(emoji)?

網路上找到的解法,但經過我們測試中文跟表情圖案不能同時顯示哈~只要在後面加上 fontname=’symbola’參數就可以了~

表情圖案測試

作者:

林建興(臺灣行銷研究有限公司 技術長)
鍾皓軒(臺灣行銷研究有限公司 共同創辦人)

歡迎加入我們的Line@獲取即時訊息!https://line.me/R/ti/p/%40cde8265r

歡迎查看我們近期即將舉辦的課程資訊

您可能有興趣:

參考來源:

--

--

行銷資料科學
Marketingdatascience

Marketing data science. 台灣第一個行銷資料科學(MDS)知識部落,本粉絲專頁在探討行銷資料科學之基礎概念、趨勢、新工具和實作,讓粉絲們瞭解資料科學的行銷運用,並開啟厚植數據分析能力之契機。粉絲專頁:https://www.facebook.com/MarketingDataScienceTMR