如果你有使用Python进行数据分析的经验,那么你可能已经绘制了一些数据图来向其他人解释你的分析。你很可能使用过Matplotlib之类的库来生成它们。如果你想将统计可视化提升到一个新的水平,你应该掌握Python seaborn库,以生成令人印象深刻的统计分析图来显示数据。
在本教程中,你将学习到:
1.判断seaborn是否满足你的数据可视化需求
2.理解seaborn经典Python函数式接口的原理
3.理解seaborn更现代的Python对象接口的原理
4.使用seaborn的函数创建Python图形
5.使用seaborn的对象创建Python图形
在开始之前,您应该熟悉JupyterLab中提供的Jupyter Notebook数据分析工具。虽然你可以使用自己喜欢的Python环境学习本seaborn教程,但Jupyter Notebook是首选。您可能还想了解pandas DataFrame如何存储其数据。了解pandas DataFrame和Series之间的差异也是有用的。
在使用seaborn之前,必须安装它。打开Jupyter Notebook,输入!python -m pip install seaborn到新的代码单元格中。当你运行单元格时,seaborn将安装。如果你在命令行中工作,使用相同的命令,只是没有感叹号(!)。安装seaborn后,Matplotlib、pandas和NumPy也将可用。
使用seaborn创建条形图
我们使用seaborn自带的tips数据集为例,演示绘制条形图示例。
In [1]: import matplotlib.pyplot as plt
...: import seaborn as sns
...: tips = sns.load_dataset("tips")
...: (
...: sns.barplot(
...: data=tips, x="day", y="tip",
...: estimator="mean", errorbar=None,
...: )
...: .set(title="Daily Tips ($)")
...: )
...:
...: plt.show()
输出条形图如下:
如图所见,服务员在周末每天的平均小费略有上升。看起来人们放松的时候会付更多的小费。
理解seaborn的经典函数式接口
seaborn经典函数接口包含一组绘图函数,用于创建不同的绘图类型。在前面使用barplot()函数时,已经看到了一个这样的例子。functional接口将绘图函数分为几个大类。下面的图表展示了三种最常见的方式:
第一列展示了seaborn的关系图,关系图有助于理解数据集中变量对之间的关系。第二类展示seaborn的分布图,可以帮助理解数据集中变量是如何分布的。第三列是seaborn的类别图,也有助于理解数据集中变量对之间的关系。
使用轴函数
Seaborn为此提供了一个scatterplot()轴级函数:
In [2]: import matplotlib.pyplot as plt
...: import seaborn as sns
...:
...: (
...: sns.scatterplot(
...: data=crossings, x="min_temp", y="max_temp"
...: )
...: .set(
...: title="Minimum vs Maximum Temperature",
...: xlabel="Minimum Temperature",
...: ylabel="Maximum Temperature",
...: )
...: )
...:
...: plt.show()
这里使用scatterplot()函数的方式与使用barplot()的方式类似。同样,需要提供DataFrame作为它的数据参数,然后是要绘图的列。作为增强,我们还调用了Matplotlib的Axes.set()方法来为图形指定标题,并使用xlabel和ylabel标记每个轴。默认情况下,没有标题,每个轴根据其数据序列进行标记。使用Axes.set()允许大小写。
scatterplot有一个强大的参数,称为hue。这个参数允许在绘图时为不同类别的数据添加不同的颜色。要使用它,需要传入想要着色的列的名称。
In [3]: (
...: sns.scatterplot(
...: data=crossings, x="min_temp", y="max_temp",
...: hue="month", size="month", style="month",
...: )
...: .set(
...: title="Minimum vs Maximum Temperature",
...: xlabel="Minimum Temperature",
...: ylabel="Maximum Temperature",
...: )
...: )
...:
...: plt.legend(title="Month")
...: plt.show()
使用图形级函数
有时可能需要多个数据子图,每个子图都显示不同类别的数据。虽然可以手动创建多个图形,但图形级别的函数会自动完成这些工作。与轴级函数一样,row或col参数允许指定在每个子图中显示的行或列数据系列。设置column参数将把每个子图放在它们自己的列中,而设置row参数将为每个子图提供单独的行。
In [1]: import matplotlib.pyplot as plt
...: import pandas as pd
...: import seaborn as sns
...:
...: crossings = pd.read_csv("cycle_crossings_apr_jun.csv")
...:
...: (
...: sns.relplot(
...: data=crossings, x="min_temp", y="max_temp",
...: kind="scatter", hue="month", col="month",
...: )
...: .set(
...: title="Minimum vs Maximum Temperature",
...: xlabel="Minimum Temperature",
...: ylabel="Maximum Temperature",
...: )
...: .legend.set_title("Month")
...: )
...:
...: plt.show()
介绍seaborn的对象接口
这使用了更声明性的语法,意味着可以通过创建和添加创建它所需的单个对象来分层构建绘图。使用seaborn对象绘图时,第一个要用到的对象是plot。这个对象引用你正在绘制的数据DataFrame,以及其中你感兴趣的数据的特定列。使用seaborn对象接口时,按照约定要将其导入Python,并指定别名so
In [1]: import pandas as pd
...: import seaborn.objects as so
...:
...: crossings = pd.read_csv("cycle_crossings_apr_jun.csv")
...:
...: (
...: so.Plot(
...: data=crossings, x="min_temp", y="max_temp"
...: )
...: .show()
...: )
创建好so对象后,可以在每一层添加绘图元素,就像r语言ggplot2那样更加灵活绘图。
In [2]: (
...: so.Plot(
...: data=crossings, x="min_temp", y="max_temp"
...: )
...: .add(so.Dot())
...: .label(
...: title="Minimum vs Maximum Temperature",
...: x="Minimum Temperature",
...: y="Maximum Temperature",
...: )
...: .show()
...: )
In [3]: (
...: so.Plot(
...: data=crossings, x="min_temp",
...: y="max_temp", color="month",
...: )
...: .add(so.Dot(), marker="month")
...: .label(
...: title="Minimum vs Maximum Temperature",
...: x="Minimum Temperature",
...: y="Maximum Temperature",
...: color=str.capitalize,
...: )
...: .show()
...: )
In [4]: (
...: so.Plot(
...: data=crossings, x="min_temp",
...: y="max_temp", color="month",
...: )
...: .add(so.Dot(), marker="month")
...: .facet(col="month")
...: .layout(size=(15, 5))
...: .label(
...: title="Minimum vs Maximum Temperature",
...: x="Minimum Temperature",
...: y="Maximum Temperature",
...: color=str.capitalize,
...: )
...: .show()
...: )