最近在学习数据可视化,梳理一下其中一些诸如pandas绘图、matplotlib绘图、pyplot(plt)、axes等概念。
重要的事情说三遍:axes不是axis!axes不是axis!axes不是axis!
重要的事情说三遍:pyplot是接口不是对象!pyplot是接口不是对象!pyplot是接口不是对象!
很多书上一上来就直接import matplotlib.pypltot as plt
,然后就教你plt.xxx()
。这种方式固然没错,可问题就出在了plt
只是一个interface,只是一个接口,连对象都算不上(仔细回想,你确实没有实例化过任何一个名叫plt
类型的对象)这给本来就对面向对象编程并不很熟悉的我带来无穷无尽的困扰。plt
这个接口的意义在于:
- 通过接口直接画图(这时候我们把这个接口看成一个黑盒,根本不要去管其中有些什么对象类型)
- 通过接口实例化别的类型的对象(如
figure
类型axes
类型等)
1.通过plt.xxx()直接绘图
就像各种教程和书上的常规操作一样,我们可以用plt.plot(), plt.bar()等绘制不同类型的图(部分总结如下表)
表一 plt中用于绘图的部分函数
函数名
作用
plt.bar()
条形图
plt.barh()
横排条形图
plt.boxplot()
箱线图(plt.box()是另一个函数)
plt.hist()
频率直方图
plt.plot()
折线图
我们可以用plt
的其他一些函数来对图表的标题等进行设置(部分总结如下表)
表二 plt中用于设置的部分函数
函数名
作用
plt.title()
设置图表标题
plt.grid()
设置图表网格
plt.xlabel();plt.ylabel
设置x;y轴标题
plt.xticks();plt.yticks()
设置x;y轴刻度
plt.xlim();plt.ylim()
设置x;y轴范围
plt.annotate()
设置标注
(具体的参数和用法详见 https://matplotlib.org/api/pyplot_summary.html )
用plt绘图的方便之处,同样也是它最令人迷惑的地方,就是它没有一个显性的对象。
我们甚至可以调用pandas绘图以后,用表二中的plt函数来对pandas生成的这个图表进行设置。
例程如下:
import matplotlib.pyplot as plt from pandas import Series data = Series([1.47,1.62,1.78,1.94,2.38,2.60],index=['2012','2013','2014','2015','2016','2017']) #注意下一行的对象是'data',它是一个series对象,调用的是pandas绘图函数 data.plot(label='income', color = 'r', linestyle=':', marker = 's')#具体的pandas绘图之后会细讲 #但接下来我们甚至可以调用plt的函数对它进行设置 plt.title('Income chart') plt.xlabel('Year') plt.ylabel('income') plt.annotate('Largest point',xy=(5,2.60),xytext=(3,2.5), arrowprops=dict(arrowstyle='->')) plt.show()
上面这个例子就展示了pyplot
(plt
)的特点,不用指明对象就能进行画图和设置,当我们在同一个程序中的图比较少的时候这是方便的,但当我们同一个程序中的图很多的时候,这种没有显性对象的方式会导致我们没有办法重新调用之前的图(因为没有对象名)也会给人一种很不踏实的感觉。
2.实例化figure和axes对象后绘图
就像前文提到的,plt
只是一个接口而不是对象。
在matplotlib中,有两个重要的对象类型:figure
对象可以把它想成一张空白图纸,在上面可以绘制一个或多个axes
对象(还可以有其他对象等)。axes
对象是一个图像的主要部分(它包括了图线、xy轴等部分)。
我们可以使用plt
接口生成figure
对象和axes
对象,然后对axes
对象调用方法来实现画图和设置。
总体思路是:
- 实例化figure对象
- 实例化axes对象
- 对axes对象调用方法进行画图和设置
例程如下:
import matplotlib.pyplot as plt from pandas import Series data = Series([1.47,1.62,1.78,1.94,2.38,2.60],index=['2012','2013','2014','2015','2016','2017']) #调用plt接口,实例化figure1对象 figure1 = plt.figure(facecolor='w')#faceclolr设置背景颜色 #实例化ax1对象 ax1 = figure1.add_subplot(111)#ax1是figure1的第1行第一列的第1张图表 #注意下一行的对象是'ax1',它是一个axes对象,调用的是matplotlib.axes绘图函数 ax1.plot(data,label='income', color = 'r', linestyle=':', marker = 's') #接下来我们调用ax1的方法对它进行设置 ax1.set_title('Income chart') ax1.set_xlabel('Year') ax1.set_ylabel('income') ax1.annotate('Largest point',xy=(5,2.60),xytext=(3,2.5), arrowprops=dict(arrowstyle='->'))
用这种方式画出来的图,每一个对象都有它自己的名字,方便后面继续调用、修改。代码也就多了两行实例化的过程,并没有麻烦很多,个人很喜欢用这种方式画图(也给人一种很踏实的感觉)。
类比上面的表一和表二,给出对于axes对象的方法函数表:
表三 axes对象用于绘图的部分方法函数
函数名
作用
ax.bar()
条形图
ax.barh()
横排条形图
ax.boxplot()
箱线图
ax.hist()
频率直方图
ax.plot()
折线图
表四 axes对象中用于设置的部分方法函数
函数名
作用
ax.set_title()
设置图表标题
ax.set_xlabel(); ax.set_ylabel
设置x;y轴标题
ax.set_xticks(); ax.set_yticks()
设置x;y轴刻度
ax.set_xlim(); ax.set_ylim()
设置x;y轴范围
ax.annotate()
设置标注
(具体的参数和用法详见 https://matplotlib.org/api/axes_api.html )
注意表一和表三,表二和表四的异同:
- 表一表二中的
plt
是固定的名字,不论画什么都是plt.xxx()
,而表三和表四中ax.xxx()
中的ax
要改成你实例的对象名。 - 注意对比表二和表四,很多作用相同的东西,跑到了axes这里要多加一个
set_
用实例化axes的方式画图很重要,因为多子图的绘制更是需要依赖axes对象。
我还会分两期分别介绍一下axes与多子图的绘制和axes与pandas绘图的关系。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。