image
</tt-image>
1 关于安装
问 1:Python 画图用到哪些库?
答: Python 常用的绘图库有:
matplotlib, 是最经典的 Python 可视化绘图库. matplotlib 就是 MATLAB+Plot+Library, 即模仿 Matlab 的绘图库, 其绘图风格与 Matlab 类似.
seaborn, 是基于 matplotlib 的, 纯粹由 Python 开发的图形可视化库, 在 matplotlib 的基础上进行了更高级的 API 封装, 从而使得作图更加容易. "make a well-defined set of hard things easy","默认情况下就能创建赏心悦目的图表".
basemap,Python 的 basemap 库负责实现地理信息可视化, 其功能之强大较 GMT 有过之而无不及. 其底图数据库与 GMT 相同, 封装了大量常用的地图投影, 坐标转换功能, 利用简洁的 Python 语法支持绘出多种多样的地理地图.
笔者常用 matplotlib 和 basemap 库, 下一步打算学习和使用 seaborn 库.
问 2:Python 绘图库大不大? 这些库能在哪里找? 安装是否麻烦?
答: 以上绘图库安装包大小在 100M 以内. 安装及卸载十分简单. 大部分库支持在线安装.
控制台使用 pip install matplotlib 命令即可安装 matplotlib 库. 安装之前需要先安装 numpy,dateutil 模块, 安装命令分别为 pip install numpy / pip install python-dateutil. 此外, 安装 Pillow 库, 可以支持导出更多的如 JPEG,BMP,TIFF 等更多图片格式.
seaborn 的安装同 matplotlib,pip install seaborn. 其依赖库包括 numpy,scipy,matplotlib,pandas.
basemap 的安装略微不同.(Windows 用户) 需要到 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应的 wheel 文件到本地, 然后控制台进入其所在目录, 使用 pip install xxxx.whl 安装. 其依赖于 pyproj 库. 具体安装过程参考 https://zhuanlan.zhihu.com/p/34509847
2 与其他工具对比
问 3.1: 任何 Matlab 能画的图 Python 都能画吗?
问 3.2: 从 Matlab 画图转向 Python 画图是否容易?
答: 由于 matplotlib 使用的大部分函数都与 Matlab 中对应的函数同名, 且各种参数的含义, 使用方法也一致, 这就使得熟悉 Matlab 的用户使用起来感到得心应手. 对那些不熟悉的 Matlab 的用户而言, 这些函数的意义往往也是一目了然的, 因此只要花很少的时间就可以掌握.
当前新版本的 Matlab 安装包接近 10G!! 安装后占用空间更大!!! 且正版软件价格不菲.
Python 的各个库类似积木的基本单位, 可以随意组合. 在 Python 基本模块外扩展画图功能只需安装 matplotlib 和 numpy,pillow 等几个依赖库. 绘图包本身大小仅有几十 M, 安装后占用空间几百 M, 安装和卸载都十分方便. 另外, Python 绘图库开源而且免费.
笔者曾分别或同时使用过 Excel,Matlab,Origin,GMT 画过图. 现在只使用 Python 可以取代上面所有软件画图.
问 4.1: 能否像 Matlab 一样拖入文件右键 plot 就能画?
问 4.2:Python 画图后微调是否需要慢慢修改代码, 是否具有 Matlab 那种直接在图上操作的功能?
答: matplotlib 和 basemap 库需要通过代码读取数据绘图, 暂不支持直接拖入数据右键绘图, 或在图上直接操作的功能. 不确定其他库, 或者未来是否会出现新的扩展库支持这些操作. 这或许是 Python 画图相对 Matlab 的一个小缺点.
不过格式整齐的文本数据使用 numpy.loadtxt 函数, 1-2 行代码即可提取出所需数据. Python 也支持对 CSV,Excel 格式数据的快速读取. 微调绘图结果可通过改变代码很快设置完成. 对笔者来说, 上面两个问题几乎可以忽略.
3 基本操作
问 5:Python 画图代码的可读性如何, 图形种类多不多?
答: 引用一个说法, Python 的哲学就是 "优雅","明确","简单", 尽量写容易看明白的代码, 尽量写少的代码. 这是 Python 的定位, 使得 Python 程序看上去简单易懂, 初学者容易入门, 学习成本更低.
以最常用的 matplotlib 库为例, Python 可以绘制多种形式, 包括普通的点线图, 柱状图, 直方图, 饼图, 功率谱图, 极坐标图以及误差线图等. 参考 matplotlib 的官方网站 https://matplotlib.org/index.html, 在其 examples 页面, 给出了上百个常用的绘图脚本及成图样例.
问 6: 如何批量进行成图处理?
答: 假定已经写好了读文件 A 画 A.jpg 的函数. 得到所有待绘图文件 A,B,C, 的路径后, 通过 for 循环即可批量成图. 例如:
问 7:Python 的图片如何保存为 jpg,bmp,tif 等常见格式?
答: matplotlib 支持导出 emf,eps,PDF,PNG,ps,raw,rgba,svg,svgz 图片格式. 安装 Pillow 库之后, matplotlib 可以自动调用 Pillow 支持导出 bmp,eps,gif,jpeg,jpg,tiff 等多种格式.
问 8: 是否方便画双 y 轴, 设置双轴颜色?
答: 方便. 一个例子如下:
image
可以看到, ax2=ax1.twinx() 语句可以获取第二个 y 轴元素. 对于轴线属性如 label 颜色, 大小, tick 的间隔, 文字, 颜色等的设置都可以通过相应的成员函数实现.
问 9.1: 图片清晰度和分辨率是否能自己控制?
问 9.2: 如何设置图片分辨率, dpi 等参数?
答: 配合设置 figsize 和 dpi 这两个参数调整图片像素和分辨率. 通过 figsize 参数设置画幅大小, 单位为英寸: plt.figure(figsize=(8,4)) savefig 保存图片时可通过可选参数 dpi 设置. 有的期刊网站要求 dpi 不低于 300.
4 高级操作
问 10: 如何用 Python 画世界地图?
image
问 11: 图片如何裁去多余的白边?
答: 在保存图片 savefig() 时的参数中添加 bbox inches = 'tight', 就可以去除因为画幅过大导致图片上下左右的白边. plt.savefig('mypic.jpg', dpi=360, bbox inches='tight').
另一个可以自动调整绘图区排列的函数是 tight_layout(), 主要用于自动调整绘图区的大小及间距, 使所有的绘图区及其标题, 坐标轴标签等都可以协调, 完整地显示在画布上. 例如可以避免当绘图区的 X/Y 轴的标签, 以及标题的字体非常大, 导致这些文字不能完整显示出来. 也可以避免创建了多个绘图区, 绘图区之间有部分重叠的问题.
问 12: 多副子图如何共用 x/y 坐标轴?
答: 多副子图共用坐标轴用 sharex/sharey 参数. 如 fig, axs = plt.subplots(1, 3, sharey=True, figsize=(10, 3.5)) 表示从左至右三幅子图共用 y 轴, 只会在左子图上绘制 y 轴.
问 13: 怎么样调节子图之间的水平 / 垂直间隔?
答: 接上面的例子, 加入代码 fig.subplots_adjust(wspace=0.05) 可以调整三幅子图的水平间隔. 垂直间隔设置 hspace 参数.
问 14:x 坐标轴如何显示时间?
答: 具体例子如下:
image
5 其他
问 15: 推荐哪些网站和资料?
答: 首推 matplotlib 的官方网站 https://matplotlib.org/index.html, 在其 examples 页面, 给出了上百个常用的绘图脚本及成图样例. 其次, 多用搜索引擎 Google,99.9% 的画图问题都可以在里面找到答案.
问 16:Python 画图的优点?
答: 简单总结下, Python 画图优点有:
脚本语法简单, 很容易理解, 上手;
跨平台 (Win/Linux/Mac), 开源;
安装简单, 占用空间很小;
封装了一些 "高级" 属性 / 函数, 比如支持设置 dpi; 支持去除图片白边; 支持自动调整多子图的间隔......
使用人数众多, 社区活跃. 2018 年末 Python 在 TIOBE 排行榜中排行第三, 是仅次于 Java,C, 排名最高的解释型语言, 并被评选为 2018 年年度编程语言.
问 17:Python 画图有什么缺陷?
答: 个人觉得以下方面还可以继续改进:
在脚本操作之外, 可以增加辅助的图形化操作, 支持类似 Excel 或 Matlab 的, 文件即托即画功能;
成图 show 之后, 支持在图片上直接对轴线, 线条, title 等进行编辑;
简化 basemap 库安装过程. 增加 GMT 画世界地图的黑白间隔边框效果.
如果你对 Python 编程感兴趣, 那么记得来小编的 Python 学习扣群: 556370268, 这里有资源共享, 技术解答, 大家可以在一起交流 Python 编程经验, 还有小编整理的一份 Python 学习教程, 希望能帮助大家更好的学习 python.
来源: http://www.jianshu.com/p/1856d02128a4