作者:蜇虫适航
来源:蜇虫适航
Matplotlib可以说是Python最声名远扬的可视化库了,也是Python数据分析库的“三驾马车”之一。Matplotlib是基础而非常强大的可视化库,Seaborn等好用的可视化库是在前者的基础上进行的封装。Matplotlib擅长快速出简单的图、有丰富的接口进行精细化绘图、和Numpy结合做科学可视化及三维图配合默契、三维图。但也有些缺点,如不容易基于实用目的绘制有一定难度的图表(如小提琴图等)、标签等元素需指定坐标而不能自适应优化显示、难以实现交互。
官网[1]说:
Matplotlib tries to make easy things easy and hard things possible.
越用越认可这句话,Matplotlib非常强大,Hard things是possible但并非easy and fast。
可视化基础框架
对于一个数据表df(通过pandas读入为DataFrame)来说,用Matplotlib对其进行可视化的基础框架为:
fig, ax = plt.subplots()ax.plot(df['x'],df['y'])
通过上面几行代码就可以画出df表周一到周五y指标的变化折线。
折线图绘制示例
Matplotlib其实为作图提供了两套可视化接口,分别为:
•plt.plot()
系列•fig, ax = plt.subplots(); ax.plot()
系列
根据官网教程,分别对应MATLAB的陈述式语法和面向对象写法,具体可参考tutorials:lifecycle.html[2] ,
个人理解,plt.plot()适合用于快速出图,读入一个数据表后想快速知道数据分布、指标关系等,通过plt.plot()系列语句直接出图,而ax.plot()更方便用来精细绘图,接口对各种图表元素的编辑很友好。
在Matplotlib官网搜索,通常能看到两套接口,如搜绘制饼图的关键词pie
,结果中的axes.Axes.pie对应ax.pie()的用法,pyplot.pie对应plt.pie()的函数接口。
两套接口
ax.×××()的写法看起来要写的语句多些,但这种面向对象(object-oriented)的写法通过fig, ax = plt.subplots()
建立画布(figure)和定义轴域(axes),能更明确在哪作画和映射规则,给用户更大的自由度和更精细的调参能力。Axes包含了一套坐标轴(axis),确定了x/y坐标轴之后,数值再确定对应坐标,也就唯一确定了所在位置(这是二维情况下,更高维度就会对应着更多的axis),散点图是去确定点在轴域下的位置,柱状图是确定每个柱柱所在的位置,因此一套Axes就确定了唯一的独立的图,一个画布可以有多套Axes。更具体的辨析可读姚太多啊的一篇文章[3],简单说就是ax.×××()更方便调细节,初学者尽量避免用plt.×××系列来画图。
基础图表绘制
数据可视化从目的来说,是为了更直观展示数据或数据之间的对比、分布或关联关系。散点图、折线图、柱状图、条形图、饼图、直方图是非常常用而基础的可视化图。个人认为通过画这几种基础图并调细节是很好的学可视化实践。
将数据映射为可视图表
为了整体的美观和一致性,本文都用了一套自定义配色,通过mpl.rcParams["axes.prop_cycle"] = mpl.cycler('color', ['1EAFAE', 'A3FFFF', '69FFFF'])
语句实现简单改配色,具体关于mpl.rcParams
后面再展开。
画散点图可以用两种主要的方法,scatter(x,y)
和plot(x,y,'o')
。通过ax.scatter(x,y)
绘制以x为横坐标,y为纵坐标的散点图,scatter的重要参数如下:
•x,y
:对应着x轴和y轴的数据,散点画在坐标轴里的[xi,yi]处。•s,c,alpha
: 对应散点大小(size)、颜色(color)、透明度,都可以传一个和点数量相同长度的数组,如s=df['z']
可以做气泡图,一般气泡图为了防止遮盖问题,通常设置一定的透明度,alpha的范围为0到1。c='#BA5C25'
设置点颜色,c赋值为一个数组可以做出每个点一个颜色的效果。•marker
:设置点的形状;•cmap
:颜色映射;•norm
:当颜色c为一组浮点数时,把值标准化到[0,1]做颜色映射,vmin
和vamx
参数是结合 norm
来用的;
散点图参数示例
ax.plot(x,y,'o')
也可以画散点图,ax.plot()核心是绘制坐标系下的点和点之间的连线的,当突出点的大小而省略线时,就是散点图了,同样突出线就变成了折线图。通过fmt(也就是format_string)参数来控制这些,包括点的形状、颜色、线的风格颜色等。折线图基础绘制效果可回看上一部分可视化基础框架。
plot()的常用参数如下:
•x,y
: x轴和y轴的数据,当plot()只有一个输入列表或数组时,参数被当做y轴,也就是value,x轴以索引自动生成,也就是ax.plot(y)
相当于ax.plot(range(len(y)),y)
;•fmt
: 控制x,y绘制的折线的点形状、颜色、线的风格、颜色,fmt参数可分类为三种:颜色字符、风格字符和标记字符[4];•其他的lines.Line2D支持的属性, 如color
控制线颜色,marker
控制点形状,linestyle
控制线风格类型及linewidth
控制线宽等,如果既设置了fmt
又指定了color
呢?可以实践一下,线的颜色会根据color属性最终显示。