Python新手绘图绕不开的17个小问题,学完超过70%的人

栏目:科技 来源:金融广东网 时间:2019-10-25
Python新手绘图绕不开的17个小问题,学完超过70%的人

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循环即可批量成图。例如:

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()

Python新手绘图绕不开的17个小问题,学完超过70%的人

可以看到,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画世界地图?

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()

Python新手绘图绕不开的17个小问题,学完超过70%的人

问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

)

...

Python新手绘图绕不开的17个小问题,学完超过70%的人

5 其他

问15:推荐哪些网站和资料?

答:首推matplotlib的官方网站https://matplotlib.org/index.html,在其examples页面,给出了上百个常用的绘图脚本及成图样例。 其次,多用搜索引擎Google,99.9%的画图问题都可以在里面找到答案。

问16:Python画图的优点?

答:简单总结下,Python画图优点有:

  1. 脚本语法简单,很容易理解、上手;
  2. 跨平台(Win/Linux/Mac),开源;
  3. 安装简单,占用空间很小;
  4. 封装了一些“高级”属性/函数,比如支持设置dpi;支持去除图片白边;支持自动调整多子图的间隔......
  5. 使用人数众多,社区活跃。2018年末 Python 在 TIOBE 排行榜中排行第三,是仅次于Java、C,排名最高的解释型语言,并被评选为2018年年度编程语言。

问17:Python画图有什么缺陷?

答:个人觉得以下方面还可以继续改进:

  1. 在脚本操作之外,可以增加辅助的图形化操作,支持类似Excel或Matlab的,文件即托即画功能;
  2. 成图show之后,支持在图片上直接对轴线、线条、title等进行编辑;
  3. 简化basemap库安装过程。增加GMT画世界地图的黑白间隔边框效果。

最后,关注可儿不迷路。每日都会分享一些学习小技巧。

学习资料领取处:关注、私信小编【资料】就可以领取啦。

Python新手绘图绕不开的17个小问题,学完超过70%的人
Python新手绘图绕不开的17个小问题,学完超过70%的人
Python新手绘图绕不开的17个小问题,学完超过70%的人
相关文章
评论
新版评论功能开发中
头条推荐
最新资讯