如何减少so.Plot分类X轴的刻度数量?
解决Seaborn Objects分类X轴刻度自定义问题
问题核心
unique_loc是分类字符串变量,不能用so.Continuous()(注意你代码里拼写错误:Continuos应为Continuous),连续刻度仅适用于数值型数据。直接调用plt.xticks报错是因为Seaborn Objects会将分类变量映射为整数轴位置,直接传入字符串标签无法匹配轴单位。
方法1:用Seaborn Objects原生so.Categorical()设置刻度
直接在scale中使用so.Categorical(),通过tick(at=...)指定要显示的分类标签:
import seaborn as sns import seaborn.objects as so penguins = sns.load_dataset("penguins") penguins = penguins.assign(unique_loc=penguins['island'] + '_' + penguins.groupby("island").cumcount().astype(str)) # 随机抽样10个要显示的分类标签 sample_ticks = penguins['unique_loc'].sample(10).tolist() ( so.Plot(penguins, x="unique_loc", y="bill_depth_mm") .add(so.Dots()) .scale( x=so.Categorical().tick(at=sample_ticks) ) .show() )
此方法会仅展示你抽样的10个分类标签,其余标签自动隐藏。
方法2:结合Matplotlib手动映射刻度位置与标签
若需通过Matplotlib API调整,需先获取分类变量对应的整数位置,再匹配对应标签:
import seaborn as sns import seaborn.objects as so import matplotlib.pyplot as plt penguins = sns.load_dataset("penguins") penguins = penguins.assign(unique_loc=penguins['island'] + '_' + penguins.groupby("island").cumcount().astype(str)) # 创建绘图对象 p = ( so.Plot(penguins, x="unique_loc", y="bill_depth_mm") .add(so.Dots()) ) f, ax = plt.subplots() # 先完成初始绘图,获取轴的分类映射信息 p.on(ax).plot() # 提取所有分类标签及对应位置 all_cat_labels = [tick.get_text() for tick in ax.get_xticklabels()] all_cat_positions = [tick.get_position()[0] for tick in ax.get_xticklabels()] # 抽样标签并匹配对应位置 sample_labels = penguins['unique_loc'].sample(10).tolist() sample_positions = [all_cat_positions[all_cat_labels.index(lbl)] for lbl in sample_labels] # 设置刻度与标签,旋转避免重叠 ax.set_xticks(sample_positions) ax.set_xticklabels(sample_labels, rotation=45) plt.show()
此方法先让Seaborn Objects完成基础绘图,再通过Matplotlib轴对象获取分类位置映射,实现自定义刻度。
内容的提问来源于stack exchange,提问作者EmHonaise
相关产品推荐
相关产品推荐

