一、pandas绘图
前面讲过matplotlib的相关教程,matplotlib虽然功能强大,但是matplotlib相对而言较为底层,画图时步骤较为繁琐,比较麻烦,因为要画一张完整的图表,需要实现很多的基本组件,比如图像类型、刻度、标题、图例、注解等等。目前有很多的开源框架所实现的绘图功能是基于matplotlib的,pandas便是其中之一,对于pandas数据,直接使用pandas本身实现的绘图方法比matplotlib更加方便简单。
二、pandas绘图的基本接口
pandas的两类基本数据结构series和dataframe都提供了一个统一的接口plot(),该函数的定义如下所示:我们经常看见这样的操作方式,比如 df.plot()或者是series.plot()当我们查看该函数的定义的时候却查不到,这是为什么呢?plot的本质又是什么呢?
1、对于Series对象而言:
plot = CachedAccessor("plot", gfx.SeriesPlotMethods)
plot本质上是一个SeriesPlotMethods类型的一个对象,而为什么可以直接调用plot()呢,是因为SeriesPlotMethods类实现了对象调用的方法__call__(),查看定义可得:
class SeriesPlotMethods(BasePlotMethods):
"""Series plotting accessor and method
Examples
--------
>>> s.plot.line()
>>> s.plot.bar()
>>> s.plot.hist()
Plotting methods can also be accessed by calling the accessor as a method
with the ``kind`` argument:
``s.plot(kind='line')`` is equivalent to ``s.plot.line()``
"""
def __call__(self, kind='line', ax=None,
figsize=None, use_index=True, title=None, grid=None,
legend=False, style=None, logx=False, logy=False,
loglog=False, xticks=None, yticks=None,
xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False,
yerr=None, xerr=None,
label=None, secondary_y=False, **kwds):
return plot_series(self._data, kind=kind, ax=ax, figsize=figsize,
use_index=use_index, title=title, grid=grid,
legend=legend, style=style, logx=logx, logy=logy,
loglog=loglog, xticks=xticks, yticks=yticks,
xlim=xlim, ylim=ylim, rot=rot, fontsize=fontsize,
colormap=colormap, table=table, yerr=yerr,
xerr=xerr, label=label, secondary_y=secondary_y,
**kwds)
--------
绘图时函数的各个参数的解释:
kind:画图的种类,可以是 line(默认),
ax:要在其上进行绘制的matplotlib.subplot对象,如果没有,则使用默认的subplot对象。
- ‘bar’ or ‘barh’ for bar plots,bar表示垂直柱状图,barh表示水平柱状图
- ‘hist’ for histogram
- ‘box’ for boxplot
- ‘kde’ or ‘density’ for density plots。即Kernel Density Estimate 和密度估计,常常与hist一起混合使用。
- ‘area’ for area plots
- ‘scatter’ for scatter plots
- ‘hexbin’ for hexagonal bin plots
- ‘pie’ for pie plots
figsize:图像尺寸
use_index:True(默认),False。表示默认情况下,会将series和dataframe的index传给matplotlib,用已绘制X轴。
title:标题
grid:网格
legend:图例
style,绘图的风格,如‘ko--’
logx:在X轴上使用对数标尺
logy: 在Y轴上使用对数标尺
loglog:
xticks=None,用做x刻度的值
yticks=None,用做Y轴刻度的值
xlim=None, X轴的界限如【0,10】
ylim=None,Y轴的界限
rot=None, 旋转刻度标签 0-360
fontsize=None,
colormap=None,
table=False,
yerr=None,
xerr=None,
label=None,
secondary_y=False, **kwds):
---------------------------------------------------------------------------------------------------------------------
下面几个是DataFrame特有的
sharex: 共用X轴
sharey:
总结:上面只是一些基本的图像参数设置,再具体绘制每一种图形的时候,还有具体对应的相关设置,这里就不一一列举了,在实际的图像中遇到了在进行讲解。
2、对于DataFrame数据结构而言:
plot = CachedAccessor("plot", gfx.FramePlotMethods)
plot本质上是一个FramePlotMethods类型的一个对象,而为什么可以直接调用plot()呢,是因为FramePlotMethods类实现了对象调用的方法__call__(),相关的定义和函数接口和上面的SeriesPlotMethods类型的定义大致差不多,这里就不在叙述了。
总结:通过上面的原理解释,现在明白了为什么
s.plot(kind='line') 和s.plot.line()这两者是等价的了,因为,前者的plot()是作为对象调用的,本质上plot是一个对象,而line、bar等则是类所实现的方法,当然能够通过plot对象去调用了。
总结:除了上面一些常见的基本图形以外,dataframe还可以绘制如下一些图形
These include:
- Scatter Matrix
- Andrews Curves
- Parallel Coordinates
- Lag Plot
- Autocorrelation Plot
- Bootstrap Plot
- RadViz
具体每一种的含义这里先不讨论。
三、pandas绘图实例
1、bar条形图
bar()函数有一个重要的参数,stacked,默认为false,表示不堆积,设置为true则表示为堆积。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot.bar()
plt.show()
2、histogram
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df4.plot.hist(alpha=0.5)
plt.show()
3、box绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()
plt.show()
4、area绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()
plt.show()
5、Hexagonal Bin Plot
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])
df['b'] = df['b'] + np.arange(1000)
df.plot.hexbin(x='a', y='b', gridsize=25)
plt.show()
总结:熟练使用pandas绘图在使用pandas进行数据分析的时候非常方便。
上面每一种绘图方法对应有一系列的参数设置,但是通过转到定义,并不能查看到究竟有哪一些参数可以设置,只得到下面这一句话:
def bar(self, **kwds):
"""
Vertical bar plot
Parameters
----------
`**kwds` : optional
Additional keyword arguments are documented in
:meth:`pandas.Series.plot`.
故而详细的参数列表究竟在哪里我还没找到,如果哪位大神世道在哪里查看每一种绘图函数的详细参数列表,望告知!