原文:http://pandas.pydata.org/pandas-docs/stable/visualization.html
校对:(虚位以待)
我们使用标准约定引用matplotlib API:
In [1]: import matplotlib.pyplot as plt
本文档中的绘图使用matplotlib的ggplot
样式(版本1.4中的新功能):
import matplotlib
matplotlib.style.use('ggplot')
通过建立pandas格式的面板数据,我们可以轻松将其可视化。有关超出此处记录的基础知识的可视化库,请参阅ecosystem部分。
注意
对np.random
的所有调用都使用123456进行播种。
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>
如果索引由日期组成,它会调用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();
您可以使用plot()
中的x和y关键字绘制一列与另一列:
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>
注意
有关更多格式和样式选项,请参阅下面的below。
绘图方法允许使用除默认线图外的一些绘图样式。这些方法可以作为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>
版本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,以Series
或DataFrame
。这些包括
对于带标签的非时间序列数据,您可能希望产生条形图:
In [15]: plt.figure();
In [16]: df.ix[5].plot.bar(); plt.axhline(0, color='k')
Out[16]: <matplotlib.lines.Line2D at 0x7ff2673d3510>
调用DataFrame的plot.bar()
方法会产生多条形图:
In [17]: df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
In [18]: df2.plot.bar();
要生成堆叠棒图,请传递stacked=True
:
In [19]: df2.plot.bar(stacked=True);
要获取水平条形图,请使用barh
方法:
In [20]: df2.plot.barh(stacked=True);
版本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>
直方图可以通过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>
您可以传递由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>
有关更多信息,请参阅hist
方法和matplotlib hist文档。
现有的界面DataFrame.hist
仍然可以使用绘制直方图。
In [28]: plt.figure();
In [29]: df['A'].diff().hist()
Out[29]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff2770919d0>
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)
版本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)
版本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>
Boxplot可以通过传递color
关键字来着色。您可以传递boxes
,whiskers
,medians
和caps
的dict
如果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>
此外,您可以传递由matplotlib boxplot
支持的其他关键字。例如,水平和自定义盒线图可以由vert=False
和positions
关键字绘制。
In [38]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8])
Out[38]: <matplotlib.axes._subplots.AxesSubplot at 0x7ff26c1f2dd0>
有关更多信息,请参阅boxplot
方法和matplotlib boxplot文档。
现有的接口DataFrame.boxplot
仍然可以使用绘图箱图。
In [39]: df = pd.DataFrame(np.random.rand(10,5))
In [40]: plt.figure();
In [41]: bp = df.boxplot()
您可以使用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')
您还可以传递要绘制的列的子集,以及按多个列分组:
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'])
警告
默认值从版本0.19.0中的'dict'
更改为'axes'
。
在boxplot
中,返回类型可以通过return_type
关键字控制。有效的选项是{“axes”, “dict”, “both”, None}
。由DataFrame.boxplot
与by
关键字创建的面,也会影响输出类型:
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')
相比于:
In [56]: bp = df_box.groupby('g').boxplot()
版本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();
要生成未堆叠的绘图,请传递stacked=False
。除非另有说明,Alpha值设置为0.5:
In [59]: df.plot.area(stacked=False);
版本0.13中的新功能。
散点图可以使用DataFrame.plot.scatter()
方法绘制。散点图需要x和y轴的数字列。这些可以由x
和y
关键字指定。
In [60]: df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
In [61]: df.plot.scatter(x='a', y='b');
要在单个轴上绘制多个列组,请重复plot
方法指定目标ax
。建议指定color
和label
关键字以区分每个组。
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);
可以给出关键字c
作为为每个点提供颜色的列的名称:
In [64]: df.plot.scatter(x='a', y='b', c='c', s=50);
您可以传递由matplotlib scatter
支持的其他关键字。下面的示例显示了将气泡大小用于数据框列值的气泡图。
In [65]: df.plot.scatter(x='a', y='b', s=df['c']*200);
有关更多信息,请参阅scatter
方法和matplotlib scatter文档。
版本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>
一个有用的关键字参数是gridsize
;它控制x方向上的六边形数量,默认为100。较大的gridsize
意味着更多,更小的bin。
默认情况下,计算每个(x, y)
点的计数的直方图。您可以通过将值传递到C
和reduce_C_function
参数来指定备用聚合。C
指定每个(x, y)
点和reduce_C_function
将一个bin中的所有值减少为单个数字的一个参数的函数(例如mean
,max
,sum
,std
)。在该示例中,位置由列a
和b
给出,而值由列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>
有关详细信息,请参阅hexbin
方法和matplotlib hexbin文档。
版本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>
对于饼图,最好使用正方形的数字,一个具有相等的宽高比。您可以通过在返回的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)
您可以使用labels
和colors
关键字来指定每个楔形的标签和颜色。
警告
大多数熊猫图使用label
和color
参数(注意缺少“s”)。要与matplotlib.pyplot.pie()
保持一致,您必须使用labels
和colors
。
如果您要隐藏楔形标签,请指定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>
如果传递总和小于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>
有关更多信息,请参阅matplotlib饼文档。
Pandas试图做实用的绘制包含缺失数据的DataFrames或Series。根据绘图类型,丢弃,舍弃或填充缺失值。
绘图类型 | NaN处理 |
---|---|
线 | 在NaNs处留下空隙 |
线(堆叠) | 填充0 |
柱形图 | 填充0 |
散点图 | 去除NANS |
直方图 | 去除NaNs(逐列) |
箱图 | 删除NaNs(逐列) |
面积图 | 填充0 |
KDE | 删除NaNs(逐列) |
Hexbin | 删除NaNs |
饼图 | 填充0 |
这些函数可以从pandas.tools.plotting
导入,并以Series
或DataFrame
作为参数。
新版本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)
版本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>
安德鲁斯曲线允许将多变量数据绘制为使用样本的属性作为傅里叶级数系数创建的大量曲线。通过为每个类不同地着色这些曲线,可以可视化数据聚类。属于相同类别的样品的曲线通常更靠近在一起并形成更大的结构。
注意:“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>
平行坐标是绘制多变量数据的绘图技术。它允许人们看到数据中的簇,并可视地估计其他统计量。使用平行坐标点表示为连接的线段。每个垂直线表示一个属性。一组连接的线段表示一个数据点。倾向于聚类的点将更靠近在一起。
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>
滞后图用于检查数据集或时间序列是否是随机的。随机数据在滞后图中不应显示任何结构。非随机结构意味着底层数据不是随机的。
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>
自相关图通常用于检查时间序列中的随机性。这是通过计算在不同时间滞后的数据值的自相关来完成的。如果时间序列是随机的,对于任何和所有时间滞后分离,这种自相关应该接近零。如果时间序列是非随机的,则一个或多个自相关将显着地非零。图中显示的水平线对应于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>
引导图用于视觉评估统计的不确定性,例如平均值,中值,中频等。从数据集中选择指定大小的随机子集,针对该子集计算所讨论的统计量,并且将该过程重复指定次数。结果图和直方图是什么构成了引导图。
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>
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>
大多数绘图方法都有一组控制返回绘图的布局和格式的关键字参数:
In [108]: plt.figure(); ts.plot(style='k--', label='Series');
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()
). 这些可以用于控制额外的造型,超出了熊猫提供。
您可以将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>
您可以传递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>
另请参阅logx
和loglog
关键字参数。
要在辅助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>
要在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>
请注意,在辅助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>
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>
使用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>
如果您有多个需要抑制的图,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')
.....:
可以使用subplots
关键字将DataFrame中的每个系列绘制在不同的轴上:
In [129]: df.plot(subplots=True, figsize=(6, 6));
子图的布局可以通过layout
关键字指定。它可以接受(行, 列)
。layout
关键字也可以在hist
和boxplot
中使用。如果输入无效,则会引发ValueError
。
layout
指定的行x列可包含的轴数必须大于所需子图的数量。如果布局可以包含比所需更多的轴,则不绘制空白轴。与numpy数组的reshape
方法类似,您可以对一个维度使用-1
自动计算所需的行数或列数,而另一个维度。
In [130]: df.plot(subplots=True, layout=(2, 3), figsize=(6, 6), sharex=False);
上面的例子与使用相同
In [131]: df.plot(subplots=True, layout=(2, -1), figsize=(6, 6), sharex=False);
所需的列数(3)根据要绘制的系列数和给定行数(2)推断。
此外,您可以通过ax
关键字传递预先创建的多个轴作为列表。这允许使用更复杂的布局。传递的轴必须与绘制的子图的编号相同。
当通过ax
关键字,layout
,sharex
和sharey
关键字传递多个轴时,不会影响输出。您应该明确传递sharex=False
和sharey=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);
另一个选项是将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');
版本0.14中的新功能。
现在在DataFrame.plot()
和Series.plot()
中支持带有误差棒的绘图
水平和垂直误差线可以提供给plot()
的xerr
和yerr
关键字参数。可以使用各种格式指定错误值。
DataFrame
or dict
of errors with column names matching the columns
attribute of the plotting DataFrame
or matching the name
attribute of the Series
DataFrame
的哪些列包含错误值的str
list
,tuple
或np.ndarray
)。必须与绘图DataFrame
/ Series
的长度相同还支持非对称误差棒,但在这种情况下必须提供原始误差值。对于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>
版本0.14中的新功能。
现在在DataFrame.plot()
和Series.plot()
中使用table
关键字支持使用matplotlib表进行绘图。table
关键字可以接受bool
,DataFrame
或Series
。绘制表的简单方法是指定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>
此外,您还可以为table
关键字传递不同的DataFrame
或Series
。数据将按照打印方法显示(不自动移调)。如果需要,它应该手动转置如下例。
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>
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>
注意:您可以使用axes.tables
属性获取轴上的表实例以进行进一步装饰。有关更多信息,请参阅matplotlib表文档。
绘制大量列时的潜在问题是,由于默认颜色的重复,可能难以区分某些系列。为了解决这个问题,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>
或者我们可以传递色彩映射本身
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>
色彩图也可以使用其他图类型,如条形图:
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>
平行坐标图:
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>
安德鲁斯曲线图:
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>
在某些情况下,仍然可能优选或必须直接使用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>