能否在Joyplot(山脊图)的y轴上添加各分类对应的计数数值?
解决joypy山脊图添加分类计数次y轴的方法
- 首先提前统计每个分组对应的样本计数值,保证顺序和山脊图的分组顺序一致
- 遍历joypy返回的每个分组子图,为每个子图添加右侧次Y轴,仅在对应分类的对齐位置显示计数值
- 调整整体布局避免标签遮挡
完整实现代码如下:
import joypy import pandas as pd import numpy as np from matplotlib import pyplot as plt from matplotlib import cm from sklearn.datasets import load_iris # 加载示例数据集 iris = load_iris() iris_df = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['species']) # 转换为分类名称方便显示 iris_df['species'] = iris_df['species'].map({0:'setosa', 1:'versicolor', 2:'virginica'}) # 统计每个分类的计数值,顺序和山脊图分组顺序保持一致 group_col = 'species' counts = iris_df[group_col].value_counts().sort_index() # 生成山脊图,可根据需求修改展示的数值列、图表尺寸等参数 fig, axes = joypy.joyplot(iris_df, by=group_col, column=iris['feature_names'][0], figsize=(10,6)) # 为每个分图添加右侧计数轴 for idx, ax in enumerate(axes[:-1]): # axes最后一个为共享x轴,无需处理 ax2 = ax.twinx() # 次Y轴范围和原Y轴保持一致 ax2.set_ylim(ax.get_ylim()) # 仅在中间位置显示对应分组的计数值,和左侧分类标签对齐 ax2.set_yticks([0.5]) ax2.set_yticklabels([counts.iloc[idx]]) # 隐藏次Y轴的刻度线避免干扰 ax2.tick_params(axis='y', length=0) # 给右侧计数轴添加统一标签 fig.text(0.92, 0.5, '分类样本计数', va='center', rotation='vertical', fontsize=12) # 调整布局避免标签被截断 plt.subplots_adjust(right=0.88) plt.show()
如果你的数据分组逻辑不同,只需修改group_col为实际的分组列名即可,计数值的统计逻辑也可根据需求调整,只要保证counts的顺序和山脊图的分组顺序完全匹配就能正常显示。
内容的提问来源于stack exchange,提问作者Hoppity81
相关产品推荐
相关产品推荐

