前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python新手绘图绕不开的17个小问题

Python新手绘图绕不开的17个小问题

作者头像
Python数据科学
发布2019-05-23 18:17:47
4K0
发布2019-05-23 18:17:47
举报
文章被收录于专栏:Python数据科学Python数据科学

作者:令狐虫

转自:迷途小书童

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

代码语言:javascript
复制
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轴,设置双轴颜色?

答:方便。一个例子如下:

代码语言:javascript
复制
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。


4 高级操作

问10:如何用Python画世界地图?

代码语言:javascript
复制
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坐标轴如何显示时间?

答:具体例子如下:

代码语言:javascript
复制
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)
    ...

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

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

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

推荐阅读

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 关于安装
  • 2 与其他工具对比
  • 3 基本操作
  • 4 高级操作
  • 5 其他
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档