Open zhonhui opened 5 years ago
Seaborn为matplotlib的补充,使matplotlib能制作具有更多特色的图。 seaborn能满足数据分析90%的绘图需求。 整理了一下学习笔记,这里只介绍几个有趣的统计图形:小提琴图、回归图、核密度图、热力图。
import seaborn as sns import numpy as np import pandas as pd import matplotlib.pyplot as plt tips = sns.load_dataset("tips") iris = sns.load_dataset("iris")
ax = sns.violinplot(x=tips["total_bill"]) 分组的小提琴图,用x轴和y轴分组 ax = sns.violinplot(x="day", y="total_bill", data=tips) 通过hue分组的小提琴图,相当于分组之后又分组(palette是调色板:是否混合两个颜色) ax = sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted") 分组组合的小提琴图,其实就是hue分组后,各取一半组成一个小提琴图, split=True ax = sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted", split=True) 调整x轴顺序,通过order参数 ax = sns.violinplot(x="time", y="tip", data=tips,order=["Dinner", "Lunch"])
seaborn的回归方式有lmplot和regplot两种,区别不大 绘制x和y的关系图, hue为分类,row="sex",col="day",设置划分标签 ax = sns.regplot(x="total_bill", y="tip", data=tips,row="sex",col="day", hue="day", col_wrap=2, size=3) 这里顺便提一下如何分具平均数和协方差生成随机数列 mean, cov = [4, 6], [(1.5, .7), (.7, 1)]#设置均值和协方差 x, y = np.random.multivariate_normal(mean, cov, 80).T#从多元正太分布中抽取随机样本,若size=(1, 1, 2),则输出的矩阵的shape即形状为 1X1X2XN(N为mean的长度))。 ax = sns.regplot(x=x, y=y, color="g", marker="+") 控制回归的置信度,拟合直线的外面的面积的有变化 ax = sns.regplot(x=x, y=y, ci=68)
二元方程图
上面的都是拟合一次曲线,拟合二次曲线通过order=2设置,拟合一次曲线相当于order=1 ans = sns.load_dataset("anscombe") ans.dataset==,提取数据中为‘Ⅱ’的数据,scatter_kws控制点的大小 ax = sns.regplot(x="x", y="y", data=ans.loc[ans.dataset == "II"],scatter_kws={"s": 90},order=2, ci=None, truncate=True)
双变量核密度图
(1)
单变量核密度图类似于正太分布,这里只介绍双变量的和密度图,有点像等高线 sns.set(color_codes=True)#建立图块颜色深度的标签 mean, cov = [0, 2], [(1, .5), (.5, 1)] x, y = np.random.multivariate_normal(mean, cov, size=50).T ax = sns.kdeplot(x) shade参数决定是否填充曲线下面积 ax = sns.kdeplot(x, shade=True, color="r") 双变量密度图,相当于等高线图了.x,y轴分别画密度图。 shade 参数改用颜色深浅表示密度的大小 ax = sns.kdeplot(x, y, shade=True)
(2)
分组绘制双变量的核密度图 iris = sns.load_dataset("iris") setosa = iris.loc[iris.species == "setosa"] # 组1,loc可以使用column名和index名进行定位 virginica = iris.loc[iris.species == "virginica"] # 组2 ax= sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds", shade=True, shade_lowest=False) ax =sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues", shade=True, shade_lowest=Fals
5. 双变量核密度图
热力图(方块表示相关度) uniform_data = np.random.rand(10, 12) ax = sns.heatmap(uniform_data) 改变颜色映射的值范围 ax = sns.heatmap(uniform_data, vmin=0, vmax=1) 绘制x-y-z的热力图,比如 年-月-销量 的热力图 flights = sns.load_dataset("flights") flights = flights.pivot("month", "year", "passengers") ax = sns.heatmap(flights) 将数值写到热力图上,annot=True ax = sns.heatmap(flights, annot=True, fmt="d") 这个图在绘制缺失值分布有用,但是不知道怎么样。 data = np.random.randn(50, 20) xticklabels=3设置x轴刻度间隔 ax = sns.heatmap(data, xticklabels=3, yticklabels=True)
### 对python绘图有兴趣的朋友详细参考: https://blog.csdn.net/suzyu12345/article/details/69029106, 这篇整理地比较详细。
你可以直接把项目代码提交,然后一个链接指向过去,这样我们读起来也比较清晰
概述
步骤
二元方程图
双变量核密度图
单变量核密度图类似于正太分布,这里只介绍双变量的和密度图,有点像等高线 sns.set(color_codes=True)#建立图块颜色深度的标签 mean, cov = [0, 2], [(1, .5), (.5, 1)] x, y = np.random.multivariate_normal(mean, cov, size=50).T ax = sns.kdeplot(x) shade参数决定是否填充曲线下面积 ax = sns.kdeplot(x, shade=True, color="r") 双变量密度图,相当于等高线图了.x,y轴分别画密度图。 shade 参数改用颜色深浅表示密度的大小 ax = sns.kdeplot(x, y, shade=True)
(2)
分组绘制双变量的核密度图 iris = sns.load_dataset("iris") setosa = iris.loc[iris.species == "setosa"] # 组1,loc可以使用column名和index名进行定位 virginica = iris.loc[iris.species == "virginica"] # 组2 ax= sns.kdeplot(setosa.sepal_width, setosa.sepal_length, cmap="Reds", shade=True, shade_lowest=False) ax =sns.kdeplot(virginica.sepal_width, virginica.sepal_length, cmap="Blues", shade=True, shade_lowest=Fals
热力图(方块表示相关度) uniform_data = np.random.rand(10, 12) ax = sns.heatmap(uniform_data) 改变颜色映射的值范围 ax = sns.heatmap(uniform_data, vmin=0, vmax=1) 绘制x-y-z的热力图,比如 年-月-销量 的热力图 flights = sns.load_dataset("flights") flights = flights.pivot("month", "year", "passengers") ax = sns.heatmap(flights) 将数值写到热力图上,annot=True ax = sns.heatmap(flights, annot=True, fmt="d") 这个图在绘制缺失值分布有用,但是不知道怎么样。 data = np.random.randn(50, 20) xticklabels=3设置x轴刻度间隔 ax = sns.heatmap(data, xticklabels=3, yticklabels=True)