推荐使用ipython的pylab模式,如果要在ipython notebook中嵌入图片,则还需要指定pylab=inline。
In [54]:
ipython --pylab ##ipython的pylab模式
ipython notebook --pylab=inline ##notebook的inline模式
import pandas as pd
Pandas通过整合matplotlib的相关功能实现了基于DataFrame的一些作图功能。下面的数据是每年美国男女出生数据:
In [133]:
url_1 = 'http://s3.amazonaws.com/assets.datacamp.com/course/dasi/present.txt'
present = pd.read_table(url, sep=' ')
In [7]:
present.shape
Out[7]:
In [8]:
present.columns
Out[8]:
可以看到这个数据集共有63条记录,共有三个字段:Year,boys,girls。为了简化计算将year作为索引。
In [20]:
present_year = present.set_index('year')
plot是画图的最主要方法,Series和DataFrame都有plot方法。
我们可以这样看一下男生出生比例的趋势图:
In [92]:
present_year['boys'].plot()
plt.legend(loc='best')
Out[92]:
这是Series上的plot方法,通过DataFrame的plot方法,你可以将男生和女生出生数量的趋势图画在一起。
In [36]:
present_year.plot()
Out[36]:
In [53]:
present_year.girls.plot(color='g')
present_year.boys.plot(color='b')
plt.legend(loc='best')
Out[53]:
可以看到DataFrame提供plot方法与在多个Series调用多次plot方法的效果是一致。
In [71]:
present_year[:10].plot(kind='bar')
Out[71]:
plot默认生成是曲线图,你可以通过kind参数生成其他的图形,可选的值为:line, bar, barh, kde, density, scatter。
In [83]:
present_year[:10].plot(kind='bar')
Out[83]:
In [84]:
present_year[:10].plot(kind='barh')
Out[84]:
如果你需要累积的柱状图,则只需要指定stacked=True。
In [85]:
present_year[:10].plot(kind='bar', stacked=True)
Out[85]:
制作相对的累积柱状图,需要一点小技巧。
首先需要计算每一行的汇总值,可以在DataFrame上直接调用sum方法,参数为1,表示计算行的汇总。默认为0,表示计算列的汇总。
In [119]:
present_year.sum(1)[:5]
Out[119]:
有了每一行的汇总值之后,再用每个元素除以对应行的汇总值就可以得出需要的数据。这里可以使用DataFrame的div函数,同样要指定axis的值为0。
In [124]:
present_year.div(present_year.sum(1),axis=0)[:10].plot(kind='barh', stacked=True)
Out[124]:
In [138]:
present_year.plot(x='boys', y='girls', kind='scatter')
Out[138]:
我们再来载入一下鸢尾花数据。
In [137]:
url_2 = 'https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv'
iris = pd.read_csv(url_2)
iris.head(5)
Out[137]:
In [141]:
iris.corr()
Out[141]:
In [143]:
from pandas.tools.plotting import scatter_matrix
scatter_matrix(iris, alpha=0.2, figsize=(6, 6), diagonal='kde')
Out[143]:
In [139]:
iris.boxplot()
Out[139]:
通过by参数可以计算不同分组情况下,各个字段的箱图。
In [171]:
iris.boxplot(by='Name', figsize=(8, 8))
Out[171]:
In [150]:
iris.ix[:,:-1].hist()
iris.plot(kind='kde')
Out[150]:
Radviz
In [146]:
from pandas.tools.plotting import radviz
radviz(iris, 'Name')
Out[146]:
Andrews Curves
In [173]:
from pandas.tools.plotting import andrews_curves
andrews_curves(iris, 'Name')
Out[173]:
Parallel Coordinates
In [174]:
from pandas.tools.plotting import parallel_coordinates
parallel_coordinates(iris, 'Name')
Out[174]: