图表可视化#

本节通过图表演示可视化。有关表格数据可视化的信息,请参阅 Table Visualization

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

In [1]: import matplotlib.pyplot as plt

In [2]: plt.close("all")

我们提供了Pandas的基本知识,以便轻松创建看起来像样的情节。请参阅 ecosystem 一节介绍了可视化库,这些库超越了这里介绍的基础知识。

备注

所有来电至 np.random 是123456的种子选手。

基本绘图: plot#

我们将演示基本知识,请参阅 cookbook 一些先进的策略。

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

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

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

In [5]: ts.plot();
../_images/series_plot_basic.png

如果索引由日期组成,则调用 gcf().autofmt_xdate() 尝试按照上面的方法很好地格式化x轴。

在DataFrame上, plot() 可以方便地使用标签绘制所有列:

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

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

In [8]: plt.figure();

In [9]: df.plot();
../_images/frame_plot_basic.png

方法绘制一列与另一列的对比图。 xy 关键字输入 plot()

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

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

In [12]: df3.plot(x="A", y="B");
../_images/df_plot_xy.png

备注

有关更多格式和样式选项,请参见 formatting 下面。

其他地块#

打印方法允许除默认直线打印之外的几种打印样式。这些方法可以作为 kind 关键字参数为 plot() ,并包括:

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

In [13]: plt.figure();

In [14]: df.iloc[5].plot(kind="bar");
../_images/bar_plot_ex.png

您也可以使用方法创建这些其他地块 DataFrame.plot.<kind> 而不是提供 kind 关键字参数。这样可以更容易地发现Plot方法及其使用的特定参数:

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

In [16]: df.plot.<TAB>  # noqa: E225, E999
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 S,这里有 DataFrame.hist() ,以及 DataFrame.boxplot() 方法,这些方法使用单独的接口。

最后,还有几个 plotting functions 在……里面 pandas.plotting 这需要一个 SeriesDataFrame 作为一种争论。这些措施包括:

情节也可以用来装饰 errorbarstables

条形图#

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

In [17]: plt.figure();

In [18]: df.iloc[5].plot.bar();

In [19]: plt.axhline(0, color="k");
../_images/bar_plot_ex.png

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

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

In [21]: df2.plot.bar();
../_images/bar_plot_multi_ex.png

要生成堆叠条形图,请通过 stacked=True

In [22]: df2.plot.bar(stacked=True);
../_images/bar_plot_stacked_ex.png

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

In [23]: df2.plot.barh(stacked=True);
../_images/barh_plot_stacked_ex.png

直方图#

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

In [24]: 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 [25]: plt.figure();

In [26]: df4.plot.hist(alpha=0.5);
../_images/hist_new.png

直方图可以使用以下方法进行堆叠 stacked=True 。存储箱大小可以使用 bins 关键字。

In [27]: plt.figure();

In [28]: df4.plot.hist(stacked=True, bins=20);
../_images/hist_new_stacked.png

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

In [29]: plt.figure();

In [30]: df4["a"].plot.hist(orientation="horizontal", cumulative=True);
../_images/hist_new_kwargs.png

请参阅 hist 方法和 matplotlib hist documentation 想要更多。

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

In [31]: plt.figure();

In [32]: df["A"].diff().hist();
../_images/hist_plot_ex.png

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

In [33]: plt.figure();

In [34]: df.diff().hist(color="k", alpha=0.5, bins=50);
../_images/frame_hist_ex.png

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

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

In [36]: data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4));
../_images/grouped_hist.png

此外, by 关键字也可以在 DataFrame.plot.hist()

在 1.4.0 版更改.

In [37]: data = pd.DataFrame(
   ....:     {
   ....:         "a": np.random.choice(["x", "y", "z"], 1000),
   ....:         "b": np.random.choice(["e", "f", "g"], 1000),
   ....:         "c": np.random.randn(1000),
   ....:         "d": np.random.randn(1000) - 1,
   ....:     },
   ....: )
   ....: 

In [38]: data.plot.hist(by=["a", "b"], figsize=(10, 5));
../_images/grouped_hist_by.png

箱形图#

方框图可以通过调用 Series.plot.box()DataFrame.plot.box() ,或 DataFrame.boxplot() 以可视化每一列中的值分布。

例如,下面是一个盒子图,它代表了一个均匀随机变量在[0,1]上的10个观察值的五次试验。

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

In [40]: df.plot.box();
../_images/box_plot_new.png

BoxPlot可以通过传递 color 关键词。您可以传递一个 dict 他们的钥匙是 boxeswhiskersmedianscaps 。如果某些关键字在 dict ,则默认颜色用于相应的艺术家。此外,Boxploy还拥有 sym 用于指定传单样式的关键字。

当将其他类型的参数通过 color 关键字,它将被直接传递给matplotlib,用于所有 boxeswhiskersmedianscaps 彩色化。

这些颜色将应用于要绘制的每个框。如果你想要更复杂的色彩,你可以通过传递每个被绘制的艺术家 return_type

In [41]: color = {
   ....:     "boxes": "DarkGreen",
   ....:     "whiskers": "DarkOrange",
   ....:     "medians": "DarkBlue",
   ....:     "caps": "Gray",
   ....: }
   ....: 

In [42]: df.plot.box(color=color, sym="r+");
../_images/box_new_colorize.png

此外,您还可以传递matplotlib支持的其他关键字 boxplot 。例如,水平和自定义位置的框图可以通过 vert=Falsepositions 关键字。

In [43]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8]);
../_images/box_new_kwargs.png

请参阅 boxplot 方法和 matplotlib boxplot documentation 想要更多。

现有的界面 DataFrame.boxplot 若要绘制,仍可使用boxploy。

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

In [45]: plt.figure();

In [46]: bp = df.boxplot()
../_images/box_plot_ex.png

您可以使用 by 用于创建分组的关键字参数。例如,

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

In [48]: df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])

In [49]: plt.figure();

In [50]: bp = df.boxplot(by="X")
../_images/box_plot_ex2.png

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

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

In [52]: df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])

In [53]: df["Y"] = pd.Series(["A", "B", "A", "B", "A", "B", "A", "B", "A", "B"])

In [54]: plt.figure();

In [55]: bp = df.boxplot(column=["Col1", "Col2"], by=["X", "Y"])
../_images/box_plot_ex3.png

您还可以使用以下命令创建分组 DataFrame.plot.box() ,例如:

在 1.4.0 版更改.

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

In [57]: df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])

In [58]: plt.figure();

In [59]: bp = df.plot.box(column=["Col1", "Col2"], by="X")
../_images/box_plot_ex4.png

在……里面 boxplot ,则返回类型可以由 return_type 、关键字。有效的选择包括 {{"axes", "dict", "both", None}} 。镶嵌面,创建者 DataFrame.boxplot 使用 by 关键字,也会影响输出类型:

return_type

刻面

输出类型

None

不是的

None

轴的二维ndarray

'axes'

不是的

'axes'

一系列轴

'dict'

不是的

艺术家的名言

'dict'

艺术家系列辞典

'both'

不是的

命名元组

'both'

一系列命名元组

Groupby.boxplot 始终返回一个 Seriesreturn_type

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

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

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

In [63]: df_box.loc[df_box["g"] == "B", 1] += 3

In [64]: bp = df_box.boxplot(by="g")
../_images/boxplot_groupby.png

上面的子图首先按数字列拆分,然后按 g 纵队。下面的子图首先按值拆分 g ,然后按数字列。

In [65]: bp = df_box.groupby("g").boxplot()
../_images/groupby_boxplot_vis.png

面积图#

可以使用创建面积图 Series.plot.area()DataFrame.plot.area() 。默认情况下,面积打印是堆叠的。要生成堆叠面积图,每列必须全部为正值或全部为负值。

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

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

In [67]: df.plot.area();
../_images/area_plot_stacked.png

要生成未堆叠的曲线图,请通过 stacked=False 。除非另有说明,否则Alpha值设置为0.5:

In [68]: df.plot.area(stacked=False);
../_images/area_plot_unstacked.png

散点图#

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

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

In [70]: df["species"] = pd.Categorical(
   ....:     ["setosa"] * 20 + ["versicolor"] * 20 + ["virginica"] * 10
   ....: )
   ....: 

In [71]: df.plot.scatter(x="a", y="b");
../_images/scatter_plot.png

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

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

In [73]: df.plot.scatter(x="c", y="d", color="DarkGreen", label="Group 2", ax=ax);
../_images/scatter_plot_repeated.png

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

In [74]: df.plot.scatter(x="a", y="b", c="c", s=50);
../_images/scatter_plot_colored.png

如果将分类列传递给 c ,则将产生离散的色条:

1.3.0 新版功能.

In [75]: df.plot.scatter(x="a", y="b", c="species", cmap="viridis", s=50);
../_images/scatter_plot_categorical.png

您可以传递matplotlib支持的其他关键字 scatter 。下面的示例显示了气泡图,它使用 DataFrame 气泡的大小。

In [76]: df.plot.scatter(x="a", y="b", s=df["c"] * 200);
../_images/scatter_plot_bubble.png

请参阅 scatter 方法和 matplotlib scatter documentation 想要更多。

六角形仓位图#

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

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

In [78]: df["b"] = df["b"] + np.arange(1000)

In [79]: df.plot.hexbin(x="a", y="b", gridsize=25);
../_images/hexbin_plot.png

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

默认情况下,每个周围的计数的直方图 (x, y) 点是计算出来的。可以通过将值传递给 Creduce_C_function 争论。 C 指定每个 (x, y) 点和 reduce_C_function 是一个参数的函数,它将bin中的所有值减少到单个数字(例如 meanmaxsumstd )。在本例中,位置是按列给出的 ab ,而该值按列给出 z 。这些垃圾箱与NumPy的垃圾箱聚合在一起 max 功能。

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

In [81]: df["b"] = df["b"] + np.arange(1000)

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

In [83]: df.plot.hexbin(x="a", y="b", C="z", reduce_C_function=np.max, gridsize=25);
../_images/hexbin_plot_agg.png

请参阅 hexbin 方法和 matplotlib hexbin documentation 想要更多。

饼图#

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

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

In [85]: series.plot.pie(figsize=(6, 6));
../_images/series_pie_plot.png

对于饼图,最好使用正方形图形,即图形长宽比1。可以创建等宽等高的图形,也可以通过调用 ax.set_aspect('equal') 关于退回的 axes 对象。

请注意下面的饼图 DataFrame 要求您要么通过 y 论据或 subplots=True 。什么时候 y 则将绘制所选列的饼图。如果 subplots=True 则将每列的饼图绘制为子图。默认情况下,将在每个饼图中绘制图例;指定 legend=False 把它藏起来。

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

In [87]: df.plot.pie(subplots=True, figsize=(8, 4));
../_images/df_pie_plot.png

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

警告

大多数Pandas的地块都使用 labelcolor 参数(请注意,这些参数上没有“s”)。与…保持一致 matplotlib.pyplot.pie() 您必须使用 labelscolors

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

In [88]: series.plot.pie(
   ....:     labels=["AA", "BB", "CC", "DD"],
   ....:     colors=["r", "g", "b", "c"],
   ....:     autopct="%.2f",
   ....:     fontsize=20,
   ....:     figsize=(6, 6),
   ....: );
   ....: 
../_images/series_pie_plot_options.png

如果您传递的值的总和小于1.0,则它们将被重新缩放,以便它们的总和为1。

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

In [90]: series.plot.pie(figsize=(6, 6));
../_images/series_pie_plot_semi.png

请参阅 matplotlib pie documentation 想要更多。

使用丢失的数据进行绘图#

Pandas试图对阴谋采取务实态度 DataFramesSeries 其中包含丢失的数据。根据打印类型,丢失的值将被删除、省略或填充。

曲线图类型

NaN处理

线

在NAN上留下空隙

行(堆叠)

填0

酒吧

填0

散布

Drop Nans

直方图

删除NAN(按列)

删除NAN(按列)

面积

填0

KDE

删除NAN(按列)

Hexbin

Drop Nans

填0

如果这些缺省值中的任何一个不是您想要的,或者如果您想明确说明如何处理缺少的值,请考虑使用 fillna()dropna() 在密谋之前。

绘图工具#

这些函数可以从导入 pandas.plotting 然后拿一张 SeriesDataFrame 作为一种论据。

散点矩阵图#

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

In [91]: from pandas.plotting import scatter_matrix

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

In [93]: scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal="kde");
../_images/scatter_matrix_kde.png

密度图#

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

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

In [95]: ser.plot.kde();
../_images/kde_plot.png

安德鲁斯曲线#

Andrews曲线允许将多变量数据绘制为大量曲线,这些曲线是使用样本的属性作为傅里叶级数的系数创建的,请参阅 Wikipedia entry 以获取更多信息。通过对每个类别的这些曲线进行不同的着色,可以可视化数据集群。属于同一类样本的曲线通常距离较近,并形成较大的结构。

Note :“Iris”数据集可用 here

In [96]: from pandas.plotting import andrews_curves

In [97]: data = pd.read_csv("data/iris.data")

In [98]: plt.figure();

In [99]: andrews_curves(data, "Name");
../_images/andrews_curves.png

平行坐标#

平行坐标是一种绘制多变量数据的绘制技术,请参阅 Wikipedia entry 来做个介绍。平行坐标使人们能够看到数据中的集群,并直观地估计其他统计数据。使用平行坐标将点表示为相连的线段。每条垂直线代表一个属性。一组相连的线段代表一个数据点。倾向于聚集的点将看起来更接近。

In [100]: from pandas.plotting import parallel_coordinates

In [101]: data = pd.read_csv("data/iris.data")

In [102]: plt.figure();

In [103]: parallel_coordinates(data, "Name");
../_images/parallel_coordinates.png

滞后图#

滞后图用于检查数据集或时间序列是否为随机的。随机数据不应在滞后图中显示任何结构。非随机结构意味着底层数据不是随机的。这个 lag 参数可以传递,以及何时 lag=1 从本质上讲,情节是 data[:-1] v.v. data[1:]

In [104]: from pandas.plotting import lag_plot

In [105]: plt.figure();

In [106]: spacing = np.linspace(-99 * np.pi, 99 * np.pi, num=1000)

In [107]: data = pd.Series(0.1 * np.random.rand(1000) + 0.9 * np.sin(spacing))

In [108]: lag_plot(data);
../_images/lag_plot.png

自相关图#

自相关图常用于检验时间序列中的随机性。这是通过计算不同时间滞后的数据值的自相关来实现的。如果时间序列是随机的,则对于任何和所有时滞分离,这种自相关都应该接近于零。如果时间序列是非随机的,则一个或多个自相关将显着非零。图中显示的水平线对应于95%和99%的置信度区间。虚线是99%的置信度区间。请参阅 Wikipedia entry 有关自相关图的更多信息。

In [109]: from pandas.plotting import autocorrelation_plot

In [110]: plt.figure();

In [111]: spacing = np.linspace(-9 * np.pi, 9 * np.pi, num=1000)

In [112]: data = pd.Series(0.7 * np.random.rand(1000) + 0.3 * np.sin(spacing))

In [113]: autocorrelation_plot(data);
../_images/autocorrelation_plot.png

Bootstrap图#

Bootstrap图用于直观地评估统计量的不确定性,如平均值、中位数、中值等。从数据集中选择指定大小的随机子集,为该子集计算所涉及的统计量,并将该过程重复指定次数。生成的曲线图和直方图构成引导图。

In [114]: from pandas.plotting import bootstrap_plot

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

In [116]: bootstrap_plot(data, size=50, samples=500, color="grey");
../_images/bootstrap_plot.png

RadViz#

RadViz是一种可视化多变量数据的方法。它基于一种简单的弹簧张力最小化算法。基本上,你在一个平面上设置一系列的点。在我们的例子中,它们在一个单位圆上等距分布。每个点代表一个属性。然后,假设数据集中的每个采样都通过弹簧附加到这些点上,弹簧的刚度与该属性的数值成比例(它们被规格化为单位间隔)。我们的样本在平面上的安置点(作用在我们样本上的力处于平衡的位置)是代表我们的样本的点将被绘制的地方。根据该样本所属的类别,其颜色会有所不同。请参阅R包 Radviz 了解更多信息。

Note :“Iris”数据集可用 here

In [117]: from pandas.plotting import radviz

In [118]: data = pd.read_csv("data/iris.data")

In [119]: plt.figure();

In [120]: radviz(data, "Name");
../_images/radviz.png

打印格式设置#

设置打印样式#

从1.5版及更高版本开始,matplotlib提供一系列预配置的打印样式。设置样式可用于轻松地为绘图提供所需的一般外观。设置样式非常简单,只需调用 matplotlib.style.use(my_plot_style) 在创建你的剧情之前。例如,您可以这样写 matplotlib.style.use('ggplot') 用于ggploy样式的绘图。

您可以在以下位置查看各种可用的样式名称 matplotlib.style.available 而且很容易试一试。

常规打印样式参数#

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

In [121]: plt.figure();

In [122]: ts.plot(style="k--", label="Series");
../_images/series_plot_basic2.png

对于每种类型的地块(例如 linebarscatter )任何其他参数关键字都会传递给相应的matplotlib函数 (ax.plot()ax.bar()ax.scatter() )。它们可以用来控制Pandas提供的以外的额外造型。

控制着传奇#

您可以设置 legend 参数为 False 要隐藏默认情况下显示的图例,请执行以下操作。

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

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

In [125]: df.plot(legend=False);
../_images/frame_plot_basic_noleg.png

控制标签#

1.1.0 新版功能.

您可以设置 xlabelylabel 参数提供x轴和y轴的绘图定制标签。默认情况下,Pandas会选择索引名称xLabel,而将yLabel保留为空。


In [126]: df.plot();

In [127]: df.plot(xlabel="new x", ylabel="new y");
../_images/plot_xlabel_ylabel.png

鳞片#

你可以过去了 logy 以获得对数比例的Y轴。

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

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

In [130]: ts.plot(logy=True);
../_images/series_plot_logy.png

另请参阅 logxloglog 关键字参数。

在第二个y轴上绘制#

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

In [131]: df["A"].plot();

In [132]: df["B"].plot(secondary_y=True, style="g");
../_images/series_plot_secondary_y.png

绘制中的某些列 DataFrame ,将列名指定给 secondary_y 关键词:

In [133]: plt.figure();

In [134]: ax = df.plot(secondary_y=["A", "B"])

In [135]: ax.set_ylabel("CD scale");

In [136]: ax.right_ax.set_ylabel("AB scale");
../_images/frame_plot_secondary_y.png

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

In [137]: plt.figure();

In [138]: df.plot(secondary_y=["A", "B"], mark_right=False);
../_images/frame_plot_secondary_y_no_right.png

时间序列图的自定义格式化程序#

在 1.0.0 版更改.

Pandas为时间序列图提供了自定义格式化程序。这些选项会更改日期和时间的轴标签的格式。默认情况下,自定义格式化程序仅应用于Pandas使用 DataFrame.plot()Series.plot() 。要使它们应用于所有地块,包括由matplotlib制作的地块,请设置选项 pd.options.plotting.matplotlib.register_converters = True 或使用 pandas.plotting.register_matplotlib_converters()

抑制刻度线分辨率调整#

Pandas包括对常规频率时间序列数据的自动刻度分辨率调整。对于Pandas无法推断频率信息的有限情况(例如,在外部创建的 twinx ),您可以选择出于对齐目的而不显示此行为。

以下是默认行为,请注意x轴记号标记是如何执行的:

In [139]: plt.figure();

In [140]: df["A"].plot();
../_images/ser_plot_suppress.png

使用 x_compat 参数,则可以取消此行为:

In [141]: plt.figure();

In [142]: df["A"].plot(x_compat=True);
../_images/ser_plot_suppress_parm.png

如果有多个绘图需要取消,则 use 中的方法 pandas.plotting.plot_params 可以在 with 声明:

In [143]: plt.figure();

In [144]: with pd.plotting.plot_params.use("x_compat", True):
   .....:     df["A"].plot(color="r")
   .....:     df["B"].plot(color="g")
   .....:     df["C"].plot(color="b")
   .....: 
../_images/ser_plot_suppress_context.png

自动调整日期刻度#

TimedeltaIndex 现在使用本地matplotlib刻度定位器方法,对于刻度标签重叠的地物,从matplotlib调用自动日期刻度调整非常有用。

请参阅 autofmt_xdate 方法和 matplotlib documentation 想要更多。

次要情节#

每个人 Series 在一个 DataFrame 可以在不同的轴上使用 subplots 关键词:

In [145]: df.plot(subplots=True, figsize=(6, 6));
../_images/frame_plot_subplots.png

使用布局并瞄准多个轴#

子地块的布局可以由 layout 关键词。它可以接受 (rows, columns) 。这个 layout 关键字可用于 histboxplot 还有.。如果输入无效,则会引发 ValueError 都会被举起。

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

In [146]: df.plot(subplots=True, layout=(2, 3), figsize=(6, 6), sharex=False);
../_images/frame_plot_subplots_layout.png

上面的示例与使用:

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

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

您可以将预先创建的多个轴作为类似列表的VIA进行传递 ax 关键词。这允许进行更复杂的布局。传递的轴数必须与绘制的子图相同。

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

In [148]: fig, axes = plt.subplots(4, 4, figsize=(9, 9))

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

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

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

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

In [153]: (-df).plot(subplots=True, ax=target2, legend=False, sharex=False, sharey=False);
../_images/frame_plot_subplots_multi_ax.png

另一种选择是将一个 ax 参数为 Series.plot() 要在特定轴上打印,请执行以下操作:

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

In [155]: plt.subplots_adjust(wspace=0.2, hspace=0.5)

In [156]: df["A"].plot(ax=axes[0, 0]);

In [157]: axes[0, 0].set_title("A");

In [158]: df["B"].plot(ax=axes[0, 1]);

In [159]: axes[0, 1].set_title("B");

In [160]: df["C"].plot(ax=axes[1, 0]);

In [161]: axes[1, 0].set_title("C");

In [162]: df["D"].plot(ax=axes[1, 1]);

In [163]: axes[1, 1].set_title("D");
../_images/series_plot_multi.png

使用误差线打印#

中支持使用误差线进行绘图 DataFrame.plot()Series.plot()

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

  • 作为一个 DataFramedict 列名与 columns 绘图的属性 DataFrame 或匹配 name 属性的属性。 Series

  • 作为一个 str 指示打印的哪些列 DataFrame 包含误差值。

  • 作为原始价值 (listtuple ,或 np.ndarray )。必须与打印的长度相同 DataFrame/Series

这是一个简单绘制具有原始数据标准差的分组平均值的方法的例子。

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

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

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

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

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

In [169]: means
Out[169]: 
                data1     data2
letter word                    
a      bar   3.500000  6.000000
       foo   4.666667  6.666667
b      bar   3.666667  4.000000
       foo   3.000000  4.500000

In [170]: errors
Out[170]: 
                data1     data2
letter word                    
a      bar   0.707107  1.414214
       foo   3.785939  2.081666
b      bar   2.081666  2.645751
       foo   1.414214  0.707107

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

In [172]: means.plot.bar(yerr=errors, ax=ax, capsize=4, rot=0);
../_images/errorbar_example.png

也支持非对称误差条,但在这种情况下必须提供原始误差值。为. N 长度 Series ,a 2xN 应提供指示下错误和上错误(或左错误和右错误)的数组。为. MxN DataFrame ,不对称误差应在 Mx2xN 数组。

以下是使用非对称误差条绘制最小/最大范围的一种方法的示例。

In [173]: mins = gp3.min()

In [174]: maxs = gp3.max()

# errors should be positive, and defined in the order of lower, upper
In [175]: errors = [[means[c] - mins[c], maxs[c] - means[c]] for c in df3.columns]

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

In [177]: means.plot.bar(yerr=errors, ax=ax, capsize=4, rot=0);
../_images/errorbar_asymmetrical_example.png

绘制表格#

现在支持使用matplotlib表进行打印 DataFrame.plot()Series.plot() 使用一个 table 关键词。这个 table 关键字可以接受 boolDataFrameSeries 。绘制表格的简单方法是指定 table=True 。数据将被调换以满足matplotlib的默认布局。

In [178]: fig, ax = plt.subplots(1, 1, figsize=(7, 6.5))

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

In [180]: ax.xaxis.tick_top()  # Display x-axis ticks on top.

In [181]: df.plot(table=True, ax=ax);
../_images/line_plot_table_true.png

此外,您还可以传递不同的 DataFrameSeries 发送到 table 关键词。数据将按照Print方法显示的方式绘制(不会自动调换)。如果需要,应手动将其移位,如下例所示。

In [182]: fig, ax = plt.subplots(1, 1, figsize=(7, 6.75))

In [183]: ax.xaxis.tick_top()  # Display x-axis ticks on top.

In [184]: df.plot(table=np.round(df.T, 2), ax=ax);
../_images/line_plot_table_data.png

还有一个助手函数 pandas.plotting.table, which creates a table from DataFrame or Series, and adds it to an matplotlib.Axes instance. This function can accept keywords which the matplotlib table 有过。

In [185]: from pandas.plotting import table

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

In [187]: table(ax, np.round(df.describe(), 2), loc="upper right", colWidths=[0.2, 0.2, 0.2]);

In [188]: df.plot(ax=ax, ylim=(0, 2), legend=None);
../_images/line_plot_table_describe.png

Note :您可以使用以下命令获取轴上的表实例 axes.tables property for further decorations. See the matplotlib table documentation 想要更多。

色彩映射图#

打印大量列时的一个潜在问题是,由于默认颜色的重复,可能很难区分某些系列。为了补救这一点, DataFrame plotting supports the use of the colormap argument, which accepts either a Matplotlib colormap 或作为注册到Matplotlib的色彩映射表的名称的字符串。默认matplotlib色彩映射表的可视化可用 here

由于matplotlib不直接支持基于线的绘图的色彩映射表,因此颜色是基于由 DataFrame 。没有考虑背景颜色,因此一些色彩映射表会产生不易看到的线条。

要使用立方螺旋色彩映射,我们可以传递 colormap='cubehelix'

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

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

In [191]: plt.figure();

In [192]: df.plot(colormap="cubehelix");
../_images/cubehelix.png

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

In [193]: from matplotlib import cm

In [194]: plt.figure();

In [195]: df.plot(colormap=cm.cubehelix);
../_images/cubehelix_cm.png

色彩映射表还可以用于其他绘图类型,如条形图:

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

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

In [198]: plt.figure();

In [199]: dd.plot.bar(colormap="Greens");
../_images/greens.png

平行坐标图表:

In [200]: plt.figure();

In [201]: parallel_coordinates(data, "Name", colormap="gist_rainbow");
../_images/parallel_gist_rainbow.png

安德鲁斯曲线图表:

In [202]: plt.figure();

In [203]: andrews_curves(data, "Name", colormap="winter");
../_images/andrews_curve_winter.png

使用matplotlib直接绘图#

在某些情况下,直接使用matplotlib准备地块可能仍然是更可取或必要的,例如,当某种类型的地块或定制还不被Pandas支持时。 SeriesDataFrame 对象的行为类似于数组,因此可以直接传递给matplotlib函数,而无需显式强制转换。

Pandas还自动注册识别日期索引的格式化程序和定位器,从而将日期和时间支持扩展到matplotlib中几乎所有可用的绘图类型。尽管这种格式不能提供与通过PANDA打印时相同级别的细化,但在打印大量点时可以更快。

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

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

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

In [207]: plt.figure();

In [208]: plt.plot(price.index, price, "k");

In [209]: plt.plot(ma.index, ma, "b");

In [210]: plt.fill_between(mstd.index, ma - 2 * mstd, ma + 2 * mstd, color="b", alpha=0.2);
../_images/bollinger.png

打印后端#

从0.25版开始,Pandas可以通过第三方打印后端进行扩展。其主要思想是让用户选择一个不同于提供的基于Matplotlib的绘图后端。

这可以通过将‘ackend.module’作为参数传递来实现 backend 在……里面 plot 功能。例如:

>>> Series([1, 2, 3]).plot(backend="backend.module")

或者,您也可以全局设置此选项,是否不需要在每个 plot 打电话。例如:

>>> pd.set_option("plotting.backend", "backend.module")
>>> pd.Series([1, 2, 3]).plot()

或者:

>>> pd.options.plotting.backend = "backend.module"
>>> pd.Series([1, 2, 3]).plot()

这或多或少相当于:

>>> import backend.module
>>> backend.module.plot(pd.Series([1, 2, 3]))

然后,后端模块可以使用其他可视化工具(Bokeh、Altair、hvploy等)来生成剧情。一些为Pandas实现后端的库被列入生态系统 可视化 佩奇。

开发人员指南可在https://pandas.pydata.org/docs/dev/development/extending.html#plotting-backends上找到