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
中有几个 绘图函数,它们将 Series
或 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
堆叠直方图。可以使用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
,其键为boxes
、whiskers
、medians
和caps
。如果字典中缺少某些键,则对应艺术家使用默认颜色。此外,箱线图具有sym
关键字,用于指定异常值的样式。
当您通过color
关键字传递其他类型的参数时,它将直接传递给 matplotlib 所有boxes
、whiskers
、medians
和caps
的着色。
颜色应用于要绘制的每个箱子。如果您需要更复杂的着色,可以通过传递 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 箱线图文档。
仍然可以使用现有接口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_type
的Series
。
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 轴的数值列。这些可以通过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
方法并指定目标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 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)
点周围计数的直方图。你可以通过将值传递给C
和reduce_C_function
参数来指定替代聚合。C
指定每个(x, y)
点的值,reduce_C_function
是一个带有一个参数的函数,将一个 bin 中的所有值减少为一个单一数字(例如mean
、max
、sum
、std
)。在这个例子中,位置由列a
和b
给出,而值由列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));
你可以使用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 饼图文档。### 条形图
对于带有标签的非时间序列数据,您可能希望生成一个条形图:
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
,其键为boxes
、whiskers
、medians
和caps
。如果dict
中缺少某些键,则对应的艺术家将使用默认颜色。此外,箱线图具有sym
关键字来指定离群值的样式。
当您通过color
关键字传递其他类型的参数时,它将直接传递给所有boxes
、whiskers
、medians
和caps
的着色。
颜色应用于要绘制的每个箱子。如果您想要更复杂的着色,可以通过传递 return_type 来获取每个绘制的图形。
In [42]: color = { ....: "boxes": "DarkGreen", ....: "whiskers": "DarkOrange", ....: "medians": "DarkBlue", ....: "caps": "Gray", ....: } ....: In [43]: df.plot.box(color=color, sym="r+");
此外,您可以通过传递 matplotlib 支持的其他关键字来传递其他关键字。例如,通过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}
。通过by
关键字创建的分面,将影响输出类型:
return_type |
分面 | 输出类型 |
None |
否 | 坐标轴 |
None |
是 | 2-D 数组的坐标轴 |
'axes' |
否 | 坐标轴 |
'axes' |
是 | 坐标轴系列 |
'dict' |
否 | 艺术家的字典 |
'dict' |
是 | 艺术家的字典系列 |
'both' |
否 | 命名元组 |
'both' |
是 | 命名元组系列 |
Groupby.boxplot
总是返回一个return_type
的Series
。
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 轴上具有数值列。这可以通过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
方法指定目标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 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)
点周围的计数直方图。您可以通过将值传递给 C
和 reduce_C_function
参数来指定替代聚合。C
指定每个 (x, y)
点的值,reduce_C_function
是一个带有一个参数的函数,它将箱中的所有值缩减为一个单一的数字(例如 mean
、max
、sum
、std
)。在此示例中,位置由列 a
和 b
给出,而值由列 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));
您可以使用 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 饼图文档。
绘制带缺失数据的图表
pandas 在绘制包含缺失数据的 DataFrame
或 Series
时会尝试保持实用性。根据绘图类型,缺失值会被删除、省略或填充。
绘图类型 | NaN 处理 |
折线图 | 在 NaN 处留空隙 |
线条(堆叠) | 填充 0 值 |
条形图 | 填充 0 值 |
散点图 | 删除 NaN |
直方图 | 删除 NaN(列向) |
箱线图 | 删除 NaN(列向) |
区域 | 填充 0 值 |
KDE | 删除 NaN(列向) |
六边形图 | 删除 NaN |
饼图 | 填充 0 值 |
如果这些默认值不符合您的要求,或者如果您想明确指定如何处理缺失值,请考虑在绘图之前使用 fillna()
或 dropna()
。
Pandas 2.2 中文官方教程和指南(十八)(4)https://developer.aliyun.com/article/1509794