目录
9.1.2 颜色color、标记marker和线类型linestyle
第9章 绘图与可视化
9.1 简明matplotlib API入门
导包:
import matplotlib.pyplot as plt
9.1.1 图片与子图
matplotlib所绘制的图位于图片(Figure)对象中。
可以使用plt.figure生成一个新的图片:
不能使用空白的图片进行绘图。需要使用add_subplot创建一个或多个子图(subplot):
ax1 = fig.add_subplot(2,2,1)
上面代码的意思是图片应该是2×2的(最多四个图形),并且我们选择了四个图形中的第一个(序号从1开始)。
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
效果如下,得到三个子图的空白图片:
使用Jupyter notebook时有个细节需要注意,在每个单元格运行后,图表被重置,因此对于更复杂的图表,你必须将所有的绘图命令放在单个的notebook单元格中。
如下所示:
fig.add_subplot返回的对象是Axes Subplot对象,使用这些对象你可以直接在其他空白的子图上调用对象的实例方法进行绘图:
matplotlib包含了一个便捷方法plt.subplots,它创建一个新的图片,然后返回包含了已生成子图对象的NumPy数组:
pyplot.subplots选项:
调整子图周围的间距
默认情况下,matplotlib会在子图的外部和子图之间留出一定的间距。
可以使用图对象上的subplots_adjust方法更改间距,也可以用作顶层函数:
wspace和hspace分别控制的是图片的宽度和高度百分比,以用作子图间的间距。
如图将子图之间的距离变为0:
9.1.2 颜色color、标记marker和线类型linestyle
matplotlib的主函数plot接收带有x和y轴的数组以及一些可选的字符串缩写参数来指明颜色和线类型。
例如,字符串形式,要用绿色破折号绘制x对y的线,你需要执行:
ax.plot(x,y,'g--)
同样的图表可以使用更为显式的方式来表达:
ax.plot(x,y,linestyle='--',color='g')
折线图还可以有标记用来凸显实际的的数据点。
由于matplotlib创建了一个连续性折线图,插入点之间有时并不清除点在哪。
标记可以是样式字符串的一部分,样式字符串中线类型、标记类型必须跟在颜色后面:
显式写法:
对于折线图,你会注意到后续的点默认是线性内插的。可以通过drawstyle选项进行更改:
由于我们向plot传递了label,我们可以使用plt.legend为每条线生成一个用于区分的图例。
9.1.3 刻度、标签和图例
对于大多数图表修饰工作,有两种主要的方式:使用程序性的pyplot接口(即matplotlib.pyplot)和更多面向对象的原生matplotlib API。
pyplot接口设计为交互式使用,包含了像xlim、xticks和xticklabels等方法。这些方法分别控制了绘图范围、刻度位置以及刻度标签。我们可以在两种方式中使用:
· 在没有函数参数的情况下调用,返回当前的参数值(例如plt.xlim()返回当前的x轴绘图范围)。
· 传入参数的情况下调用,并设置参数值(例如plt.xlim([0, 10])会将x轴的范围设置为0到10)。
9.1.3.1 设置标题、轴标签、刻度和刻度标签
示例:
要改变x轴刻度,最简单的方式是使用set_xticks和set_xticklabels。
set_xticks表示在数据范围内设定刻度的位置,默认情况下,这些刻度也有标签。
但是我们可以使用set_xticklabels为标签赋值:
#rotation选项会将x轴刻度标签旋转30度
ticks = ax.set_xticks([0,250,500,750,1000])
labels = ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')
set_xlabel会给x轴一个名称, set_title会给子图一个标题:
修改y轴坐标是相同过程,将上面示例中的x替换成y即可。
轴的类型拥有一个set方法,允许批量设置绘图属性。
props = {
'title' = 'plot'
'xlabel' = 'Stages'
}
ax.set(**props)
9.1.3.2 添加图例
最简单的方式是在添加每个图表时传递label参数:
如果取消图例中的元素,不要传入label参数或者传入label='_nolegend_'。
9.1.4 注释与子图加工
除了标准的绘图类型,你可能还会想在图表上绘制自己的注释,而且注释中可能会包含文本、箭头以及其他图形。
你可以使用text、arrow和annote方法来添加注释和文本。
示例:
matplotlib含有表示多种常见图形的对象,这些对象的引用是patches。
一些图形,比如Rectangle(矩形)和Circle(圆形),可以在matplotlib.pyplot中找到,但图形的全集位于matplotlib.patches。
想在图表中添加图形时,你需要生成patch(补丁)对象shp,并调用ax.add_patch(shp)将它加入到子图中:
9.1.5 将图片保存到文件
可以使用plt.savefig将活动图片保存到文件。
将图片保存为SVG:
plt.savefig('figpath.svg')
常常使用几个重要的选项来发布图形:dpi,它控制每英寸点数的分辨率;bbox_inches,可以修剪实际图形的空白。
为了得到同样一个PNG图片,且使用最小的空白,拥有400 DPI,运行以下代码:
plt.savefig('figpath.png',dpi=400,bbox_inches='tight')
saveifg并非一定是写到硬盘的,它可以将图片写入到所有的文件型对象中,例如BytesIO:
savefig选项列表:
9.2 使用pandas和seaborn绘图
9.2.1 折线图
Series和DataFrame都有一个plot属性,用于绘制基本的图形。
默认情况下,plot()绘制的是折线图(见图):
Series对象的索引传入matplotlib作为绘图的x轴,可以通过传入use_index=False来禁用这个功能。
x轴的刻度和范围可以通过xticks和xlim选项进行调整,相应地y轴使用yticks和ylim进行调整。
大部分pandas的绘图方法,接收可选的ax参数,该参数可以是一个matplotlib子图对象。这使你可以更为灵活地在网格布局中放置子图。
DataFrame的plot方法在同一个子图中将每一列绘制为不同的折线,并自动生成图例:
Series.plot方法参数:
DataFrame的plot参数:
9.2.2 柱状图
plot.bar()和plot.barh()可以分别绘制垂直和水平的柱状图。
在绘制柱状图时, Series或DataFrame的索引将会被用作x轴刻度(bar)或y轴刻度(barh)
在DataFrame中,柱状图将每一行中的值分组到并排的柱子中的一组:
注意DataFrame的列名称"Genus"被用作了图例标题
可以通过传递stacked=True来生成堆积柱状图,会使得每一行的值堆积在一起:
假设我们想要绘制一个堆积柱状图,用于展示每个派对在每天的数据点占比。使用read_csv载入数据,并根据星期日期和派对规模形成交叉表:
进行标准化以确保每一行的值和为1,然后进行绘图:
对于在绘图前需要聚合或汇总的数据,使用seaborn包会使工作更为简单。
使用seaborn进行按星期日期计算小费百分比:
seaborn中的绘图函数使用一个data参数,这个参数可以是pandas的DataFrame。
其他的参数则与列名有关。
因为day列中有多个观测值,柱子的值是tip_pct的平均值。
柱子上画出的黑线代表的是95%的置信区间(置信区间可以通过可选参数进行设置)。
seaborn.barplot拥有一个hue选项,允许我们通过一个额外的分类值将数据分离:
请注意seaborn自动改变了图表的美观性:默认的调色板、图背景和网格线条颜色。你可以使用seaborn.set在不同的绘图外观中进行切换:
sns.set(style='whitegrid')
9.2.3 直方图和密度图
直方图是一种条形图,用于给出值频率的离散显示。
数据点被分成离散的,均匀间隔的箱,并且绘制每个箱中数据点的数量。
可以使用Series的plot.hist方法制作小费占总费用百分比的直方图:
密度图是一种与直方图相关的图表类型,它通过计算可能产生观测数据的连续概率分布估计而产生。
通常的做法是将这种分布近似为“内核”的混合,也就是像正态分布那样简单的分布。因此,密度图也被称为内核密度估计图(KDE)。
distplot方法可以绘制直方图和连续密度估计,通过distplot方法seaborn使直方图和密度图的绘制更为简单,考虑由两个不同的标准正态分布组成的双峰分布:
9.2.4 散点图或点图
点图或散点图可以用于检验两个一维数据序列之间的关系。
例如,这里我们从statsmodels项目中载入了macrodata数据集,并选择了一些变量,之后计算对数差:
使用seaborn的regplot方法,该方法可以绘制散点图,并拟合出一个条线性回归线:
在探索性数据分析中,能够查看一组变量中的所有散点图是有帮助的,这被称为成对图或散点图矩阵。
从头开始绘制这样一个图是有点工作量的,所以seaborn有一个方便的pairplot函数,它支持在对角线上放置每个变量的直方图或密度估计值:
plot_ksw参数使我们能够将配置选项传递给非对角元素上的各个绘图调用。
9.2.5 分面网格和分类数据
使用分面网格是利用多种分组变量对数据进行可视化的方式。
seaborn拥有一个有效的内建函数factorplot,它可以简化多种分面绘图,如下按星期/时间/是否吸烟划分的小费百分比:
factorplot支持其他可能有用的图类型,具体取决于你要显示的内容。
例如,箱形图(显示中位值、四分位数和异常值)可以是有效的可视化类型:
具体请查看更多的seaborn文档(https://seaborn.pydata.org/)。
参考书籍
--《利用Python实现数据分析》