HOWTO · Seaborn

在 Seaborn 散点图中设置标记大小

本教程演示了如何在 python 中控制 seaborn 图中的标记大小。

本页内容

在 Seaborn 散点图中让所有标记保持相同大小时,将 s 传给 sns.scatterplot;它使用 Matplotlib 散点图的面积单位(平方点)。若要根据数据改变标记面积,可向 s 传入数值数组。若要使用 Seaborn 管理数据映射和图例,则用 size 指定数据变量,用 sizes 设置显示范围。

方法 1:在 scatterplot 中使用 s 参数

如果希望所有点的标记面积相同,请使用 s。该值表示平方点面积,因此将它加倍并不会让标记宽度也加倍。可以逐步调大或调小,直到点清晰易读且不会彼此遮挡。

运行以下示例。示例中的图表标题 Fixed marker area 和打印输出标签 Marker area: 保持为英文:标题说明标记面积固定,输出则显示标记面积,单位为平方点(pt²)。

import matplotlib.pyplot as plt
import seaborn as sns

x = [1, 2, 3, 4]
y = [2, 3, 2, 5]
area = 64

sns.scatterplot(x=x, y=y, s=area, color="teal", marker="o")
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Fixed marker area")
print(f"Marker area: {area} pt^2")
plt.close()
Marker area: 64 pt^2

本次调用中的固定 s 值适用于所有点。如果希望用颜色区分组别,可以添加 hue 映射;它与标记面积相互独立。

方法 2:使用变量调整标记大小

若要让每个标记的面积表示某个数值列,请为 s 传入每行一个数值。由于这些值表示面积,应先将该列缩放到合适范围,而不要不加处理地直接使用原始测量值。例如,对于名为 data 的 DataFrame,s=data["party_size"] * 20 会为每一行提供一个面积;请根据数据和图形尺寸调整乘数。确保 x、y 和大小值按行对应。

如果还希望用颜色表示另一个分类变量,可以同时使用 hue="day"。大小值应保持为数值;分类分组应通过 hue 表示,而不是乘入 s。

方法 3:使用其他参数自定义标记大小

如果希望 Seaborn 将数据变量映射到标记大小,并自动创建相应图例,请使用 Seaborn 的 size 语义。例如,对于名为 data 的 DataFrame,可以调用 sns.scatterplot(data=data, x="total_bill", y="tip", size="size", sizes=(30, 180))。这里的 size 指定要映射的列,而 sizes 给出标记面积的最小值和最大值,单位为平方点。数值会按比例映射到该范围;分类大小变量则会显示为离散级别。

可以将 size 与用于颜色分组的 hue、用于标记形状的 style 结合使用。用 palette 为 hue 映射选择颜色;如果不需要 hue 映射,则可以用 color 指定单一颜色。设置 marker 可为所有点选择相同的标记形状。这些选项有助于区分组别,但视觉编码应保持精简,以免大小图例难以阅读。

结论

如果需要固定标记面积,或为每个点传入数值面积数组,请选择 s。如果需要根据数据映射大小、显示大小图例并控制范围,请选择 Seaborn 的 size 和 sizes。请记住,标记大小指的是面积;调整数值,让最终图形中的点清晰易辨。

常见问题

  1. 如何更改 Seaborn 中默认的标记大小? 将面积值传给 sns.scatterplot 的 s,例如 s=64,即可为所有点设置相同大小。

  2. 同一张散点图中的点可以有不同大小吗? 可以。向 s 传入每行一个数值的数组,或使用 size 和 sizes 来设置 Seaborn 的映射范围及图例。

  3. hue 有什么作用? 它将变量映射到颜色,常用于区分不同类别。它与标记大小映射彼此独立。

  4. 如何让图表更易读? 调整面积范围;只有在不同颜色或标记样式能表示有用的分组时才使用它们,并为坐标轴添加标签。如果点彼此重叠,可以缩小标记或调整透明度。

  5. 如何保存 Seaborn 散点图? 在显示或关闭 Matplotlib 图形前保存它。例如,创建图表后调用 plt.savefig("scatterplot.png", dpi=150, bbox_inches="tight")。