原标题:数据可视化(二)丨使用pandas和seaborn绘图
matplotlib是一个相对底层的工具。pandas自身有内建的可视化工具。另一个库seaborn则是用来做一些统计图形。
导入seaborn会改变matlotlib默认的颜色和绘图样式,提高可读性和美感。即使不适用seaborn的API,也可以利用seaborn来提高可视化的效果。
1 Line Plots
线图
Series和DataFrame各自都有plot属性,用来做一些比较基本的绘图类型。默认,plot会绘制线图:
Series对象的index(索引),被matplotlib用来当做x轴,当然,我们也可以自己设定不这么做,use_index=False。x轴的ticks(标记)和limits(范围)能通过xticks和xlim选项来设定,而y轴的可以用yticks和ylim来设定。下面是关于plot的一些选项。
大部分的pandas绘图方法接受一个ax参数,可以作为一个matplotlib subplot对象。这给我们更强的灵活性在gird layout(网格样式)中放置subplot。
DataFrame的plot方法,会把每一列画出一条线,所有的线会画在同一个subplot(子图)上,而且可以添加legend(图例):
plot属性中,包含一组方法,来画出不同类型的绘图。例如,df.plot等同于df.plot.line。
一些额外的关键字可以在plot里设定,并会被matplotlib函数执行,所以我们可以学习matplotlib API来定制化想要的绘图。
DataFrame有一些选项在处理列的时候提供了灵活性;例如,是否把所有列都画在一个子图中,或者把不同列画在不同的子图中。下图有更多的设定:
2 Bar Plots
条形图
plot.bar和plot.barh分别绘制垂直和水平的条形图。这种情况下,series或DataFrame的index会被用来作为x(bar)或y(barh)的ticks(标记):
color='k'设置颜色为黑,而alpha=0.7则设置局部透明度(靠近1越明显,靠近0则虚化)。
对于DataFrame,条形图绘图会把每一行作为一个组画出来:
注意这里DataFrame列名的"Genus",被作为图例。
我们可以设定stacked=True,令条形图堆叠起来,能让每一行的所有值都被堆起来:
一个小窍门,在画series的值出现的频率的条形图时,可以使用value_counts: s.value_counts.plot.bar
之前我们用到过tipping(小费)数据集,假设我们想做一个堆叠的条形图,来表示在每一天,每一个大小不同的组(party)中,数据点的百分比。用read_csv导入数据,并按天数(day)和组大小(party size)做一个交叉报表(cross-tabulation):
标准化一下,让每一行的和变为1,然后绘图:
这样我们可以看出来,在周末的时候组大小(party size)是增大的。
对于需要汇总的数据,使用seaborn能方便很多。让我们试一下用seaborn,按day来查看tipping percentage(小费百分比):
seaborn的绘图函数中有一个data参数,这里可以导入pandas的DataFrame。其他参数指的是列名。因为每一天(比如一个固定的周六)可能会有多个不同的值,所以条形图表示的是tip_pct的平均值。条形图上的黑线表示95%的置信区间(confidence interval)(这个可以通过可选参数进行更改)。
seaborn.barplot有一个hue选项,这个能让我们通过一个额外的类别值把数据分开:
注意seaborn会自动更改绘图的外观:默认的调色板,绘图背景,网格颜色。我们可以自己设定不同的绘图外观,通过seaborn.set:
3 Histograms and Density Plots
柱状图和密度图
柱状图是一种条形图,不过值的频率是分割式的。数据点被分割为,离散的甚至是隔开的bin(BIN是储存箱、存放箱、垃圾箱的意思,中文实在是不好翻译,我把它理解为一个小柱子,之后就直接用bin了),而且每个bin中的数据点的数量会被画出来。用上面的tipping数据集,我们可以用plot.hist做一个柱状图来表示小费(tip)占总费用(total bill)的比例:
seaborn能更方便地绘制柱状图和概率图,通过distplot方法,这个方法可以同时绘制一个柱状图和a continuous density estimate(一个连续密度估计)。举个例子,考虑一个bimodal distribution(双峰分布,二项分布),它由连个不同的标准正态分布组成:
4 Scatter or Point Plots
散点图或点图
散点图对于检查二维数据之间的关系是非常有用的。例如,我们导入macrodata数据集,选一些参数,然后计算log differences(对数差分):
关于对数差分译者找到的一些资料:
1.取对数(log):缩小差距,减少异方差性;差分:非平缓数据变平稳的技能。
2.是原始序列的对数增长率,而且这么处理后序列会更平稳。
3.对于不平稳的时间序列,我们可以通过差分的方法使它平稳,但是差分之后的问题是有的经济意义就无法直观解释了,所以我们又有了构建协整关系这一方法。
然后我们可以利用seaborn的regplot方法,它可以产生一个散点图并拟合一条回归线:
在数据探索阶段,散点图能把一组变量之间所有的散点图都画出来,这种图被称之为pairs plot(多变量图)或scatter plot matrix(散点图矩阵)。画这样的图很麻烦,所以seaborn有一个非常方便的pairplot函数,这个函数可以把每一个参数的柱状图或密度估计画在对角线上:
这里要注意一下plot_kws关键字。这个让我们能导入设置选项,用来控制非对角线上的绘图。查看seaborn.pairplot的字符串文档查看更多的设定选项。
5 Facet Grids and Categorical Data
多面网格和类别数据
如果遇到一些数据集,需要额外分组的维度,该怎么办?一个方法是使用类别变量来把数据可视化,利用facet grid(多面网格)。seaborn有一个有用的内建函数factorplot,能简化制作各种多面图的过程:
在一个facet(面)内,不是通过time和不同的柱状颜色来分组,我们也能通过添加给每一个time值添加一行的方式来扩展多面网格:
factorplot支持其他一些绘图类型,是否有用取决于我们想要如何展示。例如,box plots(箱线图,可以展示中位数,分位数和利群店)可能是一种有效的视觉类型:
责任编辑: