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")
结果: