Matplotlib 中文显示与手绘


Matplotlib 中文显示

Matplotlib 默认不支持中文显示,其解决方案如下:

  1. 下载中文字体,这里提供了 PingFang SC 中文字体和 FZKaTong-M19S 卡通中文字体,格式为 ttf。
  2. 找到 Matplotlib 中存放字体文件的目录。
    • 终端运行 pip show matplotlib,结果显示 Location: /Users/lichunxiao/anaconda3/envs/py37/lib/python3.7/site-packages,因此 Matplotlib 中存放字体文件的目录为 /Users/lichunxiao/anaconda3/envs/py37/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf
  3. 将下载的字体文件拷贝到 ttf 目录。
  4. 编辑配置文件 matplotlibrc。
    • 进入 mpl-data 目录,编辑配置文件 matplotlibrc: vim matplotlibrc。将文件中 #font.family : sans-serif 的 ‘#’ 去掉,#font.serif : DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif 的 ‘#’ 去掉,并在 DejaVu Serif 前面添加字体名称 PingFang SC 和 FZKaTong-M19S,即 font.serif : PingFang SC, FZKaTong-M19S, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif, 修改完成后保存退出。
  5. 删除缓冲文件,rm -rf ~/.matplotlib
  6. 重启终端或 Jupyter notebook。

完成以上设置后,在 Matplotlib 代码中添加

即可显示中文字体。

绘制指数曲线和正弦曲线

绘制函数 $f(t) = e^t$ 和 $g(t) = \sin(\pi t)$,并采用 PingFang SC 中文字体标示坐标轴。

输出图像为

Matplotlib 手绘

Matplotlib 手绘效果的实现只需在画图之前加上一行代码 plt.xkcd() 即可。目前 Randall Munroe 开发的 xkcd 程序包支持多种绘图方式和地图投影。xkcd 默认的图像变形参数为xkcd(scale=1, length=100, randomness=2),其中 scale 代表振幅因子,length 相当于波长,randomness 为波长的随机收缩膨胀参数。下面以绘制直角坐标下的曲线图、极坐标下的曲线图、平面轮廓图、简单的地图与多图层的地图来展示中文卡通字体与手绘效果的使用。

绘制两个正弦信号及其相干性

绘制正弦信号 $S_1 = \sin(20\pi t)+noise_1$ 与信号 $S_2 = 1.5\sin(16\pi t)+noise_2$ 及其相干性。

输出结果为

结果显示两个信号在频率 9 处的相干性最大。

绘制极曲线

在极坐标轴下绘制极曲线 $r = \frac{\theta}{3\pi}$。

输出图像为

极坐标轴下曲线的绘制不宜将手绘图的变形参数设置地过大,否则圆形边界的起点和终点因错位而很难闭合。

绘制轮廓图

用两种方法绘制离散数据的轮廓图:

  • scipy.interpolate 的 griddata 将离散点插值到网格,然后根据网格绘制轮廓图;
  • tricontour 直接对离散点绘制轮廓图;

输出图像为

图像显示离散点插值到网格的轮廓图与直接绘制的轮廓图很相似。

绘制简单的地图

PlateCarree 投影下绘制世界地图。

输出图像为

上图除了不能显示经纬线外,其他的显示均无可厚非,希望 Randall Munroe 能改进这个缺陷。

绘制区域地图

PlateCarree 投影下绘制东亚地区的地形、铁路分布以及城镇分布。

输出图像为

图中灰色的线条为铁路线,粉红色的点代表城镇。关于地图绘制的更多详情可参见 Cartopy 入门

绘制全球板块边界、地震活动分布

全球板块边界文件可从 Plate boundaries for NNR-MORVEL56 model 下载,更多详情可参考判断单点或多点是否在多边形内板块的面积与几何转动惯量张量ITRF2014-VEL 板块运动模型。地震目录数据可从 IRIS(Incorporated Research Institutions for Seismology)IRIS Earthquake Browser 下载。这里提供了全球 1970~2019 年震级不小于 M5.5 的地震目录,共计 20894 条记录。

读取地震目录数据

读取地震目录数据 ‘IEBQuakesExport.csv’,排除震源深度为 0 km 的地震,最后剩余 20562 条记录。

输出结果为

统计信息显示时间范围为 1970.0~2019.0,震级范围为 5.5~9.1,震源深度范围为 0.1~750 km。

绘制全球板块边界、地震活动分布

Robinson 投影下绘制世界地图,然后添加全球板块的边界并对板块进行标注。用离散点表示全球地震分布(M >= 5.5),其中点的大小表示震级,颜色表示震源深度。

输出图像为

上图很直观地显示出了板块边界与地震带紧密相关;纳兹卡–南美板块对、澳大利亚–巽他古陆板块对、环太平洋火山地震带西部等板块边界的震源深度分布皆体现了俯冲类型的板块运动。


参考

发表评论

电子邮件地址不会被公开。 必填项已用*标注