转自:迷途小书童
测试环境: python版本 3.7.0 / 操作系统window 7 64位 / 编辑器PyCharm;
问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
问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格式数据的快速读取。微调绘图结果可通过改变代码很快设置完成。对笔者来说,上面两个问题几乎可以忽略。
问5:Python画图代码的可读性如何,图形种类多不多?
答:引用一个说法,Python的哲学就是“优雅”、“明确”、“简单”,尽量写容易看明白的代码,尽量写少的代码。这是Python的定位,使得Python程序看上去简单易懂,初学者容易入门,学习成本更低。
以最常用的matplotlib库为例,Python可以绘制多种形式,包括普通的点线图,柱状图、直方图,饼图,功率谱图,极坐标图以及误差线图等。参考matplotlib的官方网站https://matplotlib.org/index.html,在其examples页面,给出了上百个常用的绘图脚本及成图样例。
问6:如何批量进行成图处理?
答:假定已经写好了读文件A画A.jpg的函数。得到所有待绘图文件A,B,C,的路径后,通过for循环即可批量成图。例如:
import os
names = os.listdir(mydir)
for nm in names:
if not nm.endswith('.txt'):
continue
pth = os.path.join(mydir, nm)
draw_1_txt(pth)
问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轴,设置双轴颜色?
答:方便。一个例子如下:
import numpy as np
import matplotlib.pyplot as plt
# Create some mock data
t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)
fig, ax1 = plt.subplots(figsize=(5,3))
color = 'tab:red'
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp', color=color)
ax1.plot(t, data1, color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
color = 'tab:blue'
ax2.set_ylabel('sin', color=color) # we already handled the x-label with ax1
ax2.plot(t, data2, color=color)
ax2.tick_params(axis='y', labelcolor=color)
fig.tight_layout() # otherwise the right y-label is slightly clipped
plt.show()
可以看到,ax2=ax1.twinx()语句可以获取第二个y轴元素。对于轴线属性如label颜色、大小,tick的间隔,文字,颜色等的设置都可以通过相应的成员函数实现。
问9.1:图片清晰度和分辨率是否能自己控制?
问9.2:如何设置图片分辨率,dpi等参数?
答:配合设置figsize和dpi这两个参数调整图片像素和分辨率。 通过figsize参数设置画幅大小,单位为英寸:plt.figure(figsize=(8,4)) savefig保存图片时可通过可选参数dpi设置。有的期刊网站要求dpi不低于300。
问10:如何用Python画世界地图?
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt
# lon_0 is central longitude of projection.
# resolution = 'c' means use crude resolution coastlines.
f = plt.figure(figsize=(8,4))
m = Basemap(projection='robin',lon_0=0,resolution='c')
m.shadedrelief(scale=0.2)
plt.title("Robinson Projection")
plt.show()
问11:图片如何裁去多余的白边?
答:在保存图片 savefig() 时的参数中添加 bboxinches = 'tight',就可以去除因为画幅过大导致图片上下左右的白边。plt.savefig(‘mypic.jpg’, dpi=360, bboxinches='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坐标轴如何显示时间?
答:具体例子如下:
import matplotlib.dates as mdates
from matplotlib.pylab import date2num
import datetime
tmFmt = mdates.DateFormatter('%H:%M:%S')
def draw_fig_xaxis_time():
...
tmfl = date2num(time_lst)
plt.plot(time_lst, y_lst)
ax = plt.subplot(111)
ax.xaxis.set_major_formatter(tmFmt)
ax.set_xlim(min(tmfl)-0.0001, max(tmfl)+0.0001)
...
问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画世界地图的黑白间隔边框效果。
专注于数据科学领域的知识分享
欢迎在文章下方留言与交流
推荐阅读
干货 | 19款最好用的免费数据挖掘工具大汇总
Python排序傻傻分不清?一文看透sorted与sort用法
小白必看,超详细的Pycharm项目部署教程!
收藏 | 完备的 AI 学习路线,最详细的资源整理
机器学习工程师心得:特征工程比超参数调优更重要(文末福利)
李航大佬《统计学习方法》第二版上线!增加无监督学习!