先来点图(doge)的先后对比,我们将一点点的地达到这个效果
本文以iris数据集为例进行说明,数据集长这样
当我们使用seaborn 0.11.2绘制两个特征(萼片和花瓣的长度)的联合KDE图(等高线图)时,如果采用基本方法,x,y就是俩方向轴(从iris_data的列里面挑),data数据源,kind是kde(kernel density estimate),核密度估计简介
import pandas as pd
pd.plotting.register_matplotlib_converters()
import matplotlib.pyplot as plt
import seaborn as sns
iris_filepath = "visual/iris.csv"
iris_data = pd.read_csv(iris_filepath, index_col="Id")
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
)
plt.show()
结果是这样
如果我们要把三种鸢尾花分开,可以改一行代码
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
hue='Species'
)
可见,三种鸢尾花的分布被分开了
也许对于普通的需求而言,这样已经足够,但对于商用可视化而言是不够的,比如等高线没有层次感,色彩单调等问题。
下面是我boss的要求:中间的图要等高线变化对应色彩的变化,两边的图曲线下方加阴影,加上标题(doge),另外还问我能不能改改颜色...
对于这合理(qi guai)的要求,我们来改代码
我们给它加上阴影,对于单分布的代码改一哈
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
shade = True,
)
然后是三个分布的
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
hue='Species',
kind="kde",
shade = True,
)
这边重叠的有点丑,别急,我们改点透明度
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
hue='Species',
kind="kde",
shade = True,
joint_kws=dict(alpha =0.6)
)
其中,joint_kws是中间那个图的属性,要啥都可以往里面扔,它只要接受包含属性一个字典就行了,所以代码改成这样结果也是一样的啦
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
hue='Species',
kind="kde",
joint_kws=dict(alpha =0.6,shade = True,)
)
对于这种无理要求,有的pandas版本是自带这玩意儿的,但如果是我这种比较倒霉的人,就没有(因为pandas版本),所以我们继续改代码(唉声叹气)
对于单分布,marginal_kws和joint_kws道理一样,但marginal_kws是管上边和右边那个图的
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
joint_kws=dict(shade = True,),
marginal_kws=dict(shade=True)
)
对于三分布
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
hue='Species',
joint_kws=dict(alpha =0.6,shade = True,),
marginal_kws=dict(shade=True)
)
我们使用调色盘(Palette)改颜色,为了演示,我随便找了一个,注意:单分布和多分布调色盘
调色盘初始化方法不同
对于单分布,中间图的变化可以用cmap改
pal = sns.color_palette("CMRmap",as_cmap=True)
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
cmap=pal,
joint_kws=dict(alpha =0.6,shade = True),
marginal_kws=dict(shade=True)
)
对于三分布,我们这样写,本质上pal和pal2都是含颜色的列表,由于是三分布,我们就在palette=的那行,取列表的前三个元素
pal2 = sns.color_palette("CMRmap")
sns.jointplot(x='Petal Length (cm)', y='Sepal Width (cm)',data= iris_data,
kind="kde",
joint_kws=dict(shade = True,alpha=0.5),
marginal_kws=dict(shade=True,color='g'),
palette=pal2[0:3],
hue='Species')
好啦,我滴任务完成了!
等等,标题没加(doge)
plt.title('看了那么多,喜欢就点个赞吧')