Pandas 2.2 中文官方教程和指南(十八)(3)

简介: Pandas 2.2 中文官方教程和指南(十八)

Pandas 2.2 中文官方教程和指南(十八)(2)https://developer.aliyun.com/article/1509792

其他图形

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

  • ‘bar’ 或 ‘barh’ 用于条形图
  • ‘hist’ 用于直方图
  • ‘box’ 用于箱线图
  • ‘kde’ 或 ‘density’ 用于密度图
  • ‘area’ 用于面积图
  • ‘scatter’ 用于散点图
  • ‘hexbin’ 用于六边形二进制图
  • ‘pie’ 用于饼图

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

In [14]: plt.figure();
In [15]: df.iloc[5].plot(kind="bar"); 

您还可以使用方法 DataFrame.plot. 来创建这些其他图,而不是提供 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 中有几个 绘图函数,它们将 SeriesDataFrame 作为参数。这些包括:

  • 散点矩阵
  • 安德鲁曲线
  • 平行坐标
  • 滞后图
  • 自相关图
  • 自举图
  • 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堆叠直方图。可以使用bins关键字更改箱子大小。

In [28]: plt.figure();
In [29]: df4.plot.hist(stacked=True, bins=20); 

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

In [30]: plt.figure();
In [31]: df4["a"].plot.hist(orientation="horizontal", cumulative=True); 

查看 hist 方法和 matplotlib 直方图文档 以获取更多信息。

现有的接口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)); 

另外,在 DataFrame.plot.hist() 中也可以指定by关键字。

从版本 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 次观察的箱线图。

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

通过传递color关键字可以给箱线图上色。您可以传递一个dict,其键为boxeswhiskersmedianscaps。如果字典中缺少某些键,则对应艺术家使用默认颜色。此外,箱线图具有sym关键字,用于指定异常值的样式。

当您通过color关键字传递其他类型的参数时,它将直接传递给 matplotlib 所有boxeswhiskersmedianscaps的着色。

颜色应用于要绘制的每个箱子。如果您需要更复杂的着色,可以通过传递 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=Falsepositions关键字可以绘制水平和自定义位置的箱线图。

In [44]: df.plot.box(vert=False, positions=[1, 4, 5, 6, 8]); 

更多信息请参见boxplot方法和matplotlib 箱线图文档

仍然可以使用现有接口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}。由带有by关键字的DataFrame.boxplot创建的分面图也会影响输出类型:

return_type 分面 输出类型
None axes
None 2-D ndarray of axes
'axes' axes
'axes' axes 的 Series
'dict' 艺术家的字典
'dict' 艺术家字典的 Series
'both' 命名元组
'both' 命名元组的 Series

Groupby.boxplot总是返回一个return_typeSeries

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。如果要删除或用不同值填充,请在调用plot之前使用dataframe.dropna()dataframe.fillna()

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 轴的数值列。这些可以通过xy关键字指定。

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方法并指定目标ax。建议指定colorlabel关键字以区分每个组。

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 scatter 文档。### 六边形箱图

您可以使用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意味着更多、更小的箱子。

默认情况下,计算每个(x, y)点周围计数的直方图。你可以通过将值传递给Creduce_C_function参数来指定替代聚合。C指定每个(x, y)点的值,reduce_C_function是一个带有一个参数的函数,将一个 bin 中的所有值减少为一个单一数字(例如meanmaxsumstd)。在这个例子中,位置由列ab给出,而值由列z给出。使用 NumPy 的max函数对 bin 进行聚合。

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

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创建的饼图要求你通过y参数或subplots=True来指定目标列。当指定了y时,将绘制所选列的饼图。如果指定了subplots=True,将为每列绘制子图的饼图。默认情况下,每个饼图中都会绘制图例;指定legend=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)); 

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

警告

大多数 pandas 绘图使用labelcolor参数(请注意这两个参数的缺少“s”)。为了与matplotlib.pyplot.pie()保持一致,你必须使用labelscolors

如果想要隐藏楔形图标签,请指定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 饼图文档。### 条形图

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

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堆叠直方图。可以使用bins关键字更改 bin 大小。

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

此外,还可以在DataFrame.plot.hist()中指定by关键字。

从版本 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 次观测的五次试验的箱线图。

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

通过传递color关键字可以为箱线图着色。您可以传递一个dict,其键为boxeswhiskersmedianscaps。如果dict中缺少某些键,则对应的艺术家将使用默认颜色。此外,箱线图具有sym关键字来指定离群值的样式。

当您通过color关键字传递其他类型的参数时,它将直接传递给所有boxeswhiskersmedianscaps的着色。

颜色应用于要绘制的每个箱子。如果您想要更复杂的着色,可以通过传递 return_type 来获取每个绘制的图形。

In [42]: color = {
 ....:    "boxes": "DarkGreen",
 ....:    "whiskers": "DarkOrange",
 ....:    "medians": "DarkBlue",
 ....:    "caps": "Gray",
 ....: }
 ....: 
In [43]: df.plot.box(color=color, sym="r+"); 

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

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}。通过by关键字创建的分面,将影响输出类型:

return_type 分面 输出类型
None 坐标轴
None 2-D 数组的坐标轴
'axes' 坐标轴
'axes' 坐标轴系列
'dict' 艺术家的字典
'dict' 艺术家的字典系列
'both' 命名元组
'both' 命名元组系列

Groupby.boxplot总是返回一个return_typeSeries

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。如果你想要删除或用不同的值填充,请在调用plot之前使用dataframe.dropna()dataframe.fillna()

In [67]: df = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
In [68]: df.plot.area(); 

要生成未堆叠的图,请传递stacked=False。除非另有说明,否则α值设为 0.5:

In [69]: df.plot.area(stacked=False); 

### 散点图

散点图可通过使用DataFrame.plot.scatter()方法绘制。散点图需要在 x 和 y 轴上具有数值列。这可以通过xy关键字指定。

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方法指定目标ax。建议指定colorlabel关键字以区分每个组。

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 scatter 文档了解更多信息。

六边形箱图

您可以使用 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意味着更多、更小的箱子。

默认情况下,计算每个 (x, y) 点周围的计数直方图。您可以通过将值传递给 Creduce_C_function 参数来指定替代聚合。C 指定每个 (x, y) 点的值,reduce_C_function 是一个带有一个参数的函数,它将箱中的所有值缩减为一个单一的数字(例如 meanmaxsumstd)。在此示例中,位置由列 ab 给出,而值由列 z 给出。箱子使用 NumPy 的 max 函数进行聚合。

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

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') 设置纵横比相等。

请注意,使用 DataFrame 创建的饼图需要通过 y 参数或 subplots=True 指定目标列。当指定了 y,将绘制所选列的饼图。如果指定了 subplots=True,将绘制每列的饼图子图。默认情况下,每个饼图中都会绘制图例;指定 legend=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)); 

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

警告

大多数 pandas 绘图使用 labelcolor 参数(请注意这两个参数上没有“s”)。为了与 matplotlib.pyplot.pie() 保持一致,您必须使用 labelscolors

如果要隐藏楔形图标签,请指定 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 饼图文档

绘制带缺失数据的图表

pandas 在绘制包含缺失数据的 DataFrameSeries 时会尝试保持实用性。根据绘图类型,缺失值会被删除、省略或填充。

绘图类型 NaN 处理
折线图 在 NaN 处留空隙
线条(堆叠) 填充 0 值
条形图 填充 0 值
散点图 删除 NaN
直方图 删除 NaN(列向)
箱线图 删除 NaN(列向)
区域 填充 0 值
KDE 删除 NaN(列向)
六边形图 删除 NaN
饼图 填充 0 值

如果这些默认值不符合您的要求,或者如果您想明确指定如何处理缺失值,请考虑在绘图之前使用 fillna()dropna()

Pandas 2.2 中文官方教程和指南(十八)(4)https://developer.aliyun.com/article/1509794

相关文章
|
5天前
|
SQL 数据采集 数据挖掘
Pandas 教程
10月更文挑战第25天
16 2
|
3月前
|
存储 JSON 数据格式
Pandas 使用教程 CSV - CSV 转 JSON
Pandas 使用教程 CSV - CSV 转 JSON
33 0
|
3月前
|
JSON 数据格式 Python
Pandas 使用教程 JSON
Pandas 使用教程 JSON
39 0
|
3月前
|
SQL 数据采集 JSON
Pandas 使用教程 Series、DataFrame
Pandas 使用教程 Series、DataFrame
55 0
|
5月前
|
数据采集 存储 数据可视化
Pandas高级教程:数据清洗、转换与分析
Pandas是Python的数据分析库,提供Series和DataFrame数据结构及数据分析工具,便于数据清洗、转换和分析。本教程涵盖Pandas在数据清洗(如缺失值、重复值和异常值处理)、转换(数据类型转换和重塑)和分析(如描述性统计、分组聚合和可视化)的应用。通过学习Pandas,用户能更高效地处理和理解数据,为数据分析任务打下基础。
579 3
|
6月前
|
索引 Python
Pandas 2.2 中文官方教程和指南(一)(4)
Pandas 2.2 中文官方教程和指南(一)
55 0
|
6月前
|
存储 SQL JSON
Pandas 2.2 中文官方教程和指南(一)(3)
Pandas 2.2 中文官方教程和指南(一)
92 0
|
6月前
|
XML 关系型数据库 PostgreSQL
Pandas 2.2 中文官方教程和指南(一)(2)
Pandas 2.2 中文官方教程和指南(一)
167 0
|
6月前
|
XML 关系型数据库 MySQL
Pandas 2.2 中文官方教程和指南(一)(1)
Pandas 2.2 中文官方教程和指南(一)
164 0
|
6月前
|
C++ 索引 Python
Pandas 2.2 中文官方教程和指南(五)(4)
Pandas 2.2 中文官方教程和指南(五)
46 0