Created
October 26, 2017 05:18
-
-
Save scottt/f7a85e8239bc47c33bc2fd1d30e98886 to your computer and use it in GitHub Desktop.
Matplotlib set suitable font for zh_TW text
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Trying to show zh_TW text in Matplotlib by default, without editing config files, would result in missing glyphs displayed as boxes (tofus)\n", | |
"\n", | |
"---\n", | |
"\n", | |
"Matplotlib 顯示中文,預設會出現代表字型找不到的方框" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7f16059929e8>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.title('Missing Glyph -> −臺− <- Missing Glyph')\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 處理 Matplotlib 中文問題\n", | |
"* 請跑一次以下程式,並看一下輸出\n", | |
"* 它會試著在 Linux、Mac、Windows 下找適合的中文字型,否則會請你安裝一套 Open Source 的" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"('Source Han Sans TW', '/usr/share/fonts/adobe-source-han-sans-tw/SourceHanSansTW-Regular.otf')\n" | |
] | |
} | |
], | |
"source": [ | |
"# matplotlib_set_font_for_zh_TW() either sets a suitable font for Matplotlib for use with zh_TW text or\n", | |
"# returns a message asking the user to install a suitable open source font.\n", | |
"# It's tested on Linux, Mac OS, Windows 7 & 10.\n", | |
"\n", | |
"import warnings\n", | |
"import os\n", | |
"import tempfile\n", | |
"import shutil\n", | |
"import warnings\n", | |
"import tempfile\n", | |
"import shutil\n", | |
"import logging\n", | |
"import matplotlib.font_manager\n", | |
"import matplotlib.pyplot as plt\n", | |
"\n", | |
"# The Problem:\n", | |
"# 1. Matplotlib can't automatically choose a font based on language coverage\n", | |
"# 2. Computing language coverage on the fly by scanning directories of font files can be expensive\n", | |
"# 3. Matplotlib ignores fonts in TTC (True Type Collection) format,\n", | |
"# since some of its graphics backends doens't support it.\n", | |
"\n", | |
"# For East Asian CJKV users, the list of fonts Matplotlib knows about is \"weird\" cheifly\n", | |
"# because it ignores TTC fonts.\n", | |
"\n", | |
"def font_doesnt_produce_warnings(font_name, manually_inspect_test_output=False):\n", | |
" plt.rcParams['font.family'] = font_name\n", | |
"\n", | |
" temp_dir = tempfile.mkdtemp()\n", | |
"\n", | |
" fig = plt.figure()\n", | |
" # Having unicode_minus here doesn't really catch code point availability in fonts\n", | |
" # unless we manually inspect the output\n", | |
" unicode_minus = '−'\n", | |
" plt.title(unicode_minus + '臺')\n", | |
" with warnings.catch_warnings(record=True) as ws:\n", | |
" warnings.simplefilter('always', UserWarning)\n", | |
" (temp_fd, temp_fname) = tempfile.mkstemp(suffix='.png', dir=temp_dir)\n", | |
" plt.savefig(temp_fname)\n", | |
" os.close(temp_fd)\n", | |
" (temp_fd, temp_fname) = tempfile.mkstemp(suffix='.pdf', dir=temp_dir)\n", | |
" plt.savefig(temp_fname)\n", | |
" os.close(temp_fd)\n", | |
" try:\n", | |
" m = ws[0].message.args[0]\n", | |
" except IndexError:\n", | |
" m = ''\n", | |
" # https://stackoverflow.com/a/31845332/676030\n", | |
" plt.close(fig)\n", | |
" if manually_inspect_test_output:\n", | |
" logging.warning('Test output left in %r for manual inspection' % (temp_dir,))\n", | |
" else:\n", | |
" shutil.rmtree(temp_dir)\n", | |
"\n", | |
" if m.startswith('find_font: ') and 'not found' in m:\n", | |
" return False\n", | |
" return True\n", | |
"\n", | |
"install_source_han_msg = ('''Can't find font suitable for zh_TW text.\n", | |
"① Get https://github.com/adobe-fonts/source-han-sans/blob/release/SubsetOTF/TW/SourceHanSansTW-Regular.otf (5.4 MB)\n", | |
"② Follow \"Font installation instructions\" on https://github.com/adobe-fonts/source-han-sans/tree/release\n", | |
"③ Delete %(cachedir)r\n", | |
"and re-try.''') % dict(cachedir=matplotlib.get_cachedir())\n", | |
"\n", | |
"def matplotlib_set_font_for_zh_TW(manually_inspect_test_output=False):\n", | |
" # zh_TW fonts that matplotlib can use\n", | |
" usable_fonts = [\n", | |
" # NOTE: 'Source Han Sans' causes matplotlib as of 2.0.0 to generate large PDFs\n", | |
" # likely due to lacking font subsetting functionality on OTF fonts.\n", | |
" 'Source Han Sans TW', # high quality open source font, TW region-specific subset\n", | |
" 'Source Han Sans TC', # TC language-specific subset of the same font\n", | |
" 'Arial Unicode MS', # Mac OS 10.5+\n", | |
" 'Microsoft JhengHei', # TTF in Windows 7&8, TTC in Windows 10\n", | |
" # All the Traditional Chinese fonts shipped with Windows 10 is in TTC format\n", | |
" 'STSong', # Office 2016\n", | |
" 'STXihei', # Office 2016\n", | |
" ]\n", | |
" ttf_name_to_fname = {x.name:x.fname for x in matplotlib.font_manager.fontManager.ttflist}\n", | |
" available_fonts = [ x for x in usable_fonts if x in ttf_name_to_fname ]\n", | |
" if not available_fonts:\n", | |
" return install_source_han_msg\n", | |
"\n", | |
" font = available_fonts[0]\n", | |
" if not font_doesnt_produce_warnings(font, manually_inspect_test_output):\n", | |
" return install_source_han_msg\n", | |
" \n", | |
" return (font, ttf_name_to_fname[font])\n", | |
"\n", | |
"print(matplotlib_set_font_for_zh_TW())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"上段程式成功找到適用字型後,顯示中文就會成功了" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7f15e423afd0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.title('−臺−')\n", | |
"plt.show()" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.5.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment