pandas中的绘图函数
matplotlib实际上是一种比较低级的工具。要组装一张图表,你得用它的各种基础组件才行:数据展示(即:图表类型:线型图、柱状图、盒形图、散布图、等值线图等)、图例、标签、刻度标签以及其他注解型信息。根据数据制作一张完整图表通常都需要用到多个对象。在pandas中,我们有行标签、列标签以及分组信息(可能有)。原本利用matplotlib,制作完整图表,需要大量代码,但现在只需一两条简洁的语句就可以了。pandas有许多能够利用DataFrame对象数据组织特点来创建标准图表的高级绘图方法。
一、线型图
Series和DataFrame都有一个用于生成各类图表的plot方法。默认情况下,它们生成的是线型图。
Series对象的索引会被传给matplotlib,并用以绘制X轴。
DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例。
Series.plot方法的参数:
DataFrame还有一些对列的灵活处理的选项:
代码:
from pandas import Series,DataFrame import pandas as pd import numpy as np s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10)) s.plot() df = pd.DataFrame(np.random.randn(10, 4).cumsum(0), columns=['A', 'B', 'C', 'D'], index=np.arange(0, 100, 10)) df.plot()
线型图结果:
Series对象 DataFrame对象
二、柱状图
在生成线型图的代码中加上kind='bar'(垂直柱状图)或kind='barh'(水平柱状图),即可生成柱状图。此时,Series和DataFrame
的索引会被用作X(bar)或Y(barh)刻度:
import pandas as pd import numpy as np import matplotlib.pyplot as plt #bar plots(柱状图) fig, axes = plt.subplots(2, 1) data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop')) data.plot(kind='bar', ax=axes[0], color='k', alpha=0.7) data.plot(kind='barh', ax=axes[1], color='k', alpha=0.7) #对于DataFrame对象,柱状图会将每一行的值分为一组 df = pd.DataFrame(np.random.rand(6, 4), index=['one', 'two', 'three', 'four', 'five', 'six'], columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus')) #柱状图 df.plot(kind='bar') #堆积柱状图 df.plot(kind='bar',stacked=True)
结果:
对于 Series对象:
柱状图
对于DataFrame对象:
柱状图 堆积柱状图
三、直方图和密度图
直方图(histogram)是一种可以对值频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。
与直方图相关的一种图表是密度图,它是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正态(高斯)分布之类较为简单的分布)。因此,密度图也称作KDE(Kernel Density Estimate,核密度估计)图。调用plot时加上kind='kde'即可生成一张密度图。
import matplotlib.pyplot as plt import pandas as pd #直方图和密度图 tips = pd.read_csv('tips.csv') tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip']) #直方图 plt.figure() tips['tip_pct'].plot(kind='hist',bins=50) #密度图 plt.figure() tips['tip_pct'].plot(kind='kde')
结果显示:
直方图 密度图
四、散点图
散点图(scatter plot)是观察两个一维数据序列之间的关系的有效手段。matplotlib的scatter方法是绘制散点图的主要方法。
import numpy as np import matplotlib.pyplot as plt #散点图 data=DataFrame({'x':np.random.randn(100),'y':np.random.randn(100)}) plt.scatter(data['x'],data['y']) plt.title("random scatter plot")
结果: