如何绘制非正方形的 Seaborn jointplot 或 JointGrid?
在数据可视化领域,Seaborn 是最常用的 Python 库之一。Seaborn 为数据科学家提供了丰富的绘图功能,可以生成高质量的图表,同时也具有易用性。
而 jointplot 和 JointGrid 是 Seaborn 中最常用的函数之一。它们在可视化二元数据分布时非常有用,例如散点图和核密度估计。
默认情况下,jointplot 和 JointGrid 生成的图表是正方形的。然而,我们可能需要绘制非正方形的图表以适应我们的需求。接下来,我们将介绍如何绘制非正方形的 Seaborn jointplot 或 JointGrid。
使用 Aspect 参数
Seaborn 中的 jointplot 和 JointGrid 函数都有一个叫做 Aspect 的参数。Aspect 是指图表宽度与高度之比。默认情况下,Aspect 的值为 1,即生成正方形的图表。
我们可以通过调整 Aspect 参数的值来生成非正方形的图表。例如,我们可以将 Aspect 的值设置为 2 来生成一个宽度为高度的 2:1 比例的图表。
下面是一个示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
iris = sns.load_dataset("iris")
g = sns.JointGrid(x="sepal_length", y="petal_length", data=iris)
g = g.plot_joint(sns.kdeplot, cmap="Reds_d")
g = g.plot_marginals(sns.kdeplot, color="r", shade=True)
plt.subplots_adjust(top=0.9)
g.fig.suptitle('Iris Sepal Length vs. Petal Length', fontsize=14)
g = g.ax_joint.set_aspect(2)
plt.show()
上面的示例代码中,我们将 Aspect 的值设置为 2,并且将 Iris 数据集中的 sepal_length 和 petal_length 列进行绘制。接下来,我们使用 Red_d 颜色映射绘制二元核密度估计图表,同时将边缘的核密度估计绘制成阴影。最后,我们将图表的宽度设置为其高度的两倍,生成了一个非正方形的图表。
使用 subplots_adjust
除了通过 Aspect 参数调整宽高比例外,我们还可以使用 matplotlib 中的 subplots_adjust 函数来生成非正方形的图表。该函数允许我们在生成的图表中添加空白区域,从而使图表呈现非正方形的形状。
下面是一个示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="ticks", color_codes=True)
iris = sns.load_dataset("iris")
g = sns.jointplot(x="sepal_length", y="petal_length", data=iris, kind="kde", space=0)
g.fig.subplots_adjust(top=0.9)
g.fig.suptitle('Iris Sepal Length vs. Petal Length', fontsize=14)
g.ax_joint.set_aspect(2)
g.ax_marg_x.set_axis_off()
g.ax_marg_y.set_axis_off()
plt.show()
在上面的例子中,我们使用 kind 参数将 jointplot 函数的类型设置为 kde(二元核密度估计)。我们还将 space 参数设置为 0,以生成一个非常紧凑的图表。这个参数的目的是使图表呈现非正方形的形状,而不是留出空白区域。
接下来,我们使用 subplots_adjust 函数将图表的顶部空出一些空白区域。最后,我们将图表的宽度设置为其高度的两倍,并使其中的两个边缘轴(x 轴和 y 轴)不可见以获得最终的非正方形图表。
使用 mpl_toolkits 中的 AxesDivider 类
plot_joint 和plot_marginals 这些函数分别用于绘制主图和边缘的图表。在绘制非正方形的 Seaborn jointplot 或 JointGrid 时,我们还可以使用 mpl_toolkits 包中的 AxesDivider 类。
该类用于将图表分解为子图,可以帮助我们在 Seaborn 中生成非正方形的图表。从技术上讲,它不是 Seaborn 库的一部分,而是 matplotlib 库的一部分。
下面是一个示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
sns.set(style="ticks", color_codes=True)
iris = sns.load_dataset("iris")
fig, ax = plt.subplots()
g = sns.kdeplot(x="sepal_length", y="petal_length", data=iris, cmap="Reds", ax=ax)
g.set_aspect(2)
divider = make_axes_locatable(ax)
ax_marg_x = divider.append_axes("top", 0.4, pad=0.1, sharex=ax)
ax_marg_y = divider.append_axes("right", 0.4, pad=0.1, sharey=ax)
sns.kdeplot(iris["sepal_length"], ax=ax_marg_x, legend=False)
sns.kdeplot(iris["petal_length"], ax=ax_marg_y, vertical=True, legend=False)
ax.set(title='Iris Sepal Length vs. Petal Length', xlabel='sepal_length', ylabel='petal_length')
plt.subplots_adjust(top=0.9)
plt.show()
在上面的例子中,我们首先使用 Seaborn 中的 kdeplot 函数绘制一个二元的核密度估计图表。我们将 cmap 参数设置为 Reds 色图,并将宽度设置为高度的两倍。
接下来,我们使用 AxesDivider 类中的 make_axes_locatable 函数将主图分解为两个子图,一个在顶部用于绘制边缘 KDE 图表,另一个在右侧用于绘制边缘的 KDE 图表。我们将两个子图的宽度都设置为 0.4,并将它们设置为共享父级轴的属性(sharex=ax 和 sharey=ax)。
然后,我们使用 Seaborn 的 kdeplot 函数分别在边缘子图上绘制 sepal_length 和 petal_length 的 KDE 图表。为了获得垂直方向的 KDE 图表,我们将 vertical 参数设置为 True。
最后,我们使用 subplots_adjust 函数将图表的顶部留出一些空白区域,并设置主轴的标题和标签。我们也可以自己调整边缘轴的位置和大小来进一步改进图表的外观。
结论
以上就是如何绘制非正方形的 Seaborn jointplot 或 JointGrid 的方法。我们可以使用 Aspect 参数、subplots_adjust 函数或 mpl_toolkits 中的 AxesDivider 类来生成各种形状的图表。
选择哪种方法取决于您的需求和偏好。无论如何,Seaborn 和 matplotlib 库都提供了足够的工具和函数来帮助我们创建高质量、美观的数据可视化图表。
极客笔记