其他
Python可视化26|seaborn绘制分面图(seaborn.FacetGrid)
"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=(4, 8), #x轴刻度显示范围
ylim=(1, 5),#y轴刻度范围
xticks=[4, 6, 8], #x轴刻度标签
yticks=[1, 2.5, 5],#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生物人
"点赞"、"在看"鼓