Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save howard-haowen/0023af00bfc88db72911eedb93bc8b07 to your computer and use it in GitHub Desktop.
Save howard-haowen/0023af00bfc88db72911eedb93bc8b07 to your computer and use it in GitHub Desktop.
Matplotlib set suitable font for zh_TW text
Display the source blob
Display the rendered blob
Raw
{
"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