前言
如果说pandas 是numpy 的儿子,那matplotlib 包就是seaborn 的爸爸了。
也因此,儿子辈分的seaborn 和pandas 玩的很不错。(seaborn 善于处理pandas 中的表格文件)
另外,matplotlib 与pandas 其实也都自带一些绘图函数,为何还要用seaborn呢?
答案恐怕是让专业的包来做专业的事情吧。
另外,我们可以将作图的内容想象为一个白纸,而无论是pandas, matplotlib 还是seaborn,都是在上面作画。也正因此,三者对图像的修改都会对整体产生变化。比如用pandas做了一个简单的图,用seaborn修改风格,用matplotlib 添加一些文体……它们都是一个整体。
另外,我们要知道,seaborn 是来自matplotlib的,因此使用如果知道某些matplotlib的方法,也可以尝试在seaborn中使用,毕竟它们是一家人。
加载数据
除了可以通过pd 加载表格,seaborn 也提供了获得表格的方式。.load_dataset('')
。
seaborn 常用元素选项
x,x轴数据。
y,y轴数据。
data,数据集。
hue,颜色区分图像。(自动添加标注) hue_order = []
,修改hue 显示标注的顺序。 palette = {}
,字典存放指定分类的颜色,键为标注信息,值为对应自定义的颜色,同样也可以使用html 的颜色代码。
个人理解hue 可以实现matplotlib 中的color 和legend 的功能。
size, 点的大小。(适用于散点图)
style,点的样式。(适用于散点图)
alpha,透明度。
适合表现连续变量
散点图
虽然sns 有很强的画图功能,但其最终的图像展示部分还需要借助matplotlib,因此也需要导入matplotlib.pyplot。
# Import Matplotlib and Seaborn
import matplotlib.pyplot as plt
import seaborn as sns
# Change this scatter plot to have percent literate on the y-axis
sns.scatterplot(x=gdp, y=phones)
# Show plot
plt.show()
线图
是与散点图类似的关系型图像。它更能体现变化的趋势,因为具备track 的功能。
如果线图中的同个x下有多个值(同个x 有多个对应的y),则会汇集于一个值并作图(默认为平均),并根据置信做出阴影部分(95%置信)。
相关参数
markers, 点的标记,可以设为True。
dashes,线段的样式,不做改变设为False。
ci,设定置信计算的值,比如’sd’ 表示标准差。或设为None,关闭阴影。
适合表现分类变量
条形图与计数图都适合表现分类变量,对应于连续变量使用 relplot
, catplot
更适用于这方面。如果将分类变量换到y,seaborn 会自动识别,并将图像翻转(不过还是建议分类变量放在x轴噢)。
重要参数
order,设定x轴的顺序。
kind,设定图像。
ci,是否添加误差棒。
条形图
和mpl 中类似,但seaborn 中的条形图默认添加了误差棒。也可以设定ci 删除。
直方图
表现频数分布的图形。
# Display a Seaborn distplot
sns.distplot(df['Award_Amount'])
plt.show()
# Clear the distplot
plt.clf()
相关参数
kde,设置为False 可以还原为简单的直方图(去掉线段)。
kde_kws,用字典设定kde 参数,如 kde_kws = {'shade' : True}
,表示给线段覆盖区域添加阴影。
hist,False 可以去掉hist。
rug,True 添加rug,即图形底部的竖线,也可以用来表现数据的分布。(mini版的hist)
bin,设定柱子的宽度。
计数图
有点类似于matplotlib 中的直方图。
# Import Matplotlib and Seaborn
import matplotlib.pyplot as plt
import seaborn as sns
# Create count plot with region on the y-axis
sns.countplot(y=region)
# Show plot
plt.show()
箱线图
关于箱线图介绍,可以参考matplotlib 中的介绍:002. 使用matplotlib绘图
相关参数
sym,设定异常值处理, sym=""
可以去除。
whis, 设定“箱子”取值范围(默认25%与75%分为数)。
# Set the whiskers at the min and max values
sns.catplot(x="romantic", y="G3",
data=student_data,
kind="box",
whis=[0, 100])
# Show plot
plt.show()
小提琴图
# Create a violinplot with the husl palette
sns.violinplot(data=df,
x='Award_Amount',
y='Model Selected',
palette='husl')
plt.show()
plt.clf()
lv图
# Create a lvplot with the Paired palette and the Region column as the hue
sns.lvplot(data=df,
x='Award_Amount',
y='Model Selected',
palette='Paired',
hue='Region')
plt.show()
plt.clf()
点线图
点线图与箱线图都是反映分类变量间简单统计学差异的好图。只是差别在于,点线图能更直观反映二者中位数差异,且显示了95%的置信。而与条形图的区别,也是它可以更好的表现数值上的差异。
相关参数
estimator,默认下点线图上的点表示的是分组内的平均值,可以通过引入numpy包统计学函数,比如estimator = median
, 更换为中位数。
capsize,修改errorbar 的帽子宽度。
ci,None 可以不要误差棒。
join,设为False 可以去除连接点的线段。
航线图
# Create the stripplot
sns.stripplot(data=df,
x='Award_Amount',
y='Model Selected',
jitter=True)
plt.show()
jitter 选项可以为相同取值的点产生一个轻微的抖动(位移),使它们不覆盖在一起。
蜂群图
统计功能的图像
回归图
相当于是散点图+回归线,会为散点的数据拟合一条回归线。.regplot()
另外,类似直方图中的kdeplot,回归图也有另外一个更厉害的选择—— lmplot
。不过需要注意的是,二者部分参数不共享(比如lm不支持marker)
# Create a regression plot with multiple rows
sns.lmplot(data=df,
x="insurance_losses",
y="premiums",
row="Region")
# Show the plot
plt.show()
相关参数
marker,设定散点的样式,比如 '+'
。
order,设置多元回归大小。
x_bins,将x对应的数值分组, x_bins = 4
,分成四组。
fit_reg,False 将去除回归线。
多元回归
分类变量进行回归
使用estimator 美化
上图中,将直接取分类下所有数值的平均值进行计算。
残差图
residplot,残差图,可以用来评价模型的合适程度。
创建多个图
类似matplotlib 中的subplot,seaborn也可以在同一个图像里创建多个子图像。sns.relplot()
参数有:
kind,指定图像类型,scatter, line …
col,直接可以指定某列,根据列内容差异直接将图像分为左右两边。col_wrap 用于设定每行的列数,如 col_wrap = 2
,即每行有两个图像。 col_order = []
可以设定子图像顺序。(ps:col与row 的设定及使用和hue 非常相似)
row,直接可以指定某行,根据列内容差异直接将图像分为上下两边。
FacetGrid
第一步创建FacetGrid 更像是建立一个和数据集相关的画表,并指定分组条件。
接着通过在g.map 内指定创建指定的图形类型和其他参数,以进行绘图。
还有另外一种调用facetgrid 的方式。
PairGrid
如同它的名字一样,pairgrid 出现成对的图像。它可以用来非常方便的查看多个列之间数据的关系。
也可以自定义两边对角线的图形。
和facetgrid 一样,pairgrid 也有简单调用的方式。
# plot relationships between insurance_losses and premiums
sns.pairplot(data=df,
vars=["insurance_losses", "premiums"],
kind='reg',
palette='BrBG',
diag_kind = 'kde',
hue='Region')
plt.show()
plt.clf()
JointGrid
非常漂亮,相比于PairGrid 的相等大小并列图片,JointGrid 更能突出重点。比如对于一组变量间的研究,中心使用散点图表现二者的关系,上方与右方使用直方图表现对应一边变量的分布情况。
可以使用 g.plot
直接指定中心与周边图像,也可以使用 g.plot_joint()
与 g.plot_marginals()
分别指定。
jointgrid 也有简单调用的方式,使用jointplot()。
调整与修改图像
更动标题和标签
对于seaborn 中的图像对象,有两种类型,对待这两种类型,有不同的添加标题与标签的方式。
总的来说,可以制作多个坐标的是facetgrid,而单一坐标的是axessubplot。
facetgrid
g.fig.subtitle('')
通过设置y,可以调整标题位置,默认为1。
g.set(xlabel = , ylabel = )
可以设定坐标轴边的label。
plt.xticks(rotation = )
可以修改标注的角度。(使用matplotlib 的方法)
axessubplot
g.set.title('')
通过设置y,可以调整标题位置,默认为1。
可以将变量(表格中的列名)作为标题名,命名规则为’This is {col_name}’。
移除默认图框
sns.despine()
,默认清楚上与右侧边框,也可以手动设定,’left’ 可以移除左侧的。
自定义图像的风格
类似mpl 中的plt.style.use('xx')
,sns 中也有,包括默认的 sns.set()
,或其他的sns.set_style("whitegrid")
另外,还可以使用seaborn 中的配色方案, sns.set_palette('RdBu')
还可以调整图像字体的大小。使用 sns.set_context()
修改seaborn 默认风格参数
sns.set(),可以修改seaborn 的默认风格。
比如可以修改参数, color_codes = True
,可以使用颜色代码进行颜色选择。
一些风格
- whitegrid
- ticks
- darkgrid
调色板
查看当前画板
sns.paplot()
可以返回一个palette图像,而当我们用 sns.set_palette()
后,就可以画图以查看不同seaborn中的不同颜色或者不同的画板了。
定制自己的调色板
# Create the Purples palette
sns.palplot(sns.color_palette("Purples", 8))
plt.show()
ps:seaborn 自带的各种颜色主题还都蛮好看的。