Visualization

原文:http://pandas.pydata.org/pandas-docs/stable/visualization.html

译者:飞龙 UsyiyiCN

校对:(虚位以待)

我们使用标准约定引用matplotlib API:

In [1]: import matplotlib.pyplot as plt

本文档中的绘图使用matplotlib的ggplot样式(版本1.4中的新功能):

import matplotlib
matplotlib.style.use('ggplot')

通过建立pandas格式的面板数据,我们可以轻松将其可视化。有关超出此处记录的基础知识的可视化库,请参阅ecosystem部分。

注意

np.random的所有调用都使用123456进行播种。

Basic Plotting: plot

有关某些高级策略,请参阅cookbook

Series和DataFrame上的plot方法只是plt.plot()的一个简单包装:

In [2]: ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

In [3]: ts = ts.cumsum()

In [4]: ts.plot()
Out[4]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26d422750>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_plot_basic.png

如果索引由日期组成,它会调用gcf().autofmt_xdate()尝试按上述格式很好地格式化x轴。

在DataFrame上,plot()是方便绘制所有带标签的列:

In [5]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))

In [6]: df = df.cumsum()

In [7]: plt.figure(); df.plot();
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_basic.png

您可以使用plot()中的xy关键字绘制一列与另一列:

In [8]: df3 = pd.DataFrame(np.random.randn(1000, 2), columns=['B', 'C']).cumsum()

In [9]: df3['A'] = pd.Series(list(range(len(df))))

In [10]: df3.plot(x='A', y='B')
Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2667845d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/df_plot_xy.png

注意

有关更多格式和样式选项,请参阅下面的below

Other Plots

绘图方法允许使用除默认线图外的一些绘图样式。这些方法可以作为plot()kind关键字参数提供。这些包括:

例如,可以通过以下方式创建条形图:

In [11]: plt.figure();

In [12]: df.ix[5].plot(kind='bar'); plt.axhline(0, color='k')
Out[12]: <matplotlib.lines.Line2D at 0x7ff266b33890>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/bar_plot_ex.png

版本0.17.0中的新功能。

您还可以使用方法DataFrame.plot.<kind>创建这些其他图,而不是提供kind关键字参数。这使得更容易发现绘图方法和他们使用的具体参数:

In [13]: df = pd.DataFrame()

In [14]: df.plot.<TAB>
df.plot.area     df.plot.barh     df.plot.density  df.plot.hist     df.plot.line     df.plot.scatter
df.plot.bar      df.plot.box      df.plot.hexbin   df.plot.kde      df.plot.pie

除了这些kind,还有DataFrame.hist()DataFrame.boxplot()方法,它们使用单​​独的接口。

最后,在pandas.tools.plotting中有一些plotting functions,以SeriesDataFrame这些包括

绘图也可以用errorbarstables来装饰。

Bar plots

对于带标签的非时间序列数据,您可能希望产生条形图:

In [15]: plt.figure();

In [16]: df.ix[5].plot.bar(); plt.axhline(0, color='k')
Out[16]: <matplotlib.lines.Line2D at 0x7ff2673d3510>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/bar_plot_ex.png

调用DataFrame的plot.bar()方法会产生多条形图:

In [17]: df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])

In [18]: df2.plot.bar();
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/bar_plot_multi_ex.png

要生成堆叠棒图,请传递stacked=True

In [19]: df2.plot.bar(stacked=True);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/bar_plot_stacked_ex.png

要获取水平条形图,请使用barh方法:

In [20]: df2.plot.barh(stacked=True);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/barh_plot_stacked_ex.png

Histograms

版本0.15.0中的新功能。

直方图可以使用DataFrame.plot.hist()Series.plot.hist()方法绘制。

In [21]: df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
   ....:                     'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
   ....: 

In [22]: plt.figure();

In [23]: df4.plot.hist(alpha=0.5)
Out[23]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26779c3d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/hist_new.png

直方图可以通过stacked=True堆叠。Bin大小可以通过bins关键字更改。

In [24]: plt.figure();

In [25]: df4.plot.hist(stacked=True, bins=20)
Out[25]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26caf76d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/hist_new_stacked.png

您可以传递由matplotlib hist支持的其他关键字。例如,水平和累积的histgram可以通过orientation='horizontal'cumulative='True'来绘制。

In [26]: plt.figure();

In [27]: df4['a'].plot.hist(orientation='horizontal', cumulative=True)
Out[27]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c2c89d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/hist_new_kwargs.png

有关更多信息,请参阅hist方法和matplotlib hist文档

现有的界面DataFrame.hist仍然可以使用绘制直方图。

In [28]: plt.figure();

In [29]: df['A'].diff().hist()
Out[29]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2770919d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/hist_plot_ex.png

DataFrame.hist()在多个子图上绘制列的直方图:

In [30]: plt.figure()
Out[30]: <matplotlib.figure.Figure at 0x7ff26d67c090>

In [31]: df.diff().hist(color='k', alpha=0.5, bins=50)
Out[31]: 
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7ff2726264d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff2667c8390>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ff266667a50>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff2671545d0>]], dtype=object)
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_hist_ex.png

版本0.10.0中的新功能。

可以指定by关键字绘制分组的直方图:

In [32]: data = pd.Series(np.random.randn(1000))

In [33]: data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4))
Out[33]: 
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7ff266750690>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26c71e110>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ff26735f750>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26c2fe650>]], dtype=object)
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/grouped_hist.png

Box Plots

版本0.15.0中的新功能。

Boxplot可以绘制为调用Series.plot.box()DataFrame.plot.box()DataFrame.boxplot()每列中的值的分布。

例如,这里是一个箱线图,表示在[0,1]上的一个均匀随机变量的10次观察的五次试验。

In [34]: df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])

In [35]: df.plot.box()
Out[35]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff27132a050>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/box_plot_new.png

Boxplot可以通过传递color关键字来着色。您可以传递boxeswhiskersmedianscapsdict如果dict中缺少某些键,则默认颜色将用于相应的艺术家。此外,boxplot还有sym关键字来指定flier样式。

When you pass other type of arguments via color keyword, it will be directly passed to matplotlib for all the boxes, whiskers, medians and caps colorization.

颜色应用于每个要绘制的框。如果您想要更复杂的着色,可以通过传递return_type来获取每个绘制的艺术家。

In [36]: color = dict(boxes='DarkGreen', whiskers='DarkOrange',
   ....:              medians='DarkBlue', caps='Gray')
   ....: 

In [37]: df.plot.box(color=color, sym='r+')
Out[37]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c76b890>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/box_new_colorize.png

此外,您可以传递由matplotlib boxplot支持的其他关键字。例如,水平和自定义盒线图可以由vert=Falsepositions关键字绘制。

In [38]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])
Out[38]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c1f2dd0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/box_new_kwargs.png

有关更多信息,请参阅boxplot方法和matplotlib boxplot文档

现有的接口DataFrame.boxplot仍然可以使用绘图箱图。

In [39]: df = pd.DataFrame(np.random.rand(10,5))

In [40]: plt.figure();

In [41]: bp = df.boxplot()
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/box_plot_ex.png

您可以使用by关键字参数创建分层箱形图以创建分组。例如,

In [42]: df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )

In [43]: df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])

In [44]: plt.figure();

In [45]: bp = df.boxplot(by='X')
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/box_plot_ex2.png

您还可以传递要绘制的列的子集,以及按多个列分组:

In [46]: df = pd.DataFrame(np.random.rand(10,3), columns=['Col1', 'Col2', 'Col3'])

In [47]: df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])

In [48]: df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])

In [49]: plt.figure();

In [50]: bp = df.boxplot(column=['Col1','Col2'], by=['X','Y'])
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/box_plot_ex3.png

警告

默认值从版本0.19.0中的'dict'更改为'axes'

boxplot中,返回类型可以通过return_type关键字控制。有效的选项是{“axes”, “dict”, “both”, None} DataFrame.boxplotby关键字创建的面,也会影响输出类型:

return_type= 方面 输出类型
None 没有
None 轴的2-D阵列
'axes' 没有
'axes' 系列轴
'dict' 没有 艺术家的话
'dict' 系列的艺术家
'both' 没有 namedtuple
'both' namedtuples系列

Groupby.boxplot始终返回一系列return_type

In [51]: np.random.seed(1234)

In [52]: df_box = pd.DataFrame(np.random.randn(50, 2))

In [53]: df_box['g'] = np.random.choice(['A', 'B'], size=50)

In [54]: df_box.loc[df_box['g'] == 'B', 1] += 3

In [55]: bp = df_box.boxplot(by='g')
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/boxplot_groupby.png

相比于:

In [56]: bp = df_box.groupby('g').boxplot()
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/groupby_boxplot_vis.png

Area Plot

版本0.14中的新功能。

您可以使用Series.plot.area()DataFrame.plot.area()创建面积图。默认情况下,区域图被堆叠。为了产生堆积面积图,每列必须是正值或全部负值。

当输入数据包含NaN时,它将自动填充0。如果要通过不同的值删除或填充,请在调用plot之前使用dataframe.dropna()dataframe.fillna()

In [57]: df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])

In [58]: df.plot.area();
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/area_plot_stacked.png

要生成未堆叠的绘图,请传递stacked=False除非另有说明,Alpha值设置为0.5:

In [59]: df.plot.area(stacked=False);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/area_plot_unstacked.png

Scatter Plot

版本0.13中的新功能。

散点图可以使用DataFrame.plot.scatter()方法绘制。散点图需要x和y轴的数字列。这些可以由xy关键字指定。

In [60]: df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])

In [61]: df.plot.scatter(x='a', y='b');
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/scatter_plot.png

要在单个轴上绘制多个列组,请重复plot方法指定目标ax建议指定colorlabel关键字以区分每个组。

In [62]: ax = df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1');

In [63]: df.plot.scatter(x='c', y='d', color='DarkGreen', label='Group 2', ax=ax);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/scatter_plot_repeated.png

可以给出关键字c作为为每个点提供颜色的列的名称:

In [64]: df.plot.scatter(x='a', y='b', c='c', s=50);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/scatter_plot_colored.png

您可以传递由matplotlib scatter支持的其他关键字。下面的示例显示了将气泡大小用于数据框列值的气泡图。

In [65]: df.plot.scatter(x='a', y='b', s=df['c']*200);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/scatter_plot_bubble.png

有关更多信息,请参阅scatter方法和matplotlib scatter文档

Hexagonal Bin Plot

版本0.14中的新功能。

您可以使用DataFrame.plot.hexbin()创建六边形面元图。如果数据太密集,则Hexbin图可能是散点图的有用替代方法,无法单独绘制每个点。

In [66]: df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])

In [67]: df['b'] = df['b'] + np.arange(1000)

In [68]: df.plot.hexbin(x='a', y='b', gridsize=25)
Out[68]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2713ce350>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/hexbin_plot.png

一个有用的关键字参数是gridsize;它控制x方向上的六边形数量,默认为100。较大的gridsize意味着更多,更小的bin。

默认情况下,计算每个(x, y)点的计数的直方图。您可以通过将值传递到Creduce_C_function参数来指定备用聚合。C指定每个(x, y)点和reduce_C_function将一个bin中的所有值减少为单个数字的一​​个参数的函数(例如meanmaxsumstd)。在该示例中,位置由列ab给出,而值由列z给出。这些bin与numpy的max函数聚合。

In [69]: df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])

In [70]: df['b'] = df['b'] = df['b'] + np.arange(1000)

In [71]: df['z'] = np.random.uniform(0, 3, 1000)

In [72]: df.plot.hexbin(x='a', y='b', C='z', reduce_C_function=np.max,
   ....:         gridsize=25)
   ....: 
Out[72]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2669b58d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/hexbin_plot_agg.png

有关详细信息,请参阅hexbin方法和matplotlib hexbin文档

Pie plot

版本0.14中的新功能。

您可以使用DataFrame.plot.pie()Series.plot.pie()创建饼图。如果您的数据包含任何NaN,它们将自动填充0。如果数据中有任何负值,则会引发ValueError

In [73]: series = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')

In [74]: series.plot.pie(figsize=(6, 6))
Out[74]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c8ac210>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_pie_plot.png

对于饼图,最好使用正方形的数字,一个具有相等的宽高比。您可以通过在返回的axes对象上调用ax.set_aspect('equal')创建具有相等宽度和高度的图形,或强制绘制后的宽高比相等。

请注意,DataFrame的饼形图需要您通过y参数或subplots=True指定目标列。指定y时,将绘制所选列的饼图。如果指定subplots=True,则每个列的饼图将绘制为子图。默认情况下,每个饼图中将绘制一个图例;指定legend=False以隐藏它。

In [75]: df = pd.DataFrame(3 * np.random.rand(4, 2), index=['a', 'b', 'c', 'd'], columns=['x', 'y'])

In [76]: df.plot.pie(subplots=True, figsize=(8, 4))
Out[76]: 
array([<matplotlib.axes._subplots.AxesSubplot object at 0x7ff26c896f50>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26ceb2750>], dtype=object)
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/df_pie_plot.png

您可以使用labelscolors关键字来指定每个楔形的标签和颜色。

警告

大多数熊猫图使用labelcolor参数(注意缺少“s”)。要与matplotlib.pyplot.pie()保持一致,您必须使用labelscolors

如果您要隐藏楔形标签,请指定labels=None如果指定fontsize,则该值将应用于楔形标签。此外,还可以使用matplotlib.pyplot.pie()支持的其他关键字。

In [77]: series.plot.pie(labels=['AA', 'BB', 'CC', 'DD'], colors=['r', 'g', 'b', 'c'],
   ....:                 autopct='%.2f', fontsize=20, figsize=(6, 6))
   ....: 
Out[77]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff270fede50>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_pie_plot_options.png

如果传递总和小于1.0的值,则matplotlib绘制一个半圆。

In [78]: series = pd.Series([0.1] * 4, index=['a', 'b', 'c', 'd'], name='series2')

In [79]: series.plot.pie(figsize=(6, 6))
Out[79]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c39e9d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_pie_plot_semi.png

有关更多信息,请参阅matplotlib饼文档

Plotting with Missing Data

Pandas试图做实用的绘制包含缺失数据的DataFrames或Series。根据绘图类型,丢弃,舍弃或填充缺失值。

绘图类型 NaN处理
线 在NaNs处留下空隙
线(堆叠) 填充0
柱形图 填充0
散点图 去除NANS
直方图 去除NaNs(逐列)
箱图 删除NaNs(逐列)
面积图 填充0
KDE 删除NaNs(逐列)
Hexbin 删除NaNs
饼图 填充0

如果任何这些默认值不是你想要的,或者如果你想明确如何处理缺失值,可以在绘图前使用fillna()dropna()

Plotting Tools

这些函数可以从pandas.tools.plotting导入,并以SeriesDataFrame作为参数。

Scatter Matrix Plot

新版本0.7.3.

您可以使用pandas.tools.plotting中的scatter_matrix方法创建散点图矩阵:

In [80]: from pandas.tools.plotting import scatter_matrix

In [81]: df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])

In [82]: scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='kde')
Out[82]: 
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7ff26def9410>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff2705099d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26cff4050>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26e422990>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ff26e1ffe10>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26d005250>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff2701eb2d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26d058090>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ff267867110>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff2679232d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff271ddb290>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26ee92210>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ff26ddd2350>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26e2142d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26df3d0d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ff26d59c2d0>]], dtype=object)
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/scatter_matrix_kde.png

Density Plot

版本0.8.0中的新功能。

您可以使用Series.plot.kde()DataFrame.plot.kde()方法创建密度图。

In [83]: ser = pd.Series(np.random.randn(1000))

In [84]: ser.plot.kde()
Out[84]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff266c28d10>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/kde_plot.png

Andrews Curves

安德鲁斯曲线允许将多变量数据绘制为使用样本的属性作为傅里叶级数系数​​创建的大量曲线。通过为每个类不同地着色这些曲线,可以可视化数据聚类。属于相同类别的样品的曲线通常更靠近在一起并形成更大的结构。

注意:“Iris”数据集在此处中可用。

In [85]: from pandas.tools.plotting import andrews_curves

In [86]: data = pd.read_csv('data/iris.data')

In [87]: plt.figure()
Out[87]: <matplotlib.figure.Figure at 0x7ff26c276bd0>

In [88]: andrews_curves(data, 'Name')
Out[88]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff270a8a9d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/andrews_curves.png

Parallel Coordinates

平行坐标是绘制多变量数据的绘图技术。它允许人们看到数据中的簇,并可视地估计其他统计量。使用平行坐标点表示为连接的线段。每个垂直线表示一个属性。一组连接的线段表示一个数据点。倾向于聚类的点将更靠近在一起。

In [89]: from pandas.tools.plotting import parallel_coordinates

In [90]: data = pd.read_csv('data/iris.data')

In [91]: plt.figure()
Out[91]: <matplotlib.figure.Figure at 0x7ff26798f850>

In [92]: parallel_coordinates(data, 'Name')
Out[92]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff267994810>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/parallel_coordinates.png

Lag Plot

滞后图用于检查数据集或时间序列是否是随机的。随机数据在滞后图中不应显示任何结构。非随机结构意味着底层数据不是随机的。

In [93]: from pandas.tools.plotting import lag_plot

In [94]: plt.figure()
Out[94]: <matplotlib.figure.Figure at 0x7ff26dd75d10>

In [95]: data = pd.Series(0.1 * np.random.rand(1000) +
   ....:     0.9 * np.sin(np.linspace(-99 * np.pi, 99 * np.pi, num=1000)))
   ....: 

In [96]: lag_plot(data)
Out[96]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26dd75910>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/lag_plot.png

Autocorrelation Plot

自相关图通常用于检查时间序列中的随机性。这是通过计算在不同时间滞后的数据值的自相关来完成的。如果时间序列是随机的,对于任何和所有时间滞后分离,这种自相关应该接近零。如果时间序列是非随机的,则一个或多个自相关将显着地非零。图中显示的水平线对应于95%和99%置信带。虚线是99%置信带。

In [97]: from pandas.tools.plotting import autocorrelation_plot

In [98]: plt.figure()
Out[98]: <matplotlib.figure.Figure at 0x7ff267d7a350>

In [99]: data = pd.Series(0.7 * np.random.rand(1000) +
   ....:    0.3 * np.sin(np.linspace(-9 * np.pi, 9 * np.pi, num=1000)))
   ....: 

In [100]: autocorrelation_plot(data)
Out[100]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26dd79ad0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/autocorrelation_plot.png

Bootstrap Plot

引导图用于视觉评估统计的不确定性,例如平均值,中值,中频等。从数据集中选择指定大小的随机子集,针对该子集计算所讨论的统计量,并且将该过程重复指定次数。结果图和直方图是什么构成了引导图。

In [101]: from pandas.tools.plotting import bootstrap_plot

In [102]: data = pd.Series(np.random.rand(1000))

In [103]: bootstrap_plot(data, size=50, samples=500, color='grey')
Out[103]: <matplotlib.figure.Figure at 0x7ff2677380d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/bootstrap_plot.png

RadViz

RadViz是一种可视化多变量数据的方法。它基于简单的弹簧张力最小化算法。基本上你在飞机上设置了一堆点。在我们的例子中,它们在单位圆上等间隔。每个点表示单个属性。然后假设数据集中的每个样本通过弹簧附加到这些点中的每一个上,其刚度与该属性的数值成比例(它们被归一化为单位间隔)。在我们的样本沉降的平面上的点(其中作用在我们的样本上的力处于平衡)是表示我们的样本的点将被绘制的点。根据样本属于哪个类别,它将有不同的颜色。

注意:“Iris”数据集在此处中可用。

In [104]: from pandas.tools.plotting import radviz

In [105]: data = pd.read_csv('data/iris.data')

In [106]: plt.figure()
Out[106]: <matplotlib.figure.Figure at 0x7ff26e5d5190>

In [107]: radviz(data, 'Name')
Out[107]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26ebc86d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/radviz.png

Plot Formatting

大多数绘图方法都有一组控制返回绘图的布局和格式的关键字参数:

In [108]: plt.figure(); ts.plot(style='k--', label='Series');
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_plot_basic2.png

For each kind of plot (e.g. line, bar, scatter) any additional arguments keywords are passed along to the corresponding matplotlib function (ax.plot(), ax.bar(), ax.scatter()). 这些可以用于控制额外的造型,超出了熊猫提供。

Controlling the Legend

您可以将legend参数设置为False以隐藏图例(默认情况下显示)。

In [109]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))

In [110]: df = df.cumsum()

In [111]: df.plot(legend=False)
Out[111]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26e65d590>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_basic_noleg.png

Scales

您可以传递logy以获取对数刻度Y轴。

In [112]: ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))

In [113]: ts = np.exp(ts.cumsum())

In [114]: ts.plot(logy=True)
Out[114]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2704da990>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_plot_logy.png

另请参阅logxloglog关键字参数。

Plotting on a Secondary Y-axis

要在辅助y轴上绘制数据,请使用secondary_y关键字:

In [115]: df.A.plot()
Out[115]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26e663290>

In [116]: df.B.plot(secondary_y=True, style='g')
Out[116]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26e10e1d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_plot_secondary_y.png

要在DataFrame中绘制某些列,请为secondary_y关键字指定列名称:

In [117]: plt.figure()
Out[117]: <matplotlib.figure.Figure at 0x7ff26cd69450>

In [118]: ax = df.plot(secondary_y=['A', 'B'])

In [119]: ax.set_ylabel('CD scale')
Out[119]: <matplotlib.text.Text at 0x7ff26c8112d0>

In [120]: ax.right_ax.set_ylabel('AB scale')
Out[120]: <matplotlib.text.Text at 0x7ff266f57710>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_secondary_y.png

请注意,在辅助y轴上绘制的列在图例中自动标记为“(右)”。要关闭自动标记,请使用mark_right=False关键字:

In [121]: plt.figure()
Out[121]: <matplotlib.figure.Figure at 0x7ff26752ced0>

In [122]: df.plot(secondary_y=['A', 'B'], mark_right=False)
Out[122]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff267a133d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_secondary_y_no_right.png

Suppressing Tick Resolution Adjustment

pandas包括对常规频率时间序列数据的自动勾号分辨率调整。对于其中熊猫无法推断频率信息(例如,在外部创建的twinx)的有限情况,您可以选择抑制此行为以进行对齐。

这里是默认行为,注意如何执行x轴刻度标记:

In [123]: plt.figure()
Out[123]: <matplotlib.figure.Figure at 0x7ff267a3bc10>

In [124]: df.A.plot()
Out[124]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26e538f90>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/ser_plot_suppress.png

使用x_compat参数,可以抑制此行为:

In [125]: plt.figure()
Out[125]: <matplotlib.figure.Figure at 0x7ff26e51add0>

In [126]: df.A.plot(x_compat=True)
Out[126]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26eae0b10>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/ser_plot_suppress_parm.png

如果您有多个需要抑制的图,pandas.plot_params中的use方法可以在with statement中使用:

In [127]: plt.figure()
Out[127]: <matplotlib.figure.Figure at 0x7ff26dea43d0>

In [128]: with pd.plot_params.use('x_compat', True):
   .....:     df.A.plot(color='r')
   .....:     df.B.plot(color='g')
   .....:     df.C.plot(color='b')
   .....: 
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/ser_plot_suppress_context.png

Subplots

可以使用subplots关键字将DataFrame中的每个系列绘制在不同的轴上:

In [129]: df.plot(subplots=True, figsize=(6, 6));
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_subplots.png

Using Layout and Targeting Multiple Axes

子图的布局可以通过layout关键字指定。它可以接受(行, 列)layout关键字也可以在histboxplot中使用。如果输入无效,则会引发ValueError

layout指定的行x列可包含的轴数必须大于所需子图的数量。如果布局可以包含比所需更多的轴,则不绘制空白轴。与numpy数组的reshape方法类似,您可以对一个维度使用-1自动计算所需的行数或列数,而另一个维度。

In [130]: df.plot(subplots=True, layout=(2, 3), figsize=(6, 6), sharex=False);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_subplots_layout.png

上面的例子与使用相同

In [131]: df.plot(subplots=True, layout=(2, -1), figsize=(6, 6), sharex=False);

所需的列数(3)根据要绘制的系列数和给定行数(2)推断。

此外,您可以通过ax关键字传递预先创建的多个轴作为列表。这允许使用更复杂的布局。传递的轴必须与绘制的子图的编号相同。

当通过ax关键字,layoutsharexsharey关键字传递多个轴时,不会影响输出。您应该明确传递sharex=Falsesharey=False,否则您将看到警告。

In [132]: fig, axes = plt.subplots(4, 4, figsize=(6, 6));

In [133]: plt.subplots_adjust(wspace=0.5, hspace=0.5);

In [134]: target1 = [axes[0][0], axes[1][1], axes[2][2], axes[3][3]]

In [135]: target2 = [axes[3][0], axes[2][1], axes[1][2], axes[0][3]]

In [136]: df.plot(subplots=True, ax=target1, legend=False, sharex=False, sharey=False);

In [137]: (-df).plot(subplots=True, ax=target2, legend=False, sharex=False, sharey=False);
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/frame_plot_subplots_multi_ax.png

另一个选项是将ax参数传递给Series.plot()以绘制特定轴:

In [138]: fig, axes = plt.subplots(nrows=2, ncols=2)

In [139]: df['A'].plot(ax=axes[0,0]); axes[0,0].set_title('A');

In [140]: df['B'].plot(ax=axes[0,1]); axes[0,1].set_title('B');

In [141]: df['C'].plot(ax=axes[1,0]); axes[1,0].set_title('C');

In [142]: df['D'].plot(ax=axes[1,1]); axes[1,1].set_title('D');
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/series_plot_multi.png

Plotting With Error Bars

版本0.14中的新功能。

现在在DataFrame.plot()Series.plot()中支持带有误差棒的绘图

水平和垂直误差线可以提供给plot()xerryerr关键字参数。可以使用各种格式指定错误值。

还支持非对称误差棒,但在这种情况下必须提供原始误差值。对于M长度Series,应提供表示下部和上部(或左右)错误的Mx2数组。对于MxN DataFrame,不对称误差应在Mx2xN数组中。

这里有一个例子,可以方便地绘制群平均值与原始数据的标准偏差。

# Generate the data
In [143]: ix3 = pd.MultiIndex.from_arrays([['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], ['foo', 'foo', 'bar', 'bar', 'foo', 'foo', 'bar', 'bar']], names=['letter', 'word'])

In [144]: df3 = pd.DataFrame({'data1': [3, 2, 4, 3, 2, 4, 3, 2], 'data2': [6, 5, 7, 5, 4, 5, 6, 5]}, index=ix3)

# Group by index labels and take the means and standard deviations for each group
In [145]: gp3 = df3.groupby(level=('letter', 'word'))

In [146]: means = gp3.mean()

In [147]: errors = gp3.std()

In [148]: means
Out[148]: 
             data1  data2
letter word              
a      bar     3.5    6.0
       foo     2.5    5.5
b      bar     2.5    5.5
       foo     3.0    4.5

In [149]: errors
Out[149]: 
                data1     data2
letter word                    
a      bar   0.707107  1.414214
       foo   0.707107  0.707107
b      bar   0.707107  0.707107
       foo   1.414214  0.707107

# Plot
In [150]: fig, ax = plt.subplots()

In [151]: means.plot.bar(yerr=errors, ax=ax)
Out[151]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26cc76f90>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/errorbar_example.png

Plotting Tables

版本0.14中的新功能。

现在在DataFrame.plot()Series.plot()中使用table关键字支持使用matplotlib表进行绘图。table关键字可以接受boolDataFrameSeries绘制表的简单方法是指定table=True数据将被转置以满足matplotlib的默认布局。

In [152]: fig, ax = plt.subplots(1, 1)

In [153]: df = pd.DataFrame(np.random.rand(5, 3), columns=['a', 'b', 'c'])

In [154]: ax.get_xaxis().set_visible(False)   # Hide Ticks

In [155]: df.plot(table=True, ax=ax)
Out[155]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c4cc5d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/line_plot_table_true.png

此外,您还可以为table关键字传递不同的DataFrameSeries数据将按照打印方法显示(不自动移调)。如果需要,它应该手动转置如下例。

In [156]: fig, ax = plt.subplots(1, 1)

In [157]: ax.get_xaxis().set_visible(False)   # Hide Ticks

In [158]: df.plot(table=np.round(df.T, 2), ax=ax)
Out[158]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26ea2e690>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/line_plot_table_data.png

Finally, there is a helper function pandas.tools.plotting.table to create a table from DataFrame and Series, and add it to an matplotlib.Axes. 此函数可以接受matplotlib表具有的关键字。

In [159]: from pandas.tools.plotting import table

In [160]: fig, ax = plt.subplots(1, 1)

In [161]: table(ax, np.round(df.describe(), 2),
   .....:       loc='upper right', colWidths=[0.2, 0.2, 0.2])
   .....: 
Out[161]: <matplotlib.table.Table at 0x7ff270843f10>

In [162]: df.plot(ax=ax, ylim=(0, 2), legend=None)
Out[162]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff267fce190>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/line_plot_table_describe.png

注意:您可以使用axes.tables属性获取轴上的表实例以进行进一步装饰。有关更多信息,请参阅matplotlib表文档

Colormaps

绘制大量列时的潜在问题是,由于默认颜色的重复,可能难以区分某些系列。为了解决这个问题,DataFrame绘图支持使用colormap=参数,它接受一个Matplotlib colormap或者一个字符串,它是用Matplotlib注册的颜色。可以在此处获得默认matplotlib色彩映射的可视化。

由于matplotlib不直接支持基于行的绘图的色彩映射,所以基于由DataFrame中的列数确定的偶数间隔来选择颜色。没有考虑背景颜色,所以一些色彩映射将产生不容易看到的线。

要使用立方体颜色映射,我们可以简单地将'cubehelix'传递给colormap=

In [163]: df = pd.DataFrame(np.random.randn(1000, 10), index=ts.index)

In [164]: df = df.cumsum()

In [165]: plt.figure()
Out[165]: <matplotlib.figure.Figure at 0x7ff266ee9650>

In [166]: df.plot(colormap='cubehelix')
Out[166]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff267037910>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/cubehelix.png

或者我们可以传递色彩映射本身

In [167]: from matplotlib import cm

In [168]: plt.figure()
Out[168]: <matplotlib.figure.Figure at 0x7ff26c8efb10>

In [169]: df.plot(colormap=cm.cubehelix)
Out[169]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff270ee6c90>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/cubehelix_cm.png

色彩图也可以使用其他图类型,如条形图:

In [170]: dd = pd.DataFrame(np.random.randn(10, 10)).applymap(abs)

In [171]: dd = dd.cumsum()

In [172]: plt.figure()
Out[172]: <matplotlib.figure.Figure at 0x7ff272475250>

In [173]: dd.plot.bar(colormap='Greens')
Out[173]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26efff1d0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/greens.png

平行坐标图:

In [174]: plt.figure()
Out[174]: <matplotlib.figure.Figure at 0x7ff2717f4250>

In [175]: parallel_coordinates(data, 'Name', colormap='gist_rainbow')
Out[175]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2717d2810>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/parallel_gist_rainbow.png

安德鲁斯曲线图:

In [176]: plt.figure()
Out[176]: <matplotlib.figure.Figure at 0x7ff25dd3af50>

In [177]: andrews_curves(data, 'Name', colormap='winter')
Out[177]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff25dcc9b90>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/andrews_curve_winter.png

Plotting directly with matplotlib

在某些情况下,仍然可能优选或必须直接使用matplotlib准备绘图,例如当某种类型的绘图或定制没有被pandas支持时。Series和DataFrame对象的行为类似于数组,因此可以直接传递到matplotlib函数,而不需要显式转换。

pandas还自动注册识别日期索引的格式化程序和定位器,从而将日期和时间支持扩展到matplotlib中几乎所有可用的绘图类型。虽然此格式不提供与通过pandas绘图时获得的相同的细化级别,但在绘制大量点时可能会更快。

注意

大数据集的加速仅适用于pandas 0.14.0和更高版本。

In [178]: price = pd.Series(np.random.randn(150).cumsum(),
   .....:                   index=pd.date_range('2000-1-1', periods=150, freq='B'))
   .....: 

In [179]: ma = price.rolling(20).mean()

In [180]: mstd = price.rolling(20).std()

In [181]: plt.figure()
Out[181]: <matplotlib.figure.Figure at 0x7ff25d8ca350>

In [182]: plt.plot(price.index, price, 'k')
Out[182]: [<matplotlib.lines.Line2D at 0x7ff25d88a910>]

In [183]: plt.plot(ma.index, ma, 'b')
Out[183]: [<matplotlib.lines.Line2D at 0x7ff25d8cadd0>]

In [184]: plt.fill_between(mstd.index, ma-2*mstd, ma+2*mstd, color='b', alpha=0.2)
Out[184]: <matplotlib.collections.PolyCollection at 0x7ff25d853fd0>
http://pandas.pydata.org/pandas-docs/version/0.19.2/_images/bollinger.png

Trellis plotting interface

警告

rplot网格绘图界面已删除请使用类似seaborn的外部软件包,以获得类似但更细化的功能,并参阅我们的0.18.1文档此处,了解如何转换为使用它。