首页 » 技术分享 » 机器学习入门(一)之可视化库Seaborn

机器学习入门(一)之可视化库Seaborn

 

一、Seaborn介绍

一些示意图介绍

二、整体风格展示

代码:Seaborn_1Style.py

import seaborn as sns #别名
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
#matplotlib inline 一会进行画图,直接可以把图显示在jupyter中,pycharm不适用

def sinplot(flip=1):

    x = np.linspace(0, 14, 100)#在0-14区间上找出来100个点,linspace是Matlab中的均分计算指令,用于产生x1,x2之间的N点行线性的矢量。
    for i in range(1, 7):
         plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)#画6条
    plt.show()
sinplot()
  • #matplotlib inline是jupyter notebook在线显示的功能,这里注释掉了,在代码行的倒数第二行加了个plt.show()也是显示代码
  • sinplot()是调用函数
  • np.lispace(X1,X2,N),linspace是均分计算指令,用于产生x1,x2之间的N点行线性的矢量。
    pycharm运行如图
sns.set()#默认的参数
sinplot()
  • 传入默认的参数,和前面有细微区别

5种主题风格

  • darkgrid
  • whitegrid
  • dark
  • white
  • ticks
sns.set_style("whitegrid")#画风
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data)
#sns.despine(left=True)  left隐藏坐标轴
plt.show()
  • whitefrid箱形图
  • boxplot()在收藏夹里有特别注释
    箱形图

三、风格细节设置

代码:Seaborn_1Style.py

with sns.axes_style("darkgrid"):# 用with打开 当前风格里执行就是这个风格
    plt.subplot(211)
    sinplot()
plt.subplot(212)
sinplot(-1)
  • with里的风格相同
    with解释1
    with解释2
sns.set_context("paper")#指定不同的context里的格子不一样
plt.figure(figsize=(8, 6))
sinplot()
  • context()是网格大小 有paper小,talk,poster
    context
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})#对其他位置的字体也可以设置大小,rc是线的粗度
sinplot()
  • 见代码注释
    细节设置

四、调色板

代码:Seaborn_2Color.py
颜色很重要

  • color_palette()能传入任何Matplotlib所支持的颜色
  • color_palette()不写参数则默认颜色
  • set_palette()设置所有图的颜色
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
#matplotlib inline
sns.set(rc={"figure.figsize": (6, 6)})

current_palette = sns.color_palette()
sns.palplot(current_palette)
plt.show()
  • 6个默认的颜色循环主题: deep, muted, pastel, bright, dark, colorblind
    六种解释
  • 这里有十种
    颜色
    圆形画板
    当你有六个以上的分类要区分时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会保持亮度和饱和度不变)。这是大多数的当他们需要使用比当前默认颜色循环中设置的颜色更多时的默认方案。

最常用的方法是使用hls的颜色空间,这是RGB值的一个简单转换。

sns.palplot(sns.color_palette("hls", 8))
  • 有8个颜色

圆形画板的值

data = np.random.normal(size=(20, 8)) + np.arange(8) / 2
sns.boxplot(data=data,palette=sns.color_palette("hls", 8))
plt.show()
  • 看到代码里的palette=sns.color_palette(“hls”, 8)就是设置颜色

箱状图的设置hls_palette()函数来控制颜色的亮度和饱和

  • l-亮度 lightness
  • s-饱和 saturation
sns.palplot(sns.hls_palette(8, l=.7, s=.9))
  • 可以换出来8种颜色,l s和亮度和饱和度
sns.palplot(sns.color_palette("Paired",8))
  • "Paired"表示现在要求调色板是一对一对的,8个数据4对
    paried展示

五、调色板颜色设置

使用xkcd颜色来命名颜色
xkcd包含了一套众包努力的针对随机RGB色的命名。产生了954个可以随时通过xdcd_rgb字典中调用的命名颜色。
XKCD
连续色板
色彩随数据变换,比如数据越来越重要则颜色越来越深

sns.palplot(sns.color_palette("Blues"))
sns.palplot(sns.color_palette("BuGn_r"))
  • 如果想要翻转渐变,可以在面板名称中添加一个_r后缀`
    连续画板实例
    连续画板_r
    cubehelix_palette()调色板
    色调线性变换
sns.palplot(sns.color_palette("cubehelix", 8))
sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
sns.palplot(sns.cubehelix_palette(8, start=.75, rot=-.150))
plt.show()
  • start rot区间
    线性变换

light_palette() 和dark_palette()调用定制连续调色板*

sns.palplot(sns.light_palette("green"))
sns.palplot(sns.dark_palette("purple"))
sns.palplot(sns.light_palette("navy", reverse=True))
  • light_或者dark_
  • reverse反转
    light调色板三种颜色
    代码示意:
x, y = np.random.multivariate_normal([0, 0], [[1, -.5], [-.5, 1]], size=300).T
pal = sns.dark_palette("green", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);
plt.show()

代码体现

六、单变量分析绘图

代码:Untitiled.py

import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt

import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord,"distributions")))

x = np.random.normal(size=100)
sns.distplot(x,bins=20,kde=False)
plt.show()
  • 随机生成高斯数据
  • kde是要不要作核密度的估计?(后面会讲)
  • bins是要不要切分成20块
    柱形图
    加入了bins
sns.distplot(x, kde=False, fit=stats.gamma)
  • 统计指标下分布的状态
    fits的设置
    指定均值和协方差
mean, cov =[0,1], [(1,.5), (.5, 1)]
data = np.random.multivariate_normal(mean,cov,200)
df = pd.DataFrame(data,columns=["x","y"])
print(df)
  • 指定均值和协方差
    数据: x y
    0 -0.706021 1.349229
    1 1.547416 2.047840
    2 -0.047346 -0.240343
    3 -0.148089 -0.331725
    4 -0.333231 -0.148247
    5 -0.490702 0.978690
    6 -2.011982 -0.014544
    7 1.014579 1.099924
    8 -0.391629 1.751079
    9 -1.174984 0.521832
    10 -0.629024 1.179699
    11 0.115480 1.674041
    12 1.402709 2.475423
    13 0.370949 1.424186
    14 -1.010483 -0.728499
    15 -0.100091 1.889943
    16 -1.397263 0.064460
    17 -0.827628 2.089991
    18 0.473680 2.546941
    19 -0.118779 -0.033703
    20 -0.436781 1.007733
    21 -0.451587 0.619218
    22 -1.318746 0.395063
    23 -0.231098 1.390841
    24 -0.962049 -0.856978
    25 -0.367885 1.475165
    26 2.309267 1.125499
    27 0.137392 0.383759
    28 -0.331646 1.043289
    29 -0.510458 -0.127161
    … … …
    170 -1.053425 -1.997191
    171 -1.419759 -0.378324
    172 -1.534222 0.706716
    173 -0.258498 -0.701965
    174 -1.155324 0.249849
    175 0.598661 1.496255
    176 0.014828 -0.651260
    177 0.575165 1.249223
    178 0.617901 1.183245
    179 0.096636 0.402979
    180 -1.208809 1.309929
    181 -1.211455 -0.084806
    182 0.192729 1.982614
    183 0.100879 0.122719
    184 -0.257234 0.979881
    185 0.598534 0.345175
    186 0.613458 1.384217
    187 -1.427276 1.611468
    188 -0.671112 0.980476
    189 1.466258 1.476073
    190 -0.072922 -0.957640
    191 -2.090895 0.399472
    192 -0.409107 0.831832
    193 -0.780861 1.222904
    194 -2.088611 0.049060
    195 0.024923 1.114246
    196 0.161253 0.647625
    197 -0.149565 0.251271
    198 -0.320356 0.460674
    199 0.403799 1.421273

散点图
观测两个变量之间的关系最好用散点图

sns.jointplot(x="x",y="y",data=df)
plt.show()
  • 不仅可以画出散点图也可以画出直方图
    散点图和直方图都存在
x,y = np.random.multivariate_normal(mean, cov, 1000).T
with sns.axes_style("white"):
    sns.jointplot(x=x,y=y,kind="hex", color ="k")
  • 数据比较多,有1000个
    hex图

七、回归分析绘图

代码:Untitiled_1.py

iris = sns.load_dataset("iris")#内置数据集
sns.pairplot(iris)
plt.show()
  • sns.pairplot自动分析

内置数据集iris

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

import seaborn as sns
sns.set(color_codes=True)

np.random.seed(sum(map(ord,"regression")))

tips = sns.load_dataset("tips")

print(tips.head())

显示数据
*regplot()和lmplot()都可以画回归图,推荐用regplot()
*

sns.regplot(x="total_bill", y="tip", data=tips)

plt.show()

regplot

sns.lmplot(x="total_bill", y="tip", data=tips)
  • lmplot在这里跟regplot差不多,只是支持更高级的操作
    lmpolt
sns.regplot(data=tips,x="size",y="tip")

小费tip和size人数关系

sns.regplot(x="size",y="tip",data=tips,x_jitter =.05)
  • x_jitter 指定了幅度范围,进行随机的一些改变
    在原始的范围内加上一个幅度

八、多变量分析绘图

代码:Untitiled_2.py

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style = "whitegrid",color_codes=True)

np.random.seed(sum(map(ord,"categorical")))
titanic= sns.load_dataset("titanic")
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")

sns.stripplot(x="day",y="total_bill",data=tips)#stripplot
plt.show()
  • 为什么我的不是线??他的数据显示的是线??我迷茫了,代码没有问题。
    我的数据显示
    他的数据显示
sns.stripplot(x="day",y="total_bill",data=tips,jitter = True)#stripplot
  • jitter就是偏移量
    在这里插入图片描述
sns.swarmplot(x="day",y="total_bill",data=tips)

用swarm

sns.swarmplot(x="day",y="total_bill",hue = "time",data=tips)

时间为单位来展示 看time
盒图

  • IQR即统计学的四分位距,第一四分位与第三四分位之间的距离
  • N=1.5IQR 如果一个值>Q3+N或<Q1-N,则为离群点
  • 离群点:异常值或统计错误
sns.boxplot(x="day",y="total_bill",hue="time",data=tips)

去掉离群点的

  • 图中的菱形 是离群点 的个数和数据
sns.violinplot(x="total_bill",y="day",hue="time",data=tips)

小提琴图

  • 越胖表示数据越多
sns.violinplot(x="total_bill",y="day", hue="time",data=tips, split=True)

坐标表示一种属性 右边表示一种属性

九、分类属性绘图

代码:Untitiled_3.py

sns.violinplot(x="day",y="total_bill",data=tips,inner=None)
sns.swarmplot(x="day",y="total_bill",data=tips,color="w",alpha=.5)
  • alpha 透明程度设置
    合并在一起
    显示值的集中趋势可以用条形图
sns.barplot(x="sex",y="survived",hue="class",data=titanic)

柱状图

  • 点图可以看到更多的描述差异
sns.pointplot(x="sex",y="survived",hue="class",data=titanic)

用点图表示

sns.pointplot(x="class",y="survived",hue="sex",data=titanic,palette={"male":"g","female":"m"},markers=["^","o"],linestyle=["-","--"])
plt.show()

出现了一点问题 他视频的紫色线是虚线
宽型数据

sns.boxplot(data=iris,orient="h")
  • 横着画指定成h
    横着画指定h
sns.factorplot(x="day",y="total_bill",hue="sex",data=tips,kind="bar")
  • factorplot可以画很多种图,只要指定好kind
    factor图
sns.factorplot(x="day",y="total_bill",hue="smoker",col="time",data=tips,kind="swarm")

factor使用

sns.factorplot(x="time",y="total_bill",hue="smoker",col="day",data=tips,kind="box",size=4,aspect=.5)

解释看PYTHON函数解释。
factor

十、Facetgrid使用方法

代码:Untitiled_1.py

t = sns.FacetGrid(tips,col="time")
  • 制定好要画的区域图的哪些信息
  • col两个图表示时间指标有2个
    FacetGrid识别
g = sns.FacetGrid(tips,col="time")
g.map(plt.hist,"tip")
  • plt.hist 条形图
    传入图
g = sns.FacetGrid(tips,col="sex",hue="smoker")
g.map(plt.scatter,"total_bill","tip",alpha=.7)
g.add_legend()
  • scatter散点图
    指定更多
g = sns.FacetGrid(tips,row="smoker",col="time",margin_titles=True)
g.map(sns.regplot,"size",'total_bill',color=".3",fit_reg=False,x_jitter=.1)
  • fit_reg是否回归线
    一些设置
from pandas import Categorical
ordered_days = tips.day.value_counts().index
print(ordered_days)
#ordered_days = Categorical(['Thur','Fri','Sat','Sun'])
g=sns.FacetGrid(tips,row="day",row_order=ordered_days,size=1.7,aspect=.4)
g.map(sns.boxplot,"total_bill")
  • 指定数据的顺序,传数据传入dataframe的类型

输出:
CategoricalIndex([‘Sat’, ‘Sun’, ‘Thur’, ‘Fri’], categories=[‘Thur’, ‘Fri’, ‘Sat’, ‘Sun’], ordered=False, dtype=‘category’)
传入复杂

十一、Facetgrid绘制多变量

代码:Untitiled_1.py
代码1:Jupyter notebook上FacetGrid

pal = dict(Lunch="seagreen", Dinner="gray")
g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)
g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")
g.add_legend();
plt.show()
  • palette调色板
  • pal字典的颜色
  • g.add_legend();加上标签项
    如图
g = sns.FacetGrid(tips, hue="sex", palette="Set1", size=5, hue_kws={"marker": ["^", "v"]})
g.map(plt.scatter, "total_bill", "tip", s=100, linewidth=.5, edgecolor="white")
g.add_legend();

数据项形式

with sns.axes_style("white"):
    g = sns.FacetGrid(tips, row="sex", col="smoker", margin_titles=True, size=2.5)
g.map(plt.scatter, "total_bill", "tip", color="#334488",edgecolor="white", lw=.5)
g.set_axis_labels("Total bill (US Dollars)", "Tip")
g.set(xticks=[10, 30, 50], yticks=[2, 6, 10])
g.fig.subplots_adjust(wspace=.02, hspace=.02)
#g.fig.subplots_adjust(left  = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)
  • 用with指定了图
  • set_axis_labels把轴指定成名字是什么东西
  • set(xticks=[10, 30, 50], yticks=[2, 6, 10])表示轴的一个取值范围
  • .subplots_adjust(left = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)
  • hspace宽距和h距
  • g.fig.subplots_adjust(left = 0.125,right = 0.5,bottom = 0.1,top = 0.9, wspace=.02, hspace=.02)
  • 整体的偏移程度 在上面
    取值
iris = sns.load_dataset("iris")
g = sns.PairGrid(iris)
g.map(plt.scatter);

iris作图

g = sns.PairGrid(iris, hue="species")
g.map_diag(plt.hist)
g.map_offdiag(plt.scatter)
g.add_legend();

在这里插入图片描述

g = sns.PairGrid(iris, vars=["sepal_length", "sepal_width"], hue="species")
g.map(plt.scatter);

在这里插入图片描述

g = sns.PairGrid(tips, hue="size", palette="GnBu_d")
g.map(plt.scatter, s=50, edgecolor="white")
g.add_legend();

在这里插入图片描述

十二、热度图绘制

代码:HeatMap.py

#HeatMap 热点图 在那个点高 那个点低
import matplotlib.pyplot as plt
import numpy as np;
np.random.seed(0)
import seaborn as sns;
sns.set()
uniform_data = np.random.rand(3, 3)#随机生成3x3的矩阵
print (uniform_data)
heatmap = sns.heatmap(uniform_data)
plt.show()

输出:
[[0.5488135 0.71518937 0.60276338]
[0.54488318 0.4236548 0.64589411]
[0.43758721 0.891773 0.96366276]]
随机生成

ax = sns.heatmap(uniform_data, vmin=0.2, vmax=0.5)
  • vmin右边的调色板最小值,vmax是最大取值范围
  • 与上面的输出结果结合起来就是,大于0.5和小于0.2的都是一个颜色
    ax
normal_data = np.random.randn(3, 3)
print (normal_data)
ax = sns.heatmap(normal_data, center=0)
  • 组权重参数,有正有负。
  • ax = sns.heatmap(normal_data, center=0)
  • center=0表示以0为中心画

输出:
[[ 1.26611853 -0.50587654 2.54520078]
[ 1.08081191 0.48431215 0.57914048]
[-0.18158257 1.41020463 -0.37447169]]
在这里插入图片描述

flights = sns.load_dataset("flights")
flights.head()

输出:
year month passengers
0 1949 January 112
1 1949 February 118
2 1949 March 132
3 1949 April 129
4 1949 May 121

flights = flights.pivot("month", "year", "passengers")
#对dataframe转换为年月的形式,横轴年,纵轴月,坐标点就是人数
print (flights)
ax = sns.heatmap(flights)
  • 对dataframe转换为年月的形式,横轴年,纵轴月,坐标点就是人数
  • 右边就是对比bar counter bar
    输出:
    year 1949 1950 1951 1952 1953 … 1956 1957 1958 1959 1960
    month …
    January 112 115 145 171 196 … 284 315 340 360 417
    February 118 126 150 180 196 … 277 301 318 342 391
    March 132 141 178 193 236 … 317 356 362 406 419
    April 129 135 163 181 235 … 313 348 348 396 461
    May 121 125 172 183 229 … 318 355 363 420 472
    June 135 149 178 218 243 … 374 422 435 472 535
    July 148 170 199 230 264 … 413 465 491 548 622
    August 148 170 199 242 272 … 405 467 505 559 606
    September 136 158 184 209 237 … 355 404 404 463 508
    October 119 133 162 191 211 … 306 347 359 407 461
    November 104 114 146 172 180 … 271 305 310 362 390
    December 118 140 166 194 201 … 306 336 337 405 432

[12 rows x 12 columns]

年月图

heatmap(flights, annot=True,fmt="d")
  • 加上实际的值
  • annot是注释,等于true就会显示
  • fmt加进来的值用d这种符号表示
    加上值
ax = sns.heatmap(flights, linewidths=.5)
  • linewidths 指定之间的间距
    在这里插入图片描述
ax = sns.heatmap(flights, cmap="YlGnBu")
  • 指定pal调色板
  • cmap用于指定
    在这里插入图片描述
ax = sns.heatmap(flights, cbar=False)
  • cbar = False没有柱状指示
    在这里插入图片描述

转载自原文链接, 如需删除请联系管理员。

原文链接:机器学习入门(一)之可视化库Seaborn,转载请注明来源!

0