【matplotlib绘图】Pandas绘图与matplotlib绘图的关联及异同
说到数据可视化绘图,我们先想到的应该是matplotlib库,可以对其中的axes对象等调⽤不同的绘图⽅法(如axes.plot())。
作为数据分析⽤的pandas库提供了Series DataFrame等类型的对象,我们也可以调⽤上述对象来绘图(如Series.plot())。
本⽂将介绍这个库之间的关联,以及他们画图之间的异同。
1.关联
1. Pandas库提供了Series DataFrame等类型的对象,可以在matplotlib画图中作为数据来源放⼊参数中,如axes.plot(Series)
2. 可以对Pandas的对象调⽤画图⽅法,如Series.plot(kind='line'),但说到底还是与matplotlib有关的,是pandas⾃动帮你⽣成了axes对
象。
3. 我们可以把Pandas画出来的图回传给指定的axes对象,如Series.plot(kind='line', ax=ax1)就把这张折线图画在了ax1对象上。
下⾯我将⽤matplotlib绘图和Pandas绘图两种⽅法画出同样的⼀张多⼦图图表
matplotlib⽅法:
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'])
#实例化fig1对象
fig1=plt.figure(figsize=(8,8),facecolor='w')
#实例化ax对象
ax1 = fig1.add_subplot(2,2,1)
ax2 = fig1.add_subplot(2,2,2)
ax3 = fig1.add_subplot(2,1,2)
#ax对象画图
#画ax1
ax1.plot(data)#注意对象名是ax1,它是matplotlib中的axes对象类型
ax1.set_title('line chart')
ax1.set_xlabel('Year')
ax1.set_ylabel('Income')
#画ax2
ax2.boxplot(data)
ax2.set_xticks([])
ax2.set_title('box plot')
matplotlib中subplot
ax2.set_xlabel('2012~2017')
ax2.set_ylabel('Income')
#画ax3
ax3.bar(data.index, data)
ax3.set_title('bar chart')
ax3.set_xlabel('Year')
ax3.set_ylabel('Income')
#设置fig1标题
fig1.suptitle('Using matplotlib')
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']) #实例化fig1对象
fig2=plt.figure(figsize=(8,8),facecolor='w')
#实例化ax对象
ax4 = fig2.add_subplot(2,2,1)
ax5 = fig2.add_subplot(2,2,2)
ax6 = fig2.add_subplot(2,1,2)
#⽤pandas绘图并将图像回传给ax对象
#画ax4
data.plot(kind='line',ax=ax4)#注意对象名是data,它是Pandas中的Series对象类型
ax4.set_title('line chart')
ax4.set_xlabel('Year')
ax4.set_ylabel('Income')
#画ax5
data.plot(kind='box',ax=ax5)
ax5.set_xticks([])
ax5.set_title('box plot')
ax5.set_xlabel('2012~2017')
ax5.set_ylabel('Income')
#画ax6
data.plot(kind='bar',ax=ax6)
ax6.set_title('bar chart')
ax6.set_xlabel('Year')
ax6.set_ylabel('Income')
#设置fig2标题
fig2.suptitle('Using Pandas')
由上⾯的两个例⼦可以看出调⽤Pandas绘图和调⽤matplotlib绘图很多时候可以达到相同的效果
2.不同点
仔细分析画柱状图的两个语句ax3.bar(data.index, data)和data.plot(kind='bar',ax=ax6)
会发现在调⽤ax3画图的时候bar()⽅法⾥⾯有两个参量data.index和data,分别是这张图的x轴类别和y轴⾼度。
⽽⽤pandas画图的时候,我们只⽤把data对象放在前⾯,它就能⾃动识别出data⾥⾯的index和value。
从上⾯也可以看出来,对于⽤Series DataFrame这些⽤Pandas对象封装的多维的数据,调⽤Pandas绘图会有更⽅便和更好的⽀持。
下⾯再举⼀例:
我们有⼀个DataFrame类型的⼈员信息表格,每⼀⾏包含⼀个⼈的性别,收⼊等信息。现在我要按照性别分类,画出⼥性的收⼊的箱线图和男性收⼊的箱线图:
import pandas as pd
df = pd.read_csv('Data/bank-data.csv',index_col=0)
df
age sex region income married children car save_act current_act mortgage pep id
ID1210148FEMALE INNER_CITY17546.00NO1NO NO NO NO YES ID1210240MALE TOWN30085.10YES3YES NO YES YES NO ID1210351FEMALE INNER_CITY16575.40YES0YES YES YES NO NO ID1210423FEMALE TOWN20375.40YES3NO NO YES NO NO ID1210557FEMALE RURAL50576.30YES0NO YES NO NO NO .................................... ID1269661FEMALE INNER_CITY47025.00NO2YES YES YES YES NO ID1269730FEMALE INNER_CITY9672.25YES0YES YES YES NO NO
ID1269831FEMALE TOWN 15976.30YES 0YES YES NO
NO YES ID12699
29MALE INNER_CITY 14711.80YES 0NO YES NO YES NO ID12700
38
MALE
TOWN
26671.60
NO
YES
NO
YES
YES
YES
age sex region income married children
car save_act
current_act
mortgage
pep id 600 rows × 11 columns
如果要⽤matplotlib绘图的话,就必须对DataFrame进⾏有条件的筛选切⽚,选出来所有⼥性的income 列和男性的income 列,然后再画箱线图:
fig7 = plt .figure (figsize =(6,6),facecolor ='w')ax7 = plt .axes ()
ax7.boxplot ( (df .loc [df ['sex']=='FEMALE', 'income'], df .loc [df ['sex']=='MALE', 'income']), labels =('FEMALE','MALE'))id
()
如果使⽤Pandas绘图的话,只需以df 作为对象放在前⾯,调⽤boxplot()⽅法,并将'income',by='sex'填⼊参数⾥即可,相当于是Pandas⾃动帮你切⽚出income 这⼀列,并以sex 归类聚合了,⽐调⽤matplotlib⽅便不少,也直观很多:
fig8 = plt .figure (figsize =(6,6),facecolor ='w')ax8 = plt .axes ()
df .boxplot ('income',
by ='sex',ax =ax8)#对于多类别,需要聚合的数据,⽤pandas 调⽤绘图要⽐axex 调⽤绘图来得⽅便
3.总结
在⼤多数情况下我们可以选择Pandas绘图和matplotlib绘图去实现同样的功能,他们之间也有千丝万缕的联系。
在⼀些⽤Pandas封装的多维的数据(如DataFrame),调⽤Pandas绘图会有更⽅便和更好的⽀持,免去了⼿动切⽚、聚合数据等⿇烦。
觉得有⽤的话,不要吝惜评论点赞分享哦,希望⼤家多多包涵,有任何问题欢迎指正、讨论。
本⽂基于CC-BY-SA 4.0协议,欢迎转载
(博客看累了?去瞧⼀瞧?)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论