回顾
在走进走进Matplotlib世界(四)中,我们介绍了Matplotlib中的子图以及它的三种创建方式。今天我们来看一下基本图表的几种类型:线状图、柱状图、直方图和密度图。
线状图
线状图又称为曲线图,是最简单的图形。这种图形清楚地记录变动过程,以点标示变化,并连点成线。 在Matplotlib中,plot方法默认生成的就是线状图。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data = pd.Series(np.random.randn(10))# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)ax.plot(data)# 4、自定义设置ax.set_xlabel('x')ax.set_ylabel('y')# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
利用Pandas的Series方法生成一组数据,然后读取后使用plot方法直接生成线状图,运行结果如下图所示。
柱状图
柱状图是一种以长方形的长度为变量的图表,由一系列高度不等的纵向条纹表示数据分布的情况,可以用来同时比较多个事物的变化,通常利用于较小的数据集分析。在Matplotlib中,柱状图的创建方法有两种:plot(kind='bar')或plot.bar()。
首先看第一种方法,我们分别创建一个单系列柱状图和多系列柱状图。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data1 = pd.Series(np.random.randn(10))data2 = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))# 2、创建图像fig, axes = plt.subplots(1, 2, figsize=(12, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax1 = axes[0]ax2 = axes[1]data1.plot(kind='bar', ax=ax1)data2.plot(kind='bar', ax=ax2)# 4、自定义设置ax1.set_title('No.1')ax2.set_title('No.2')# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
利用Pandas的Series和DataFrame方法分别生成一组单系列数据和多系列数据,然后使用plot(kind='bar')创建柱状图。运行结果如下图所示。如果创建的时候未指定color属性,柱状图的颜色是随机生成的。在多系列柱状图中,会自动显示图例。
第二种方法只需要将上面代码中的data1.plot(kind='bar', ax=ax1)、data2.plot(kind='bar', ax=ax2)改成data1.plot.bar(ax=ax1)、data2.plot.bar(ax=ax2)就可以了。
柱状图除了纵向排列外,有时也会用到横向排列进行比较。要使用横向排列只需要将kind='bar'或bar()换成kind='barh'或barh()即可,这里以barh()为例。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data1 = pd.Series(np.random.randn(10))data2 = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))# 2、创建图像fig, axes = plt.subplots(1, 2, figsize=(12, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax1 = axes[0]data1.plot.barh(ax=ax1)ax2 = axes[1]data2.plot.barh(ax=ax2)# 4、自定义设置# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
运行后柱状图就变成横向展示了。
柱形图还可以设置成堆叠的形式,我们将上述的多系列柱状图修改成堆叠形式,只需要将stacked属性设置成True即可。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data = pd.DataFrame(np.random.rand(10, 4), columns=list('abcd'))# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)data.plot.bar(ax=ax, stacked=True)# 4、自定义设置ax.set_xlabel('x')ax.set_ylabel('y')# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
堆叠后同一个分类下的数据不再是依次排列而是依次从上到下堆叠在一起。
柱状图的主要作用是比较数据,观察柱状图的高度就可以判断数据的大小,但有时候两组数据非常接近时,肉眼无法通过观察高度判断大小,这时我们可以通过text()给柱状图添加文本。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据x = np.arange(10)y = np.random.rand(10)# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)ax.bar(x, y, width=1, facecolor='yellowgreen', edgecolor='white')# 4、自定义设置ax.set_xlabel('x')ax.set_ylabel('y')for i, j in zip(x, y): ax.text(i, j, '%.2f'%j, ha='center', va='bottom', fontsize=7)# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
通过for循环给每个柱体添加值,i,j确定文本位置,然后设置文本显示格式,ha和va分别表示水平和垂直方向上的显示方式,fontsize设置字体大小,还可以根据喜好设置字体颜色等。
直方图
直方图又称为质量分布图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。直方图跟柱状图很类似,通常也可以将直方图当作是柱状图的一种,但柱状图主要用来比较数据的大小,而直方图的主要目的是展示数据的分布。
和柱状图一样,直方图也可以通过plot(kind='hist')或plot.hist()两种方法进行创建,我们以plot.hist()为例。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data = pd.Series(np.random.randn(1000))# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)data.hist(ax=ax, bins=20, histtype='bar', align='mid', orientation='vertical', normed=True)# data.plot(kind='kde', style='k--')# 4、自定义设置ax.set_title('hist')# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
bins表示边数,给定bins,返回bins+1条边, 也即bins个矩形。histtype是直方图的类型,共有四种,bar传统条形直方图,barstacked堆叠条形直方图,step未填充的线图,stepfilled填充的线图,默认为bar。align设置直方图的对齐方式。orientation设置直方图纵向vertical或横向horizontal展示。normed是标准化,将数据标准化为0-1之间的数。
直方图同样也可以堆叠,方法与柱状图一样,只要设置stacked属性为True即可。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data = pd.DataFrame(np.random.randn(1000, 4), columns=list('abcd'))# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)data.plot.hist(ax=ax, stacked=True, bins=20, histtype='bar', align='mid', orientation='vertical')# 4、自定义设置ax.set_title('hist')# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
运行结果如下。
密度图
密度图是一种表现与数据值对应的边界或域对象的理论图形表示方法,一般用于呈现连续变量。 在图表展示中,密度图通常会与直方图一起出现进行展示。密度图用plot(kind='kde')或plot.kde()创建。
# 0、导入包import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 1、准备数据data = pd.Series(np.random.randn(1000))# 2、创建图像fig = plt.figure(figsize=(5, 5), facecolor=(0, 1, 0, 1))# 3、绘图ax = fig.add_subplot(111)data.plot.hist(ax=ax, bins=20, histtype='bar', align='mid', orientation='vertical', normed=True)data.plot.kde(ax=ax, ylim=(0, 1), style='k--')# 4、自定义设置ax.set_title('hist')# 5、保存图像# plt.savefig('xxx.png')# 6、显示图像plt.show()
运行后可以看到,密度图反映了我们创建的数据是服从正态分布的。
图表的类型还有很多种,下次我们再继续讨论其他类型的图表。