python画图程序没有图_python之matplotlib画图教程(1)

最近迷上了用matplotlib去绘制数据,如果你也需要经常与数据,图表打交道,那可以说是肥肠推荐使用了。

一段时间之前,微软在其官方发起了一个小的投票,咨询广大网友是否可以考虑用python代替VBA,成为Excel的官方脚本语言。

首先不管最终微软是否会将此付诸实践,值得一提的是,VBA确实太老了,相对独立,语法奇特,还没有啥特别好的社区氛围。细数一下真的是槽点满满,但是没办法啊,人家依附着Excel而存在。就像你想吃一顿法式大餐,就得接受穿一身不那么舒服的晚礼服。

如果一个都市白领,每天繁忙的与各种数据打交道,焦头烂额。我首先建议你能学会用VBA替代绝大多的手工工作。真正的在工作岗位去做决策的人并不多,更多的都是在重复劳动。

加班?不存在的。

当然扯远了,我们这一次要来聊一聊使用python中的matplotlib库来绘图。

平心而论,作为宇宙最强办公室套装--Office来说,用起来绝对没毛病,但绝大多人用过的功能也只能算九牛一毛,Excel数据绘图真是又好看又好用。

既然Excel这么棒,那为什么要用matplotlib来画图呢?

首先来说,matplotlib支持的更广,配合上numpy和pandas,更加如虎添翼。做起来数学以及科学方面的研究,简直可以说爽歪歪。(numpy和pandas是啥?呃。。)

再扯一个闲话,你可以考虑下为什么很多人觉得立体几何无法理解?简单的来说不就是因为看不见摸不着么,如果作为一个数学老师,每讲一题都要给学生每人做一套塑料模型,大家一边观察模型一边解题,那不太合适。

但是如果用代码绘制出一套模型,一边展示成品一边去分析题目,效果应该会好很多吧。(想法很美好,但是逼着一个人学python应该比逼着他学数学更难吧。)

比如,下面是我用代码画的一个魔方。如果闲得无聊可以自己解着玩。。(我是多无聊。。)v2-f9ce195bcaf353278caba20871e6a9c0.jpgmatplotlib绘制可以玩的魔方https://www.zhihu.com/video/1129447590256955392

回到正题,如果你还是个新手,只是会用python,那咱们就把当下流行的几个科学研究的python库一起学习下吧~

首先,matplotlib可以看做是matlab中的绘图功能在python上的移植。如果你并不知道MATLAB是什么,也没有关系。它是一款主要针对算法研发,科学计算,数据可视化之类的工具,由于内部优化非常棒,功能覆盖面极广,可以算是工程师最爱的软件之一,当然现在大有被python取代之势,还是那句话“人生苦短,我用python”。据说matplotlib的开发者也是因为用matlab绘图遇到瓶颈,决定另起炉灶才有了现在这个下载量超过数千万的第三方库。MATLAB_百度百科​baike.baidu.comv2-a64774de231eee7f3449f6649c9cdaef_180x120.jpg

numpy则可以看做是将matlab中大部分常用的数学计算相关功能进行了抽离。主要进行矩阵操作,也就是你我所熟知的线性代数相关。你觉得线性代数很无聊?机器学习,深度学习就是一个一个矩阵堆出来的啊。

pandas可以看做是对于numpy又进行了一次的封装,在数据处理,清洗数据等方面有着非常亮眼的表现。当然这不是我们本篇内容要去讨论的了。

别懵,其实不用把这个过程想的特别复杂,简单的说就两步numpy和pandas负责把数据准备好

matplotlib负责把数据制作成图。

我不建议你现在去看这些第三方库的官方文档,虽然很详尽,但是从学习路径而言,请尽量用什么学什么,有目的性的学习更容易接受。

前面叨叨了这么多,咱们就动手开始做一些简单的数据绘制。

比如我们现在绘制一幅离散图,但是要玩就别玩太简单的,我们现在绘制一个基于某函数,并在其一定范围震动的离散图,听起来是不是很懵,没关系,咱们画出来就明白了。

总体的想法是我们先绘制一个函数

equation?tex=y%3D1%2F100x%5E4-8%2F300x%5E3-3%2Bln%28x%29

这个函数明显是我随手瞎编的。那又如何理解在一定范围内震动呢?其实。。就是对于y加个随机数,比如我们在

equation?tex=%5Cpm5 范围内波动吧。

话不多说,上代码!

import numpy as np

import matplotlib.pyplot as plt

def trans(x):

random_data=-5+10*np.random.random(x.shape)

y=1/100*x**4-8/300*x**3-3+random_data+np.log(x)

return y

x=np.linspace(-10,10,50)

y=trans(x)

fig=plt.figure()

ax=fig.add_subplot(111)

ax.scatter(x,y,marker='x',color='r')

plt.show()

#fig.savefig('a.png') #储存结果

咱们先看代码。

首先我们加入了numpy以及matplotlib.pyplot两个库。

x=np.linspace(-10,10,50),代表从-10到10之间,等分成50个数字,这时候的x是一个长度为50的数组。

定义了trans方法,按照上方的函数定义x,y之间的关系,由于numpy有着非常好的传播机制,也就是你不用管这时候是单纯的数字间计算或者是数组间计算,我们只需要关注逻辑就够了,这时候的y也应该是一个含有50个元素的数组。(对于random_data为何如此赋值,可以自己考虑考虑。或者说非常值得考虑考虑。)

不过我这里挖了个坑,对于ln(x)函数而言,如果x是负值,那么是没有意义的。算法很机智的自己避开了,虽然我们设定

equation?tex=x%5Cin%5B-10%2C10%5D ,但是算法屏蔽了非正区间,点赞!

对于一个输出框(plot)而言,它由最基础的几个部分组成fig--figure,可以理解为绘制图像的容器。

ax--axes,理解为每一个绘图区域,因为现在我们只分配了一个区域,所以看起来沾满了整个figure。别急,咱们再画个分4个区域的。

丑是丑了点,但是注意看代码。

ax1=fig.add_subplot(411) #分为4行一列,现在是第一行

ax2=fig.add_subplot(412) #分为4行一列,现在是第二行

ax3=fig.add_subplot(413) #分为4行一列,现在是第三行

ax4=fig.add_subplot(414) #分为4行一列,现在是第四行

ax1.plot(x,x)

ax2.plot(x,2*x)

ax3.plot(x,-1*x)

ax4.plot(x,-2*x)

这样的写法就可以将一个figure拆分成多快,如果你愿意可以拆成各种奇怪的样子。ax.scatter(x,y,marker='x',color='r'),首先ax.scatter代表了在ax的绘制区域内,需要画一幅离散图,marker='x'代表了每个点如何显示,比如上方的点状图,我们是用一个红x来表示每个点,当然marker的样子还有许多其他的。https://matplotlib.org/api/markers_api.html​matplotlib.orgplt.show()则可以将我们绘制好的图形进行显示,或者你想存储为图片,也可以调用fig.savefig('a.png'),但是注意savefig方法只能在fig上使用。

如果现在我不想画这样的点点图,我想画一个函数的曲线呢?

安排!

import numpy as np

import matplotlib.pyplot as plt

def trans(x):

y=1/100*x**4-8/300*x**3-3+np.log(x)

return y

x=np.linspace(-10,10,50)

y=trans(x)

fig=plt.figure()

ax=fig.add_subplot(111)

ax.plot(x,y,ls='-.',label='$y=1/100x^4-8/300x^3-3+ln(x)$')

plt.legend()

plt.show()

#fig.savefig('r5.png')

几乎一样,我们只是把ax.scatter改成了ax.plot

这里请注意ls='-.',注意看上面的曲线,ls的意思是line-style代表了现在曲线的样式,当然我也可以改成‘--’

或者用最简单的'-'。

根据个人喜好随意调换。plt.legend()代表了绘制图形的同时,写出图形对应的标签,我们在label里声明了这个函数是什么,所以请注意看图像的左上角,都有了相应的说明。

今天先说这么多,咱们下回继续!自己动手试试哦~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值