图表可视化# 笔记 下面的示例假设您使用的是Jupyter。 本节通过图表演示可视化。有关表格数据可视化的信息,请参阅表格可视化部分。 我们使用标准约定来引用 matplotlib API: In [1]: import matplotlib.pyplot as plt In [2]: plt.close("all") 我们提供 pandas 的基础知识,以轻松创建美观的绘图。请参阅生态系统页面,了解超出此处记录的基础知识的可视化库。 笔记 所有呼叫np.random均以 123456 为种子。 基本绘图:plot# 我们将演示基础知识,请参阅食谱以了解一些高级策略。 Series 和 DataFrame 上的方法plot只是一个简单的包装 plt.plot(): In [3]: np.random.seed(123456) In [4]: ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000)) In [5]: ts = ts.cumsum() In [6]: ts.plot(); 如果索引由日期组成,它会调用gcf().autofmt_xdate() 尝试按照上面的方式很好地格式化 x 轴。 在 DataFrame 上,plot()可以方便地绘制带有标签的所有列: In [7]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD")) In [8]: df = df.cumsum() In [9]: plt.figure(); In [10]: df.plot(); x您可以使用和y中的关键字 绘制一列与另一列的对比图plot(): In [11]: df3 = pd.DataFrame(np.random.randn(1000, 2), columns=["B", "C"]).cumsum() In [12]: df3["A"] = pd.Series(list(range(len(df)))) In [13]: df3.plot(x="A", y="B"); 笔记 有关更多格式和样式选项,请参阅 下面的格式。 其他地块# 绘图方法允许使用除默认线图之外的多种绘图样式。这些方法可以作为 ,kind 的关键字参数提供plot(),包括: 'bar'或'barh'用于条形图 直方图的“hist” 箱线图的“box” 密度图的“kde”或“密度” 面积图的“面积” 'scatter'用于散点图 'hexbin'用于六边形箱图 'pie'用于饼图 例如,可以通过以下方式创建条形图: In [14]: plt.figure(); In [15]: df.iloc[5].plot(kind="bar"); 您还可以使用这些方法创建这些其他图,DataFrame.plot.<kind>而不是提供kind关键字参数。这使得更容易发现绘图方法及其使用的特定参数: In [16]: df = pd.DataFrame() In [17]: 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,还有DataFrame.hist()和DataFrame.boxplot()方法,它们使用单独的接口。 最后,有几个绘图函数以pandas.plotting orSeries作为DataFrame参数。这些包括: 散点矩阵 安德鲁斯曲线 平行坐标 滞后图 自相关图 自举图 RadViz 绘图也可以用误差条 或表格来装饰。 条形图# 对于带标签的非时间序列数据,您可能希望生成条形图: In [18]: plt.figure(); In [19]: df.iloc[5].plot.bar(); In [20]: plt.axhline(0, color="k"); 调用 DataFrame 的plot.bar()方法会生成多个条形图: In [21]: df2 = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"]) In [22]: df2.plot.bar(); 要生成堆积条形图,请传递stacked=True: In [23]: df2.plot.bar(stacked=True); 要获得水平条形图,请使用以下barh方法: In [24]: df2.plot.barh(stacked=True); 直方图# 可以使用DataFrame.plot.hist()和Series.plot.hist()方法绘制直方图。 In [25]: 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 [26]: plt.figure(); In [27]: df4.plot.hist(alpha=0.5); 可以使用 堆叠直方图stacked=True。可以使用关键字更改 bin 大小bins。 In [28]: plt.figure(); In [29]: df4.plot.hist(stacked=True, bins=20); 您可以传递 matplotlib 支持的其他关键字hist。例如,可以通过 orientation='horizontal'和绘制水平直方图和累积直方图cumulative=True。 In [30]: plt.figure(); In [31]: df4["a"].plot.hist(orientation="horizontal", cumulative=True); 有关更多信息,请参阅该hist方法和 matplotlib hist 文档。 DataFrame.hist仍然可以使用现有的绘制直方图的接口。 In [32]: plt.figure(); In [33]: df["A"].diff().hist(); DataFrame.hist()在多个子图上绘制列的直方图: In [34]: plt.figure(); In [35]: df.diff().hist(color="k", alpha=0.5, bins=50); by可以指定关键字来绘制分组直方图: In [36]: data = pd.Series(np.random.randn(1000)) In [37]: data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4)); 另外,by还可以在 中指定关键字DataFrame.plot.hist()。 在 1.4.0 版本中进行了更改。 In [38]: 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 [39]: data.plot.hist(by=["a", "b"], figsize=(10, 5)); 箱线图# 可以调用Series.plot.box()和来绘制箱线图DataFrame.plot.box(),或者DataFrame.boxplot()可视化每列内值的分布。 例如,这是一个箱线图,表示 [0,1) 上均匀随机变量的 10 次观察的 5 次试验。 In [40]: df = pd.DataFrame(np.random.rand(10, 5), columns=["A", "B", "C", "D", "E"]) In [41]: df.plot.box(); 箱线图可以通过传递color关键字来着色。您可以传递一个dict 键为boxes, whiskers,medians和 的a caps。如果 中缺少某些键dict,则将使用相应艺术家的默认颜色。此外,箱线图有sym关键字来指定传单样式。 当您通过关键字传递其他类型的参数时,它将直接传递给 matplotlib进行color所有boxes、whiskers和 着色。medianscaps 这些颜色应用于每个要绘制的框。如果您想要更复杂的着色,您可以通过传递 return_type来获取每个绘制的艺术家。 In [42]: color = { ....: "boxes": "DarkGreen", ....: "whiskers": "DarkOrange", ....: "medians": "DarkBlue", ....: "caps": "Gray", ....: } ....: In [43]: df.plot.box(color=color, sym="r+"); 此外,您还可以传递 matplotlib 支持的其他关键字boxplot。例如,可以通过 vert=False和positions关键字绘制水平和自定义位置的箱线图。 In [44]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8]); 有关更多信息,请参阅该boxplot方法和 matplotlib boxplot 文档。 DataFrame.boxplot仍然可以使用现有的绘制箱线图的接口。 In [45]: df = pd.DataFrame(np.random.rand(10, 5)) In [46]: plt.figure(); In [47]: bp = df.boxplot() 您可以使用关键字参数创建分层箱线图by来创建分组。例如, In [48]: df = pd.DataFrame(np.random.rand(10, 2), columns=["Col1", "Col2"]) In [49]: df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"]) In [50]: plt.figure(); In [51]: bp = df.boxplot(by="X") 您还可以传递列的子集进行绘图,以及按多列进行分组: In [52]: df = pd.DataFrame(np.random.rand(10, 3), columns=["Col1", "Col2", "Col3"]) In [53]: df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"]) In [54]: df["Y"] = pd.Series(["A", "B", "A", "B", "A", "B", "A", "B", "A", "B"]) In [55]: plt.figure(); In [56]: bp = df.boxplot(column=["Col1", "Col2"], by=["X", "Y"]) 您还可以使用 创建分组DataFrame.plot.box(),例如: 在 1.4.0 版本中进行了更改。 In [57]: df = pd.DataFrame(np.random.rand(10, 3), columns=["Col1", "Col2", "Col3"]) In [58]: df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"]) In [59]: plt.figure(); In [60]: bp = df.plot.box(column=["Col1", "Col2"], by="X") 在 中boxplot,返回类型可以由 , 关键字控制return_type。有效的选择是。由关键字创建的分面 也会影响输出类型:{"axes", "dict", "both", None}DataFrame.boxplotby return_type 刻面 输出类型 None 不 轴 None 是的 二维轴数组 'axes' 不 轴 'axes' 是的 轴系列 'dict' 不 艺术家词典 'dict' 是的 艺术家口述系列 'both' 不 命名元组 'both' 是的 命名元组系列 Groupby.boxplot总是返回Seriesa return_type。 In [61]: np.random.seed(1234) In [62]: df_box = pd.DataFrame(np.random.randn(50, 2)) In [63]: df_box["g"] = np.random.choice(["A", "B"], size=50) In [64]: df_box.loc[df_box["g"] == "B", 1] += 3 In [65]: bp = df_box.boxplot(by="g") 上面的子图首先按数字列分割,然后按列的值分割g。下面的子图首先按 的值划分g,然后按数字列划分。 In [66]: bp = df_box.groupby("g").boxplot() 面积图# 您可以使用Series.plot.area()和创建面积图DataFrame.plot.area()。默认情况下,面积图是堆叠的。要生成堆积面积图,每列必须全部为正值或全部为负值。 当输入数据包含 时NaN,将自动填充 0。如果要删除或填充不同的值,请在调用 之前使用dataframe.dropna()或。dataframe.fillna()plot In [67]: df = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"]) In [68]: df.plot.area(); 要生成未堆叠的图,请传递stacked=False.除非另有说明,Alpha 值设置为 0.5: In [69]: df.plot.area(stacked=False); 散点图# 利用该方法可以绘制散点图DataFrame.plot.scatter()。散点图需要 x 轴和 y 轴的数字列。这些可以通过x和关键字指定y。 In [70]: df = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"]) In [71]: df["species"] = pd.Categorical( ....: ["setosa"] * 20 + ["versicolor"] * 20 + ["virginica"] * 10 ....: ) ....: In [72]: df.plot.scatter(x="a", y="b"); 要在单个轴上绘制多个列组,请重复plot指定 target 的方法ax。建议指定color和label关键字来区分每个组。 In [73]: ax = df.plot.scatter(x="a", y="b", color="DarkBlue", label="Group 1") In [74]: df.plot.scatter(x="c", y="d", color="DarkGreen", label="Group 2", ax=ax); 关键字c可以作为列的名称给出,以为每个点提供颜色: In [75]: df.plot.scatter(x="a", y="b", c="c", s=50); 如果将分类列传递给c,则会生成离散颜色条: 1.3.0 版本中的新增功能。 In [76]: df.plot.scatter(x="a", y="b", c="species", cmap="viridis", s=50); 您可以传递 matplotlib 支持的其他关键字 scatter。下面的示例显示了使用 的列DataFrame作为气泡大小的气泡图。 In [77]: df.plot.scatter(x="a", y="b", s=df["c"] * 200); 有关更多信息,请参阅该scatter方法和 matplotlib 分散文档。 六边形箱图# 您可以使用 创建六边形箱图DataFrame.plot.hexbin()。如果数据太密集而无法单独绘制每个点,则六边形图可以作为散点图的有用替代方案。 In [78]: df = pd.DataFrame(np.random.randn(1000, 2), columns=["a", "b"]) In [79]: df["b"] = df["b"] + np.arange(1000) In [80]: df.plot.hexbin(x="a", y="b", gridsize=25); 一个有用的关键字参数是gridsize;它控制 x 方向上的六边形数量,默认为 100。越大gridsize意味着 bin 越多、越小。 默认情况下,计算每个点周围计数的直方图。您可以通过将值传递给和 参数来指定替代聚合。指定每一点的值,并且是一个参数的函数,它将 bin 中的所有值减少为单个数字(例如, , , )。在此示例中,位置由 columns和给出,而值由 column 给出。这些 bin 通过 NumPy 的函数进行聚合。(x, y)Creduce_C_functionC(x, y)reduce_C_functionmeanmaxsumstdabzmax In [81]: df = pd.DataFrame(np.random.randn(1000, 2), columns=["a", "b"]) In [82]: df["b"] = df["b"] + np.arange(1000) In [83]: df["z"] = np.random.uniform(0, 3, 1000) In [84]: df.plot.hexbin(x="a", y="b", C="z", reduce_C_function=np.max, gridsize=25); 有关更多信息,请参阅该hexbin方法和 matplotlib hexbin 文档。 饼图# DataFrame.plot.pie()您可以使用或创建饼图Series.plot.pie()。如果您的数据包含任何NaN,它们将自动填充为 0。ValueError如果您的数据中有任何负值,则会引发A。 In [85]: series = pd.Series(3 * np.random.rand(4), index=["a", "b", "c", "d"], name="series") In [86]: series.plot.pie(figsize=(6, 6)); 对于饼图,最好使用正方形图形,即图形纵横比为 1。您可以创建宽度和高度相等的图形,或者通过调用ax.set_aspect('equal')返回的 axes对象在绘图后强制纵横比相等。 请注意,饼图要求您通过参数 或DataFrame指定目标列。当指定时,将绘制所选列的饼图。如果指定,则每列的饼图将绘制为子图。默认情况下,每个饼图中都会绘制图例;指定隐藏它。ysubplots=Trueysubplots=Truelegend=False In [87]: df = pd.DataFrame( ....: 3 * np.random.rand(4, 2), index=["a", "b", "c", "d"], columns=["x", "y"] ....: ) ....: In [88]: 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 [89]: series.plot.pie( ....: labels=["AA", "BB", "CC", "DD"], ....: colors=["r", "g", "b", "c"], ....: autopct="%.2f", ....: fontsize=20, ....: figsize=(6, 6), ....: ); ....: 如果传递总和小于 1.0 的值,它们将被重新缩放,以便它们的总和为 1。 In [90]: series = pd.Series([0.1] * 4, index=["a", "b", "c", "d"], name="series2") In [91]: series.plot.pie(figsize=(6, 6)); 有关更多信息,请参阅matplotlib 饼图文档。 绘制缺失数据# DataFramespandas 尝试在绘图或Series 包含缺失数据方面保持务实。根据绘图类型,缺失值会被删除、省略或填充。 地块类型 NaN 处理 线 在 NaN 处留下间隙 线(堆叠) 补0 酒吧 补0 分散 删除 NaN 直方图 删除 NaN(按列) 盒子 删除 NaN(按列) 区域 补0 凯德 删除 NaN(按列) 六边形 删除 NaN 馅饼 补0 如果这些默认值中的任何一个不是您想要的,或者如果您想明确如何处理缺失值,请考虑 在绘图之前使用fillna()或。dropna() 绘图工具# 这些函数可以从中导入pandas.plotting 并采用Series或DataFrame作为参数。 散点矩阵图# scatter_matrix您可以使用以下方法创建散点图矩阵 pandas.plotting: In [92]: from pandas.plotting import scatter_matrix In [93]: df = pd.DataFrame(np.random.randn(1000, 4), columns=["a", "b", "c", "d"]) In [94]: scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal="kde"); 密度图# 您可以使用Series.plot.kde()和DataFrame.plot.kde()方法创建密度图。 In [95]: ser = pd.Series(np.random.randn(1000)) In [96]: ser.plot.kde(); 安德鲁斯曲线# 安德鲁斯曲线允许将多元数据绘制为大量曲线,这些曲线是使用样本的属性作为傅里叶级数的系数创建的,请参阅维基百科条目 以获取更多信息。通过为每个类别对这些曲线进行不同的着色,可以可视化数据聚类。属于同一类样本的曲线通常会更靠近并形成更大的结构。 注意:“Iris”数据集可在此处获取。 In [97]: from pandas.plotting import andrews_curves In [98]: data = pd.read_csv("data/iris.data") In [99]: plt.figure(); In [100]: andrews_curves(data, "Name"); 平行坐标# 平行坐标是一种用于绘制多元数据的绘图技术, 有关介绍,请参阅维基百科条目。平行坐标允许人们看到数据中的簇并直观地估计其他统计数据。使用平行坐标点表示为连接的线段。每条垂直线代表一个属性。一组连接的线段代表一个数据点。倾向于聚集的点看起来会更靠近。 In [101]: from pandas.plotting import parallel_coordinates In [102]: data = pd.read_csv("data/iris.data") In [103]: plt.figure(); In [104]: parallel_coordinates(data, "Name"); 滞后图# 滞后图用于检查数据集或时间序列是否随机。随机数据不应在滞后图中表现出任何结构。非随机结构意味着底层数据不是随机的。争论lag可能会被通过,而当lag=1情节本质上是data[:-1]对的 data[1:]。 In [105]: from pandas.plotting import lag_plot In [106]: plt.figure(); In [107]: spacing = np.linspace(-99 * np.pi, 99 * np.pi, num=1000) In [108]: data = pd.Series(0.1 * np.random.rand(1000) + 0.9 * np.sin(spacing)) In [109]: lag_plot(data); 自相关图# 自相关图通常用于检查时间序列中的随机性。这是通过计算不同时间滞后的数据值的自相关来完成的。如果时间序列是随机的,则对于任何和所有时滞分离,这种自相关性都应该接近于零。如果时间序列是非随机的,则一个或多个自相关将显着非零。图中显示的水平线对应于 95% 和 99% 置信带。虚线是 99% 置信带。有关自相关图的更多信息,请参阅 维基百科条目。 In [110]: from pandas.plotting import autocorrelation_plot In [111]: plt.figure(); In [112]: spacing = np.linspace(-9 * np.pi, 9 * np.pi, num=1000) In [113]: data = pd.Series(0.7 * np.random.rand(1000) + 0.3 * np.sin(spacing)) In [114]: autocorrelation_plot(data); 自举图# Bootstrap 图用于直观地评估统计量的不确定性,例如平均值、中位数、中值等。从数据集中选择指定大小的随机子集,针对该子集计算相关统计量,过程为重复指定次数。生成的图和直方图构成了引导图。 In [115]: from pandas.plotting import bootstrap_plot In [116]: data = pd.Series(np.random.rand(1000)) In [117]: bootstrap_plot(data, size=50, samples=500, color="grey"); RadViz # RadViz 是一种可视化多变量数据的方法。它基于简单的Spring张力最小化算法。基本上你在平面上设置了一堆点。在我们的例子中,它们在单位圆上等距分布。每个点代表一个属性。然后,假设数据集中的每个样本都通过Spring连接到每个点,Spring的刚度与该属性的数值成正比(它们被标准化为单位间隔)。平面上样品稳定的点(作用在样品上的力处于平衡状态)就是绘制代表样品的点的位置。根据样本属于哪个类,它的颜色会有所不同。 有关详细信息,请参阅 R 包Raviz 。 注意:“Iris”数据集可在此处获取。 In [118]: from pandas.plotting import radviz In [119]: data = pd.read_csv("data/iris.data") In [120]: plt.figure(); In [121]: radviz(data, "Name"); 绘图格式# 设置绘图风格# 从版本 1.5 及更高版本开始,matplotlib 提供了一系列预配置的绘图样式。设置样式可用于轻松地为绘图提供您想要的总体外观。设置样式就像matplotlib.style.use(my_plot_style)在创建绘图之前调用一样简单。例如,您可以编写matplotlib.style.use('ggplot')ggplot 风格的图。 您可以在此处看到各种可用的样式名称,matplotlib.style.available并且很容易尝试它们。 一般情节风格参数# 大多数绘图方法都有一组关键字参数,用于控制返回绘图的布局和格式: In [122]: plt.figure(); In [123]: ts.plot(style="k--", label="Series"); 对于每种绘图(例如line、bar、scatter),任何附加参数关键字都会传递给相应的 matplotlib 函数(ax.plot()、 ax.bar()、 ax.scatter())。这些可用于控制 pandas 提供之外的其他样式。 控制传奇# 您可以将legend参数设置为False隐藏默认情况下显示的图例。 In [124]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD")) In [125]: df = df.cumsum() In [126]: df.plot(legend=False); 控制标签# 您可以设置xlabel和ylabel参数来为 x 轴和 y 轴提供绘图自定义标签。默认情况下,pandas 会将索引名称选择为 xlabel,而将 ylabel 保留为空。 In [127]: df.plot(); In [128]: df.plot(xlabel="new x", ylabel="new y"); 秤# 您可以通过logy获取对数刻度 Y 轴。 In [129]: ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000)) In [130]: ts = np.exp(ts.cumsum()) In [131]: ts.plot(logy=True); 另请参见logx和loglog关键字参数。 在辅助 y 轴上绘图# 要在辅助 y 轴上绘制数据,请使用secondary_y关键字: In [132]: df["A"].plot(); In [133]: df["B"].plot(secondary_y=True, style="g"); 要在 a 中绘制某些列DataFrame,请将列名称指定给secondary_y 关键字: In [134]: plt.figure(); In [135]: ax = df.plot(secondary_y=["A", "B"]) In [136]: ax.set_ylabel("CD scale"); In [137]: ax.right_ax.set_ylabel("AB scale"); 请注意,在辅助 y 轴上绘制的列在图例中自动标记为“(右)”。要关闭自动标记,请使用 mark_right=False关键字: In [138]: plt.figure(); In [139]: df.plot(secondary_y=["A", "B"], mark_right=False); 时间序列图的自定义格式化程序# pandas 为时间序列图提供自定义格式化程序。这些更改了日期和时间轴标签的格式。默认情况下,自定义格式化程序仅应用于 pandas 使用 DataFrame.plot()或来创建的绘图Series.plot()。要将它们应用于所有绘图,包括由 matplotlib 绘制的绘图,请设置选项 或使用 .pd.options.plotting.matplotlib.register_converters = Truepandas.plotting.register_matplotlib_converters() 抑制刻度分辨率调整# pandas 包括针对常规频率时间序列数据的自动刻度分辨率调整。对于 pandas 无法推断频率信息的有限情况(例如,在外部创建的twinx),您可以选择抑制此行为以进行对齐。 这是默认行为,请注意 x 轴刻度标签是如何执行的: In [140]: plt.figure(); In [141]: df["A"].plot(); 使用该x_compat参数,您可以抑制此行为: In [142]: plt.figure(); In [143]: df["A"].plot(x_compat=True); 如果您有多个图需要抑制,则可以在语句中使用use中的方法:pandas.plotting.plot_paramswith In [144]: plt.figure(); In [145]: 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 文档。 次要情节# Seriesa 中的每个都DataFrame可以使用关键字绘制在不同的轴上subplots: In [146]: df.plot(subplots=True, figsize=(6, 6)); 使用布局并定位多个轴# 子图的布局可以通过layout关键字指定。是可以接受的 。关键字也可以用在 and中。如果输入无效,则会引发 a。(rows, columns)layouthistboxplotValueError 由 指定的行 x 列可以包含的轴数layout必须大于所需子图的数量。如果布局可以包含多于所需的轴,则不会绘制空白轴。与 NumPy 数组的reshape方法类似,您可以使用-1一个维度来自动计算所需的行数或列数(给定另一个维度)。 In [147]: df.plot(subplots=True, layout=(2, 3), figsize=(6, 6), sharex=False); 上面的例子与使用相同: In [148]: df.plot(subplots=True, layout=(2, -1), figsize=(6, 6), sharex=False); 所需的列数 (3) 是根据要绘制的系列数和给定的行数 (2) 推断出来的。 您可以通过关键字以类似列表的形式传递预先创建的多个轴ax。这允许更复杂的布局。传递的轴必须与正在绘制的子图的数量相同。 当通过关键字传递多个轴时ax,layout,sharex和sharey关键字不会影响输出。您应该显式传递sharex=False和sharey=False,否则您将看到警告。 In [149]: fig, axes = plt.subplots(4, 4, figsize=(9, 9)) In [150]: plt.subplots_adjust(wspace=0.5, hspace=0.5) In [151]: target1 = [axes[0][0], axes[1][1], axes[2][2], axes[3][3]] In [152]: target2 = [axes[3][0], axes[2][1], axes[1][2], axes[0][3]] In [153]: df.plot(subplots=True, ax=target1, legend=False, sharex=False, sharey=False); In [154]: (-df).plot(subplots=True, ax=target2, legend=False, sharex=False, sharey=False); 另一种选择是将ax参数传递给Series.plot()在特定轴上绘图: In [155]: np.random.seed(123456) In [156]: ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000)) In [157]: ts = ts.cumsum() In [158]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD")) In [159]: df = df.cumsum() In [160]: fig, axes = plt.subplots(nrows=2, ncols=2) In [161]: plt.subplots_adjust(wspace=0.2, hspace=0.5) In [162]: df["A"].plot(ax=axes[0, 0]); In [163]: axes[0, 0].set_title("A"); In [164]: df["B"].plot(ax=axes[0, 1]); In [165]: axes[0, 1].set_title("B"); In [166]: df["C"].plot(ax=axes[1, 0]); In [167]: axes[1, 0].set_title("C"); In [168]: df["D"].plot(ax=axes[1, 1]); In [169]: axes[1, 1].set_title("D"); 用误差线绘图# DataFrame.plot()和中支持使用误差线绘图Series.plot()。 水平和垂直误差线可以提供给xerr和yerr关键字参数plot()。可以使用多种格式指定错误值: 作为列名与绘图属性匹配或DataFrame与.dictcolumnsDataFramenameSeries 作为str指示绘图的哪一列DataFrame包含错误值。 作为原始值(list、tuple或np.ndarray)。必须与绘图DataFrame/ 的长度相同Series。 以下是一种轻松绘制组均值与原始数据标准差的方法的示例。 # Generate the data In [170]: 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 [171]: 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 [172]: gp3 = df3.groupby(level=("letter", "word")) In [173]: means = gp3.mean() In [174]: errors = gp3.std() In [175]: means Out[175]: 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 [176]: errors Out[176]: 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 [177]: fig, ax = plt.subplots() In [178]: means.plot.bar(yerr=errors, ax=ax, capsize=4, rot=0); 还支持不对称误差线,但在这种情况下必须提供原始误差值。对于Nlength Series,2xN应提供一个数组来指示下限和上限(或左和右)错误。对于 a MxN DataFrame,不对称错误应位于Mx2xN数组中。 以下是使用不对称误差线绘制最小/最大范围的一种方法的示例。 In [179]: mins = gp3.min() In [180]: maxs = gp3.max() # errors should be positive, and defined in the order of lower, upper In [181]: errors = [[means[c] - mins[c], maxs[c] - means[c]] for c in df3.columns] # Plot In [182]: fig, ax = plt.subplots() In [183]: means.plot.bar(yerr=errors, ax=ax, capsize=4, rot=0); 绘制表格# 现在支持使用关键字DataFrame.plot()来使用 matplotlib 表进行绘图。关键字可以接受,或。绘制表格的简单方法是指定。数据将被转置以满足 matplotlib 的默认布局。Series.plot()tabletableboolDataFrameSeriestable=True In [184]: np.random.seed(123456) In [185]: fig, ax = plt.subplots(1, 1, figsize=(7, 6.5)) In [186]: df = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"]) In [187]: ax.xaxis.tick_top() # Display x-axis ticks on top. In [188]: df.plot(table=True, ax=ax); 另外,您可以将不同的DataFrameor传递Series给 table关键字。数据将按照打印方法中显示的方式绘制(不会自动转置)。如果需要,应手动转置,如下例所示。 In [189]: fig, ax = plt.subplots(1, 1, figsize=(7, 6.75)) In [190]: ax.xaxis.tick_top() # Display x-axis ticks on top. In [191]: df.plot(table=np.round(df.T, 2), ax=ax); 还有一个辅助函数,它从orpandas.plotting.table创建一个表,并将其添加到一个 实例中。该函数可以接受 matplotlib表具有的关键字。DataFrameSeriesmatplotlib.Axes In [192]: from pandas.plotting import table In [193]: fig, ax = plt.subplots(1, 1) In [194]: table(ax, np.round(df.describe(), 2), loc="upper right", colWidths=[0.2, 0.2, 0.2]); In [195]: df.plot(ax=ax, ylim=(0, 2), legend=None); 注意:您可以使用属性获取轴上的表实例axes.tables以进行进一步装饰。有关更多信息,请参阅matplotlib 表文档。 色彩图# 绘制大量列时的一个潜在问题是,由于默认颜色的重复,可能很难区分某些系列。为了解决这个问题,DataFrame绘图支持使用colormap参数,该参数接受 Matplotlib颜色图 或作为在 Matplotlib 中注册的颜色图名称的字符串。默认 matplotlib 颜色图的可视化可在此处获得。 由于 matplotlib 不直接支持基于线的绘图的颜色图,因此根据DataFrame.没有考虑背景颜色,因此某些颜色图会产生不易看见的线条。 要使用立方体螺旋颜色图,我们可以传递colormap='cubehelix'. In [196]: np.random.seed(123456) In [197]: df = pd.DataFrame(np.random.randn(1000, 10), index=ts.index) In [198]: df = df.cumsum() In [199]: plt.figure(); In [200]: df.plot(colormap="cubehelix"); 或者,我们可以传递颜色图本身: In [201]: from matplotlib import cm In [202]: plt.figure(); In [203]: df.plot(colormap=cm.cubehelix); 颜色图也可以用于其他绘图类型,例如条形图: In [204]: np.random.seed(123456) In [205]: dd = pd.DataFrame(np.random.randn(10, 10)).map(abs) In [206]: dd = dd.cumsum() In [207]: plt.figure(); In [208]: dd.plot.bar(colormap="Greens"); 平行坐标图: In [209]: plt.figure(); In [210]: parallel_coordinates(data, "Name", colormap="gist_rainbow"); 安德鲁斯曲线图: In [211]: plt.figure(); In [212]: andrews_curves(data, "Name", colormap="winter"); 直接用 Matplotlib 绘图# 在某些情况下,直接使用 matplotlib 准备绘图可能仍然更好或有必要,例如当 pandas(尚)不支持某种类型的绘图或自定义时。Series对象DataFrame 的行为类似于数组,因此可以直接传递给 matplotlib 函数,而无需显式转换。 pandas 还自动注册识别日期索引的格式化程序和定位器,从而将日期和时间支持扩展到 matplotlib 中几乎所有可用的绘图类型。尽管这种格式无法提供与通过 pandas 绘图时相同的细化级别,但在绘制大量点时它可以更快。 In [213]: np.random.seed(123456) In [214]: price = pd.Series( .....: np.random.randn(150).cumsum(), .....: index=pd.date_range("2000-1-1", periods=150, freq="B"), .....: ) .....: In [215]: ma = price.rolling(20).mean() In [216]: mstd = price.rolling(20).std() In [217]: plt.figure(); In [218]: plt.plot(price.index, price, "k"); In [219]: plt.plot(ma.index, ma, "b"); In [220]: plt.fill_between(mstd.index, ma - 2 * mstd, ma + 2 * mstd, color="b", alpha=0.2); 绘制后端# pandas 可以通过第三方绘图后端进行扩展。主要思想是让用户选择一个与基于 Matplotlib 提供的绘图后端不同的绘图后端。 这可以通过将“backend.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、hvplot...)来生成绘图。生态系统页面上列出了一些实现 pandas 后端的库。 开发人员指南可以在https://pandas.pydata.org/docs/dev/development/extending.html#plotting-backends找到