查看原文
其他

Python可视化26|seaborn绘制分面图(seaborn.FacetGrid)

pythonic生物人 pythonic生物人 2022-09-11

"pythonic生物人"的第71篇分享

  • 本文介绍seaborn绘制分面图,即将一个数据集按某类,分行或分列显示为多个子图;
  • 前面文章介绍的seaborn.catplot、seaborn.pairplot、seaborn.lmplot生成分面图的底层就是本文的主角seaborn.FacetGrid。
  • seaborn.FacetGrid可更个性化的调整子图的 axis labels, ticks, legend等。

本文速览

欢迎随缘关注@pythonic生物人

目录

1、绘图数据集准备
2、seaborn.FacetGrid
按行绘制分面直方图 
按列绘制分面直方图 
同时按行和列绘制分面直方图
同时按行和列绘制分面散点图
图个性化设置

1、绘图数据集准备

还是使用鸢尾花iris数据集,数据集介绍可见之前的文章。

#导入本帖要用到的库,声明如下:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from sklearn import datasets
import seaborn as sns

#导入鸢尾花iris数据集(方法一)
#该方法更有助于理解数据集
iris=datasets.load_iris()
x, y =iris.data,iris.target
y_1 = np.array(['setosa' if i==0 else 'versicolor' if i==1 else 'virginica' for i in y])
pd_iris = pd.DataFrame(np.hstack((x, y_1.reshape(150,1))),columns=['sepal length(cm)','sepal width(cm)','petal length(cm)','petal width(cm)','class'])

#astype修改pd_iris中数据类型object为float64
pd_iris['sepal length(cm)']=pd_iris['sepal length(cm)'].astype('float64')
pd_iris['sepal width(cm)']=pd_iris['sepal width(cm)'].astype('float64')
pd_iris['petal length(cm)']=pd_iris['petal length(cm)'].astype('float64')
pd_iris['petal width(cm)']=pd_iris['petal width(cm)'].astype('float64')

数据集简要查看及统计
 

2、seaborn.FacetGrid

seaborn.FacetGrid(data, row=None, col=None, hue=None, col_wrap=None, sharex=True, sharey=True, height=3, aspect=1, palette=None, row_order=None, col_order=None, hue_order=None, hue_kws=None, dropna=True, legend_out=True, despine=True, margin_titles=False, xlim=None, ylim=None, subplot_kws=None, gridspec_kws=None, size=None)

  • 按行绘制分面直方图

g = sns.FacetGrid(pd_iris, col='class')#按行绘制col='class'
g.map(plt.hist, 'sepal length(cm)',color='#C21F30')#设置绘图模式
g.fig.set_size_inches(12,6)
sns.set(style='whitegrid',font_scale=1.5)
  • 按列绘制分面直方图

g = sns.FacetGrid(pd_iris, row='class',)#按列显示row='class'
g.map(plt.hist, 'sepal length(cm)',color='#68B88E')
g.fig.set_size_inches(8,12)
sns.set(style='whitegrid',font_scale=1.5)
  • 同时按行和列绘制分面直方图

#给数据加一列花期(上、下旬)
flowering=pd.Series(['early' if i>4.0 and i<5.0 else 'middle' for i in pd_iris['sepal length(cm)']])
pd_iris1=pd.concat([pd_iris,flowering],axis=1)#拼接,默认按行拼接,即axis=0
pd_iris1.rename(columns={0:'flowering'}, inplace = True)#替换列名称


g = sns.FacetGrid(pd_iris1,
                  row='flowering',col='class',height=4)#行按花期,列按class绘图
g.map(plt.hist, 'sepal length(cm)',color='#C21F30')
plt.figure(dpi=200)
g.fig.set_size_inches(12,8)
sns.set(style='whitegrid',font_scale=1.2)
  • 同时按行和列绘制分面散点图

g = sns.FacetGrid(pd_iris1,
                  col='flowering',
                  col_order=['early','middle'],
                  row='class',
                  hue='class',
                  hue_kws={"marker": ["^""s""D"]},               
                  palette='Set1',height=5)
g.map(plt.scatter, 'sepal length(cm)','sepal width(cm)',#绘制散点图
     **dict(s=100, linewidth=.5, edgecolor="w"),
     
     ).add_legend()
g.fig.set_size_inches(12,10)
sns.set(style='whitegrid',font_scale=1.2)
  • 图个性化设置

比如设置图的spines、axis labels 、titles、axis tick labels等。

g = sns.FacetGrid(pd_iris1,
                  col='flowering',
                  col_order=['early','middle'],
                  hue='class',#
                  hue_kws={"marker": ["^""s""D"]},#设置marker                  
                  palette='Set1',height=5,
                  margin_titles=True,
                 )
g=(g.map(plt.scatter, 'sepal length(cm)','sepal width(cm)',
     **dict(s=100, linewidth=.5, edgecolor="w")))#设置散点的size、外框线宽和颜色     
g.add_legend()

#设置figure的x轴及y轴标签
g.set_axis_labels("SepalLength (cm)"
                  "SepalWidth (cm)",
                 )

#设置子图(subplot Axes)属性
g.set(xlim=(48), #x轴刻度显示范围
      ylim=(15),#y轴刻度范围
      xticks=[468], #x轴刻度标签
      yticks=[12.55],#y轴刻度标签
     )

#设置子图标题
g.set_titles("flowering|{col_name}")

g.fig.set_size_inches(10,6)
sns.set(style='whitegrid',font_scale=1.2)

参考资料

  • http://seaborn.pydata.org/generated/seaborn.FacetGrid.html#seaborn.FacetGrid
  • http://seaborn.pydata.org/tutorial/axis_grids.html

本文结束,欢迎随缘关注@pythonic生物人



"点赞"、"在看"鼓励下呗

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存