如何在使用Seaborn + Pandas绘制次轴时去除网格线?
Seaborn 是一个基于 matplotlib 库的高级数据可视化库,它提供了一组简单易用的界面和一些有用的扩展功能,可以帮助我们更快、更美观地绘制各种常见的统计图形。而 Pandas 则是 Python 中非常流行的数据处理和分析库,它可以让我们轻松地读写、过滤、变换和聚合各种复杂的数据。
在使用 Seaborn + Pandas 绘制图形时,有时我们需要使用次轴(secondary axis)来显示额外的信息,比如同时展示两个数据集的关系或者比较不同度量尺度的数据。然而,次轴的绘制过程中往往会带有一些不必要的网格线,这不仅降低了图表的美观度,还可能干扰我们读取关键信息。
本文将介绍如何通过简单的设置,去除 Seaborn + Pandas 中次轴的网格线,提高图像的可读性和观赏性。
更多Pandas相关文章,请阅读:Pandas 教程
操作步骤
我们首先需要导入必要的包,并读入一个示例数据集,例如 Seaborn 内置的 tips 数据集。
import seaborn as sns
import pandas as pd
tips = sns.load_dataset('tips')
接下来,我们可以使用 Pandas 对数据进行预处理和转换,比如计算某些聚合指标(如均值、标准差、比例等)或者进行数据透视表(pivot table)操作,以满足我们的可视化需求。在本例中,我们可以根据性别(sex)和吸烟状态(smoker)计算消费金额(total_bill)和小费金额(tip)的平均值,并按照餐厅区域(day)进行分组展示。
tips_agg = tips.groupby(['day', 'sex', 'smoker']).mean().reset_index()
接着,我们可以使用 Seaborn 选择合适的图表类型,并设置图表的基本属性,比如颜色、字体、标签等。在本例中,我们可以使用柱状图(bar plot)来表示每个组别的平均值,并利用图例(legend)来区分吸烟状态。
sns.set(style='darkgrid')
ax = sns.barplot(data=tips_agg, x='day', y='total_bill', hue='smoker')
ax.set_title('Average Total Bill by Day and Smoking Status')
ax.set_xlabel('Day')
ax.set_ylabel('Average Total Bill')
ax.legend(title='Smoker', loc='upper left')
不难发现,图中的网格线(grid lines)比较密集,同时还出现了次轴的标签重复和图例位置不合理等问题。接下来,我们将分别介绍如何解决这些问题,让图表变得更加清晰和易读。
去除网格线
要去除 Seaborn 中的网格线,我们只需要在绘制图表时使用 sns.despine()
函数并传入相应的参数。该函数可以去除坐标轴周围的外框架线、顶部和右侧的坐标轴线等,从而使图表更加简洁和美观。
sns.set(style='dark')
ax = sns.barplot(data=tips_agg, x='day', y='total_bill', hue='smoker')
ax.set_title('Average Total Bill by Day and Smoking Status')
ax.set_xlabel('Day')
ax.set_ylabel('Average Total Bill')
ax.legend(title='Smoker',loc='upper left')
sns.despine(left=True, bottom=True)
在 sns.despine()
函数中,我们设置了 left=True, bottom=True
,表示只去除左边和下边的边框和轴线。如果需要去除其他方向的边框和轴线,可以设置相应的参数。例如,使用 sns.despine(ax=ax, top=True, right=True)
可以同时去除所有方向的边框和轴线。
这样,我们可以得到一个不带网格线的柱状图。
次轴标签去重
为了在 Seaborn 中添加次轴,我们需要先使用 twinx()
方法创建一个新的 Axes 对象,并设置它的位置和属性。然后,我们可以在新的 Axes 上绘制相应的图形,并设置它的标签、颜色、线型等属性。在本例中,我们可以使用折线图(line plot)来表示吸烟人群的小费金额,并将其放置在右侧的次轴上。同时,我们还需要设置次轴的刻度、标签、限制范围等属性。
ax2 = ax.twinx()
sns.lineplot(data=tips_agg[tips_agg['smoker']=='Yes'], x='day', y='tip', color='red', ax=ax2)
ax2.set_ylabel('Average Tip')
ax2.set_ylim(0, 4)
ax2.tick_params(axis='y', labelcolor='red')
ax2.spines['right'].set_color('red')
ax2.spines['left'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax2.set_yticks([0, 1, 2, 3, 4])
然而,不难发现,在添加次轴的同时,次轴的标签(day)与主轴的标签(day)重复出现,造成了一些视觉上的干扰。为了解决这个问题,我们可以使用 ax.tick_params()
方法和 ax.spines
属性,分别调整标签的位置和属性,将其完全隐藏或偏移一定的距离。
ax.tick_params(axis='x', which='both', bottom=False, labelbottom=False)
ax2.tick_params(axis='x', which='both', bottom=False)
for spine in ax2.spines.values():
spine.set_position(('outward', 20))
在 ax.tick_params()
方法中,我们设置了 axis='x', which='both', bottom=False, labelbottom=False
,表示只对主轴的底部刻度和标签进行隐藏。在 ax2.tick_params()
方法中,我们也设置了 axis='x', which='both', bottom=False
,表示只对次轴的底部刻度进行隐藏。这样可以解决标签重复的问题,并使次轴更加清晰和易读。
最终,我们得到了一个去除网格线并且次轴标签不重复的柱状图。
结论
通过本文的介绍,我们学习了如何在使用 Seaborn + Pandas 绘制图形时去除网格线并解决次轴标签重复的问题。这不仅可以提高图表的美观度和可读性,还有助于我们更好地展示和分析数据。当然,除了本例中使用的技巧外,Seaborn 还提供了很多其他的选项和方法,可以帮助我们更加灵活和深入地进行数据可视化。如果您感兴趣,可以进一步了解和尝试。