因为jointplot就是联合绘图,通常边缘上绘制分布图,中间绘制其它的(比如核密度图),所以如何去除边缘的分布图,再叠加一条回归线呢,可以用于替换常规散点图表示相关图的方式,如下图?
代码汇总
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
tips = pd.read_excel('data.xlsx')
sns.jointplot(x='data1',y='data2',data=tips,kind='kde',
height=6,color='#2F4F4F')
plt.savefig('kde1'+'.png',dpi=600)
plt.show()
g = (sns.jointplot("data1",'data2',data=tips,
kind='kde',height=6,color='#2F4F4F')
.plot_joint(sns.regplot,scatter=False, color='#945357'))
plt.savefig('kde2'+'.png',dpi=600)
plt.show()
sns.kdeplot(tips['data1'],tips['data2'],kind='kde',
color='#2F4F4F',height=6,shade_lowest=False,shade=True,n_levels=8)
sns.regplot(tips['data1'],tips['data2'], scatter=False,
ci=False,color='#945357')
plt.savefig('kde3'+'.png',dpi=600)
plt.show()
如果有帮到你,给个赞支持一下哦!
代码参数解析
导包
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
数据准备
建议将数据整理在excel中,按照第一行是列名,后面紧跟着数据的方试来整理,因为seaborn中的绘图工具基本都是基于pandas中的DataFrame和Series数据结构。DataFrame的基本单元是Series,Series的数据组织形式是列名+数据。如果从excel中直接读取就可以获得DataFrame形式的数据(excel和DataFrame数据形式见文末)。
数据读入
tips = pd.read_excel('data.xlsx')
绘图1
sns.jointplot(x='data1',y='data2',data=tips,kind='kde',
height=6,color='#2F4F4F')
plt.savefig('kde1'+'.png',dpi=600)
plt.show()
参数说明
- data:就是DataFrame数据
- x:就是DataFrame中的Serises名字
- y:同x,是另外一列Series数据的名字
- kind:是绘图的方式’kde’就是密度图,scatter就是散点图,reg是回归图。还有一些其它的({ “scatter” | “reg” | “resid” | “kde” | “hex” })。
- color:颜色值 ,可以输入这种hex形式的颜色,’#2F4F4F’,下面这个网址可以获取到hex颜色值
颜色值选取网址
- height:是图片的大小,height=6,则得到的图片是6*6
绘制图2(密度图+加回归线+分布图)
g = (sns.jointplot("data1", 'data2',data=tips,kind='kde',height=6,color='#2F4F4F')
.plot_joint(sns.regplot,scatter=False, color='#945357'))
plt.savefig('kde2'+'.png',dpi=600)
plt.show()
参数说明
- 大多数参数和上面一样,主要是引入plot_join() 函数,该函数可以完成在joinplot绘图结果的基础上再叠加一层结果。在本文中主要是在密度图的基础上绘制一条回归线。其余功能暂时不讲。
- color:是plot_join()绘图使用的函数
- 注意:scatter=False表示回归图不绘制散点,True表示保留散点。
绘制图三(密度图+回归图)
因为jointplot就是联合绘图,通常边缘上绘制分布图,中间绘制其它的,所以如何去除边缘的分布呢,在joinplot中没有给出直接去掉边上的分布图的方式(其实也有办法,利用space和ratio,暂时先不讲,本文使用优雅的方法)
sns.set(style="darkgrid")
sns.kdeplot(tips['data1'],tips['data2'],kind='kde',
color='#2F4F4F',height=6,shade_lowest=False,shade=True,n_levels=8)
sns.regplot(tips['data1'],tips['data2'], scatter=False,
ci=False,color='#945357')
plt.savefig('kde3'+'.png',dpi=600)
plt.show()
参数说明
- 使用kdeplot和regplot配合可以绘制图三,又可以不保留分布图
- 说明一下,kdeplot和regplot绘制数据是基于Series,不是DataFrame,数据输入的方式有点小变化,其余基本相同。
- 引入几个新的参数(jointplot可用),介绍一下
- shade:表示密度图有没有过度的颜色,如果设置为false,密度图只有边缘线,没有渐变的颜色
- shade_lowest:表示密度最低的一层是否显示,其实密度最低的一层通常都是没有数据的,设置为false,就表示不显示,保持背景色
- n_levels:密度层数,就是密度从最高到最低,一共分为几层
说明
其实图1、图2、图3都是使用的一种颜色,为什么绘制的密度图的渐变不一样?
- 其实是因为jointplot的colorbar生成方式和kdeplot的生成方式不同,如果想画图3(kde+reg)但是又使用jointplot()的colorbar怎么办呢?就只能使用我提到的比较暴力的解法了,本文就先不跑偏了。
DataFrame数据组织形式
excel数据组织形式
欢迎补充,交流学习。