如何移除Seaborn swarmplot图表首尾的垂直网格线且不破坏水平网格线连续性?
如何移除Seaborn swarmplot图表首尾的垂直网格线且不破坏水平网格线连续性?
嘿,这个问题其实和Seaborn的swarmplot参数无关,本质是Matplotlib轴网格的显示逻辑问题~默认情况下,ax.grid(True)会在所有刻度位置绘制网格线,包括x轴首尾的刻度,所以才会出现那两条不对称的垂直线。
给你一个简单直接的解决方案,不需要修改图表本身的绘制逻辑,只要在绘制完网格后,手动隐藏首尾的垂直网格线就行:
首先,保留你原来的代码,然后在网格设置的后面加上这几行:
# 获取x轴的所有垂直网格线对象 x_grid_lines = ax.get_xgridlines() # 隐藏第一条和最后一条垂直网格线 if len(x_grid_lines) >= 2: x_grid_lines[0].set_visible(False) x_grid_lines[-1].set_visible(False)
整合到你的完整代码片段里就是这样:
# setting theme sns.set_theme(style="ticks", palette=pallete) # creating figure and axes fig, ax = plt.subplots(figsize=(10, 6)) # Increase figure size for better spacing # background color fig.patch.set_facecolor(bg_color) # categorical scatterplot sns.swarmplot(data=data, x=x, y=y, hue=hue, ax=ax, size=marker_size, dodge=False, orient='h') # axes (chart) background color ax.set_facecolor(chart_bg_color) # grid ax.grid(True, color=grid_color, alpha=grid_alpha, linestyle=grid_line) # 移除首尾的垂直网格线 x_grid_lines = ax.get_xgridlines() if len(x_grid_lines) >= 2: x_grid_lines[0].set_visible(False) x_grid_lines[-1].set_visible(False)
原理很简单:Matplotlib的每一条网格线都是独立的Line2D对象,我们可以通过get_xgridlines()获取x轴所有垂直网格线的列表,然后把第一个和最后一个的可见性设为False。加个长度判断是为了避免当x轴刻度太少(比如只有2个)时出现索引越界的问题。
这样操作后,水平网格线会保持完整连续,首尾的垂直网格线也会被去掉,完美解决你的需求~
备注:内容来源于stack exchange,提问作者Christina
相关产品推荐
相关产品推荐

