图表可视化#
本节通过图表演示可视化。有关表格数据可视化的信息,请参阅 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();

如果索引由日期组成,则调用 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();

方法绘制一列与另一列的对比图。 x
和 y
关键字输入 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");

备注
有关更多格式和样式选项,请参见 formatting 下面。
其他地块#
打印方法允许除默认直线打印之外的几种打印样式。这些方法可以作为 kind
关键字参数为 plot()
,并包括:
例如,可以通过以下方式创建条形图:
In [13]: plt.figure();
In [14]: df.iloc[5].plot(kind="bar");

您也可以使用方法创建这些其他地块 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
这需要一个 Series
或 DataFrame
作为一种争论。这些措施包括:
情节也可以用来装饰 errorbars 或 tables 。
条形图#
对于带标签的非时间序列数据,您可能希望生成条形图:
In [17]: plt.figure();
In [18]: df.iloc[5].plot.bar();
In [19]: plt.axhline(0, color="k");

调用DataFrame的 plot.bar()
方法会生成多条形图:
In [20]: df2 = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
In [21]: df2.plot.bar();

要生成堆叠条形图,请通过 stacked=True
:
In [22]: df2.plot.bar(stacked=True);

要获得水平条形图,请使用 barh
方法:
In [23]: df2.plot.barh(stacked=True);

直方图#
直方图可以使用 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);

直方图可以使用以下方法进行堆叠 stacked=True
。存储箱大小可以使用 bins
关键字。
In [27]: plt.figure();
In [28]: df4.plot.hist(stacked=True, bins=20);

您可以传递matplotlib支持的其他关键字 hist
。例如,水平直方图和累积直方图可以通过 orientation='horizontal'
和 cumulative=True
。
In [29]: plt.figure();
In [30]: df4["a"].plot.hist(orientation="horizontal", cumulative=True);

请参阅 hist
方法和 matplotlib hist documentation 想要更多。
现有的界面 DataFrame.hist
绘制直方图仍然可以使用。
In [31]: plt.figure();
In [32]: df["A"].diff().hist();

DataFrame.hist()
在多个子图上绘制列的直方图:
In [33]: plt.figure();
In [34]: df.diff().hist(color="k", alpha=0.5, bins=50);

这个 by
可以指定关键字来绘制分组直方图:
In [35]: data = pd.Series(np.random.randn(1000))
In [36]: data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4));

此外, 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));

箱形图#
方框图可以通过调用 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();

BoxPlot可以通过传递 color
关键词。您可以传递一个 dict
他们的钥匙是 boxes
, whiskers
, medians
和 caps
。如果某些关键字在 dict
,则默认颜色用于相应的艺术家。此外,Boxploy还拥有 sym
用于指定传单样式的关键字。
当将其他类型的参数通过 color
关键字,它将被直接传递给matplotlib,用于所有 boxes
, whiskers
, medians
和 caps
彩色化。
这些颜色将应用于要绘制的每个框。如果你想要更复杂的色彩,你可以通过传递每个被绘制的艺术家 return_type 。
In [41]: color = {
....: "boxes": "DarkGreen",
....: "whiskers": "DarkOrange",
....: "medians": "DarkBlue",
....: "caps": "Gray",
....: }
....:
In [42]: df.plot.box(color=color, sym="r+");

此外,您还可以传递matplotlib支持的其他关键字 boxplot
。例如,水平和自定义位置的框图可以通过 vert=False
和 positions
关键字。
In [43]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8]);

请参阅 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()

您可以使用 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")

您还可以传递要绘制的列子集,以及按多个列分组:
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"])

您还可以使用以下命令创建分组 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")

在……里面 boxplot
,则返回类型可以由 return_type
、关键字。有效的选择包括 {{"axes", "dict", "both", None}}
。镶嵌面,创建者 DataFrame.boxplot
使用 by
关键字,也会影响输出类型:
|
刻面 |
输出类型 |
---|---|---|
|
不是的 |
轴 |
|
是 |
轴的二维ndarray |
|
不是的 |
轴 |
|
是 |
一系列轴 |
|
不是的 |
艺术家的名言 |
|
是 |
艺术家系列辞典 |
|
不是的 |
命名元组 |
|
是 |
一系列命名元组 |
Groupby.boxplot
始终返回一个 Series
的 return_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")

上面的子图首先按数字列拆分,然后按 g
纵队。下面的子图首先按值拆分 g
,然后按数字列。
In [65]: bp = df_box.groupby("g").boxplot()

面积图#
可以使用创建面积图 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();

要生成未堆叠的曲线图,请通过 stacked=False
。除非另有说明,否则Alpha值设置为0.5:
In [68]: df.plot.area(stacked=False);

散点图#
散点图可以使用 DataFrame.plot.scatter()
方法。散点图需要x和y轴的数值列。这些属性可以由 x
和 y
关键字。
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");

要在单个轴上绘制多个列组,请重复 plot
指定目标的方法 ax
。建议您指定 color
和 label
区分每组的关键字。
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);

关键字 c
可以作为列的名称给出,以提供每个点的颜色:
In [74]: df.plot.scatter(x="a", y="b", c="c", s=50);

如果将分类列传递给 c
,则将产生离散的色条:
1.3.0 新版功能.
In [75]: df.plot.scatter(x="a", y="b", c="species", cmap="viridis", s=50);

您可以传递matplotlib支持的其他关键字 scatter
。下面的示例显示了气泡图,它使用 DataFrame
气泡的大小。
In [76]: df.plot.scatter(x="a", y="b", s=df["c"] * 200);

请参阅 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);

一个有用的关键字参数是 gridsize
;控制x方向的六边形个数,默认为100。一个更大的 gridsize
意味着更多更小的垃圾桶。
默认情况下,每个周围的计数的直方图 (x, y)
点是计算出来的。可以通过将值传递给 C
和 reduce_C_function
争论。 C
指定每个 (x, y)
点和 reduce_C_function
是一个参数的函数,它将bin中的所有值减少到单个数字(例如 mean
, max
, sum
, std
)。在本例中,位置是按列给出的 a
和 b
,而该值按列给出 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);

请参阅 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));

对于饼图,最好使用正方形图形,即图形长宽比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));

您可以使用 labels
和 colors
关键字以指定每个按钮的标签和颜色。
警告
大多数Pandas的地块都使用 label
和 color
参数(请注意,这些参数上没有“s”)。与…保持一致 matplotlib.pyplot.pie()
您必须使用 labels
和 colors
。
如果要隐藏楔形标签,请指定 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),
....: );
....:

如果您传递的值的总和小于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));

请参阅 matplotlib pie documentation 想要更多。
使用丢失的数据进行绘图#
Pandas试图对阴谋采取务实态度 DataFrames
或 Series
其中包含丢失的数据。根据打印类型,丢失的值将被删除、省略或填充。
曲线图类型 |
NaN处理 |
---|---|
线 |
在NAN上留下空隙 |
行(堆叠) |
填0 |
酒吧 |
填0 |
散布 |
Drop Nans |
直方图 |
删除NAN(按列) |
盒 |
删除NAN(按列) |
面积 |
填0 |
KDE |
删除NAN(按列) |
Hexbin |
Drop Nans |
派 |
填0 |
如果这些缺省值中的任何一个不是您想要的,或者如果您想明确说明如何处理缺少的值,请考虑使用 fillna()
或 dropna()
在密谋之前。
绘图工具#
这些函数可以从导入 pandas.plotting
然后拿一张 Series
或 DataFrame
作为一种论据。
散点矩阵图#
可以使用创建散点图矩阵 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");

密度图#
您可以使用创建密度图 Series.plot.kde()
和 DataFrame.plot.kde()
方法。
In [94]: ser = pd.Series(np.random.randn(1000))
In [95]: ser.plot.kde();

安德鲁斯曲线#
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");

平行坐标#
平行坐标是一种绘制多变量数据的绘制技术,请参阅 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");

滞后图#
滞后图用于检查数据集或时间序列是否为随机的。随机数据不应在滞后图中显示任何结构。非随机结构意味着底层数据不是随机的。这个 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);

自相关图#
自相关图常用于检验时间序列中的随机性。这是通过计算不同时间滞后的数据值的自相关来实现的。如果时间序列是随机的,则对于任何和所有时滞分离,这种自相关都应该接近于零。如果时间序列是非随机的,则一个或多个自相关将显着非零。图中显示的水平线对应于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);

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");

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");

打印格式设置#
设置打印样式#
从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");

对于每种类型的地块(例如 line
, bar
, scatter
)任何其他参数关键字都会传递给相应的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);

控制标签#
1.1.0 新版功能.
您可以设置 xlabel
和 ylabel
参数提供x轴和y轴的绘图定制标签。默认情况下,Pandas会选择索引名称xLabel,而将yLabel保留为空。
In [126]: df.plot();
In [127]: df.plot(xlabel="new x", ylabel="new y");

鳞片#
你可以过去了 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);

另请参阅 logx
和 loglog
关键字参数。
在第二个y轴上绘制#
若要在辅助y轴上绘制数据,请使用 secondary_y
关键词:
In [131]: df["A"].plot();
In [132]: df["B"].plot(secondary_y=True, style="g");

绘制中的某些列 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");

请注意,绘制在次要y轴上的列在图例中自动标记为“(Right)”。若要关闭自动标记,请使用 mark_right=False
关键词:
In [137]: plt.figure();
In [138]: df.plot(secondary_y=["A", "B"], mark_right=False);

时间序列图的自定义格式化程序#
在 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();

使用 x_compat
参数,则可以取消此行为:
In [141]: plt.figure();
In [142]: df["A"].plot(x_compat=True);

如果有多个绘图需要取消,则 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")
.....:

自动调整日期刻度#
TimedeltaIndex
现在使用本地matplotlib刻度定位器方法,对于刻度标签重叠的地物,从matplotlib调用自动日期刻度调整非常有用。
请参阅 autofmt_xdate
方法和 matplotlib documentation 想要更多。
次要情节#
每个人 Series
在一个 DataFrame
可以在不同的轴上使用 subplots
关键词:
In [145]: df.plot(subplots=True, figsize=(6, 6));

使用布局并瞄准多个轴#
子地块的布局可以由 layout
关键词。它可以接受 (rows, columns)
。这个 layout
关键字可用于 hist
和 boxplot
还有.。如果输入无效,则会引发 ValueError
都会被举起。
指定的行x列可以包含的轴数 layout
必须大于所需的子情节数量。如果布局可以包含比所需更多的轴,则不会绘制空白轴。类似于NumPy数组的 reshape
方法,您可以使用 -1
对于一个维,在给定另一个维的情况下,自动计算需要的行数或列数。
In [146]: df.plot(subplots=True, layout=(2, 3), figsize=(6, 6), sharex=False);

上面的示例与使用:
In [147]: df.plot(subplots=True, layout=(2, -1), figsize=(6, 6), sharex=False);
所需的列数(3)是根据要绘制的级数和给定的行数(2)推断出来的。
您可以将预先创建的多个轴作为类似列表的VIA进行传递 ax
关键词。这允许进行更复杂的布局。传递的轴数必须与绘制的子图相同。
当多个轴通过 ax
关键字, layout
, sharex
和 sharey
关键字不会影响输出。您应该显式地传递 sharex=False
和 sharey=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);

另一种选择是将一个 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");

使用误差线打印#
中支持使用误差线进行绘图 DataFrame.plot()
和 Series.plot()
。
水平和垂直误差条可提供给 xerr
和 yerr
关键字参数 plot()
。可以使用各种格式指定误差值:
作为一个
DataFrame
或dict
列名与columns
绘图的属性DataFrame
或匹配name
属性的属性。Series
。作为一个
str
指示打印的哪些列DataFrame
包含误差值。作为原始价值 (
list
,tuple
,或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);

也支持非对称误差条,但在这种情况下必须提供原始误差值。为. 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);

绘制表格#
现在支持使用matplotlib表进行打印 DataFrame.plot()
和 Series.plot()
使用一个 table
关键词。这个 table
关键字可以接受 bool
, DataFrame
或 Series
。绘制表格的简单方法是指定 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);

此外,您还可以传递不同的 DataFrame
或 Series
发送到 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);

还有一个助手函数 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);

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");

或者,我们可以传递色彩映射表本身:
In [193]: from matplotlib import cm
In [194]: plt.figure();
In [195]: df.plot(colormap=cm.cubehelix);

色彩映射表还可以用于其他绘图类型,如条形图:
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");

平行坐标图表:
In [200]: plt.figure();
In [201]: parallel_coordinates(data, "Name", colormap="gist_rainbow");

安德鲁斯曲线图表:
In [202]: plt.figure();
In [203]: andrews_curves(data, "Name", colormap="winter");

使用matplotlib直接绘图#
在某些情况下,直接使用matplotlib准备地块可能仍然是更可取或必要的,例如,当某种类型的地块或定制还不被Pandas支持时。 Series
和 DataFrame
对象的行为类似于数组,因此可以直接传递给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);

打印后端#
从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上找到