Python 板


LINE

回應這個考古題一下 關於matplotlib顯示中文的問題 引言中與其推文的大大們都提供了不錯的解法 主要包含 詳細檔案的設定 與 pip install 兩種方式 之前我也是一直用prop fontproperties等等在製圖中一個個去處理中文問題 非常不方便 最近我以研究與練習的角度完成了「matplotlib-taiwan-font」 來跟大家推廣一下 用法上跟Hsins大大(本篇引文)幾乎一樣 但我只包了台北黑體 實作上沒有想太多 只希望能秀出中文而已 目前的安裝方式(要有git…) pip install git+https://gitlab.com/scku208/matplotlib-taiwan-font 如果想用 pip install mpltw 請跟我說 有一個人附議我就回憶一下上傳pypi的方法(還是有志者願意代勞? (最)簡易的使用範例 from mpltw import plt plt.plot([1,2,3]) plt.title('直接用中文') plt.show() 詳細(其實也還好) 還請參考模組網址 https://gitlab.com/scku208/matplotlib-taiwan-font 本模組使用台灣製造的MIT LICENSE 歡迎直接拿去用(code其實只有10行左右...) 有任何安裝或使用的問題 也歡迎任何方式的討論 我要去畫圖啦~ 謝謝大家 ※ 引述《Hsins (迅雷不及掩耳盜鈴)》之銘言: : tl;dr : 長話短說,我弄了個套件只要 import 就能夠將思源繁中字體的三個常見字重和 : cwTeX 開源字體設定好,額外設定也不難。 : https://github.com/Hsins/mpl-tc-fonts : 有興趣的可以慢慢看一下下面的內容,反正我禮拜一晚上追了一下,發現很多人 : 會隨便亂設定跟書上亂講是有情有可原的,並沒有想像中容易。 : ---- : 上禮拜剛好有朋友又問到這個問題,索性就跑去看了一下 matplotlib 關於字體 : 設定部分的原始碼。對整個 matplotlib 來說,字體渲染其實並不是一個那麼好 : 處理的部分,特別是當考慮到廣大的中日韓字元(CJK characters)使用者的時 : 候... : 多數人卡關的其實是關於 matplotlib 字體緩存的部分,說穿了其實就是套件本 : 身會持有一個 FontList 去管理已知可用的字體,並且在自己的資料夾下面保有 : 字體檔的緩存,但這樣其實並不是一個節省空間的作法(系統字體倉庫有一份, : 而我自己套件倉庫下又多存一份),所以在 2.0.0版本之後提供了直接使用字體 : 檔案路徑,添加進 FontList 以便使用時查找。 : 不過這一個階段又有人卡關了,因為必須提供字體檔案的絕對路徑,有一大部分 : 的使用者由於使用的作業系統有所不同,路徑的表達方式也有所不同,這一個問 : 題在早期使用 os 套件庫時會有些小問題,不過在 Python 3 之後提供了好用的 : pathlib 可以簡單又優雅地處理路徑在不同作業系統下表達方式不同的問題。 : 然而接下來又會撞到下一個關卡,就是設定 matplotlib 下繪圖的字體設定,在 : 官方文件裡面說: : You can explicitly set which font family is picked up for a given : font style (e.g., 'serif', 'sans-serif', or 'monospace'). : In the example below, we only allow one font family (Tahoma) for the : sans-serif font style. The default family is set with the font.family : rcparam, e.g. : ```python : rcParams['font.family'] = 'sans-serif' : ``` : and for the font.family you set a list of font styles to try to find : in order: : ```python : rcParams['font.sans-serif'] = ['Tahoma', 'DejaVu Sans', : 'Lucida Grande', 'Verdana'] : ``` : 問題到了這裡,其實並沒有解決!在這裡上面的 'font.family' 是告訴繪圖的 : 套件我可以選用哪些字體族,比如此處只從 'sans-serif' 字體族去找字體, : 於是我還必須在 'font.sans-serif' 字體族設定裡面去添加我的中文字體才能 : 滿足需求。 : 很多教學文章在這裡就全部亂了套,這些文章東抄西抄大概也沒有認真去看一下 : 問題到底在哪。比如把中文字體直接放在了 'font.family' 裡面,又或者是沒 : 有在 'font.family' 裡面添加 'serif' 就把中文字體添加到 'font.serif' 中 : ,一點用處也沒有。 : 然而即使把中文字體添加到上述的 'font.san-serif' 中了,問題也未必能夠解 : 決!因為還有一個關卡就是在這個字體列表中的字體順序。這邊必須特別提出來 : 講的原因就是 matplotlib 沒有實作字體回退(font fallback) 的機制,然而 : 字體設定又給你一個列表,多數人會誤以為這邊的運作機制和瀏覽器中的字體設 : 定一樣: : https://webptt.com/m.aspx?n=bbs/Web_Design/M.1279032453.A.80B.html : 不不不!並不是這樣的,在 matplotlib 的認知裡面,這個字體列表並不是用來 : 「依序套用」字體的順序列表,是拿來「依序尋找」字體的順序列表,所以如果 : 字體列表中的第一個字體能夠在他維護的 FontList 中找到並且路徑有效,就會 : 用從頭到尾都用這個字體,如果這個字體是拉丁字符集,那麼遇到中日韓字符自 : 然會變成方塊(也就是俗稱的豆腐)。有興趣幫忙實作的可以追一下這個 issue : : : https://github.com/matplotlib/matplotlib/issues/18883 : 最後還請大家幫我測試一下有沒有什麼大問題 : 雖然沒什麼技術含量的一個 package.... --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.120.190 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1619147323.A.B16.html ※ 編輯: KSJ (122.116.120.190 臺灣), 04/23/2021 11:09:32
1F:推 taipoo: 好像不錯,謝謝分享 04/23 11:29
2F:→ alvinlin: 不能直接去matplotlib告訴他們你們的套件在處理顯示中文 04/23 12:10
3F:→ alvinlin: 上爛透了嗎? 04/23 12:10
4F:推 Hsins: 實際上是因為他們的字體回退機制並不像網頁那樣,我有提 is 04/23 23:02
5F:→ Hsins: sue 但看起來並不是當前他們團隊會處理的 04/23 23:02
6F:→ Hsins: https://git.io/JOM1T 04/23 23:02
7F:→ Hsins: 畢竟用免錢的,不用這麼凶去嗆人吧… 04/23 23:03
8F:→ Hsins: 我自己是們心自問自己沒時間也沒辦法獨立尻出一個處理 CJK 04/23 23:06
9F:→ Hsins: 很優秀的繪圖套件,或許覺得他們爛透的 2 樓可以試試 04/23 23:06
10F:→ Hsins: 如果要上 pypi 可能要先檢查一下 package 大小,因為中文字 04/23 23:11
11F:→ Hsins: 體很肥,然後 pypi 有檔案大小限制,如果太大的話要先推一 04/23 23:11
12F:→ Hsins: 板上去然後在 pypi 那邊提 issue 請他們幫忙設定 04/23 23:11







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP