montawwl / python

python学习笔记
Apache License 2.0
0 stars 0 forks source link

第5期 《Seaborn趣味绘图》 by zhonhui #6

Open zhonhui opened 5 years ago

zhonhui commented 5 years ago

概述

Seaborn为matplotlib的补充,使matplotlib能制作具有更多特色的图。 seaborn能满足数据分析90%的绘图需求。 整理了一下学习笔记,这里只介绍几个有趣的统计图形:小提琴图、回归图、核密度图、热力图。

步骤

  1. 导包和数据
    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")
  2. 绘制小提琴图
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"])
  1. 回归图
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)
  1. 二元方程图

    上面的都是拟合一次曲线,拟合二次曲线通过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)
  2. 双变量核密度图

    
    (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,
这篇整理地比较详细。
MrTallon commented 5 years ago

你可以直接把项目代码提交,然后一个链接指向过去,这样我们读起来也比较清晰