Seaborn jointplot修改标记形状及添加类别标签的实现咨询
Seaborn jointplot修改标记形状及添加类别标签的实现咨询
嗨,我来帮你搞定这两个需求!针对你用Seaborn绘制jointplot时想要修改标记形状、给每个分布上方添加类别标签的问题,我结合Iris数据集整理了具体的实现方案,咱们一步一步来:
一、修改不同类别的标记形状
你当前的代码用了hue区分类别,要给每个类别设置不同的标记形状,只需要在jointplot里加上style参数绑定类别,再通过joint_kws传递markers参数定义具体的标记样式就行。比如咱们给三个鸢尾花类别分别设置圆形、方形、三角形标记:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt # 加载Iris数据集并调整列名(和你的代码对齐) iris = sns.load_dataset("iris") iris.columns = ["sepal length", "sepal width", "petal length", "petal width", "class"] # 绘制jointplot,指定标记形状 g = sns.jointplot( data=iris, x="sepal length", y="sepal width", hue="class", style="class", # 按类别区分标记样式 joint_kws={"markers": ["o", "s", "^"]} # 对应三个类别的标记形状 )
这样就能让每个类别的散点用不同形状的标记显示,和你想要的示例图效果一致。
二、给每个分布上方添加类别标签
接下来要在边际的分布(上方和右侧的直方图)上方添加类别标签,咱们需要获取jointplot的轴对象,然后在对应位置添加文本标签:
# 获取类别名称和对应的配色 classes = iris["class"].unique() palette = sns.color_palette(n_colors=len(classes)) # 给上方的边际x分布添加类别标签 for cls, color in zip(classes, palette): # 筛选当前类别的数据 cls_data = iris[iris["class"] == cls] # 计算该类别x轴数据分布的峰值位置 x_hist, x_bins = np.histogram(cls_data["sepal length"], bins=10) peak_x_pos = x_bins[np.argmax(x_hist)] # 在峰值位置上方添加类别标签 g.ax_marg_x.text( peak_x_pos, g.ax_marg_x.get_ylim()[1] * 1.05, cls, color=color, ha="center", fontweight="bold" ) # 给右侧的边际y分布添加类别标签 for cls, color in zip(classes, palette): cls_data = iris[iris["class"] == cls] # 计算该类别y轴数据分布的峰值位置 y_hist, y_bins = np.histogram(cls_data["sepal width"], bins=10) peak_y_pos = y_bins[np.argmax(y_hist)] # 在峰值位置右侧添加旋转90度的类别标签 g.ax_marg_y.text( g.ax_marg_y.get_xlim()[1] * 1.05, peak_y_pos, cls, color=color, va="center", rotation=90, fontweight="bold" ) # 调整布局,避免标签被画布截断 plt.tight_layout() plt.show()
把两段代码合在一起运行,就能得到和目标图一致的效果啦——不同类别用不同标记,每个分布上方都有对应的类别标签。
备注:内容来源于stack exchange,提问作者Mik
相关产品推荐
相关产品推荐

