matlab绘图 数据点_Python新手绘图绕不开的17个小问题

4abfbc5eb7975bb80255e69a6b482954.png作者:令狐虫

转自:迷途小书童

测试环境: python版本 3.7.0 / 操作系统window 7 64位 / 编辑器PyCharm;


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

b33114146a5a558a2ee3282f762d1d57.png

可以看到,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()

c516f19dc1821fb61cae53013fd4c5f8.png

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

   ...

b6d017be803927c97caf4f82749c4b09.png

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画世界地图的黑白间隔边框效果。

22720f2ba652936a7104f46b0e5fef27.png

专注于数据科学领域的知识分享

欢迎在文章下方留言与交流

推荐阅读 

干货 | 19款最好用的免费数据挖掘工具大汇总

Python排序傻傻分不清?一文看透sorted与sort用法

小白必看,超详细的Pycharm项目部署教程!

收藏 | 完备的 AI 学习路线,最详细的资源整理

机器学习工程师心得:特征工程比超参数调优更重要(文末福利)

李航大佬《统计学习方法》第二版上线!增加无监督学习!

73c96d46a5edf57837daea560437571a.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值