機器學習之路--seaborn

seaborn是基於plt的封裝好的庫。有很強的做圖功能。html

一、佈局風格設置(圖形的style)and 細節設置dom

用matplotlib做圖:函數

複製代碼
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
x = np.linspace(0, 14, 100)
for i in range(1, 7):
    plt.plot(x, np.sin(x + i * .5) * (7 - i))
plt.show()
複製代碼

輸出:佈局

用seaborn的默認系統風格:spa

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
# def sinplot(flip=1):
x = np.linspace(0, 14, 100)
for i in range(1, 7):
    plt.plot(x, np.sin(x + i * .5) * (7 - i))
sns.set()
plt.show()

 

輸出:設計

 下面介紹seaborn的五種做圖風格:code

  • darkgrid
  • whitegrid
  • dark
  • white
  • ticks

下面介紹經常使用的一種,其餘可用代碼自行查看orm

whitegridhtm

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

sns.set_style("whitegrid")     #設置風格
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2    #建立數據
sns.boxplot(data=data)       #製做盒圖
plt.show()

 

輸出:blog

 此風格能夠清晰看到數據的值與對應關係,也很簡約,建議用此圖。

指定軸線距離:

#f, ax = plt.subplots()
sns.violinplot(data)
sns.despine(offset=10)

offset的值爲軸線距離

將左邊的軸隱藏起來:(單個軸顯示問題)

sns.despine(left=True)

用兩種主題作圖:

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
with sns.axes_style("darkgrid"):
    sns.boxplot(data=data)
    plt.show()
sns.boxplot(data=data)
plt.show()

 

with裏面的是一種風格,外邊是另外一種

畫圖的頁面佈局:

複製代碼
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

sns.set_context("paper")     #除了paper還有別的佈局,help查看
plt.figure(figsize=(8, 6))      #大小
sns.set()
x = np.linspace(0, 14, 100)
for i in range(1, 7):
    plt.plot(x, np.sin(x + i * .5) * (7 - i))
plt.show()
複製代碼

 

二、調色板

  • 顏色很重要
  • color_palette()能傳入任何Matplotlib所支持的顏色
  • color_palette()不寫參數則默認顏色
  • set_palette()設置全部圖的顏色

6個默認的顏色循環主題: deep, muted, pastel, bright, dark, colorblind

圓形畫板****

當你有六個以上的分類要區分時,最簡單的方法就是在一個圓形的顏色空間中畫出均勻間隔的顏色(這樣的色調會保持亮度和飽和度不變)。這是大多數的當他們須要使用比當前默認顏色循環中設置的顏色更多時的默認方案。

最經常使用的方法是使用hls的顏色空間,這是RGB值的一個簡單轉換。

複製代碼
import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
sns.palplot(sns.color_palette("hls", 8))
plt.show()
複製代碼

輸出:

 

import seaborn as sns
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
data = np.random.normal(size=(20, 8)) + np.arange(8) / 2
sns.boxplot(data=data,palette=sns.color_palette("hls", 8))
plt.show()

 

hls_palette()函數來控制顏色的亮度和飽和

  • l-亮度 lightness
  • s-飽和 saturation
sns.palplot(sns.hls_palette(8, l=.7, s=.9))

使用xkcd命名顏色

連續色板

色彩隨數據變換,好比數據愈來愈重要則顏色愈來愈深

sns.palplot(sns.color_palette("Blues"))

輸出:

 

 

若是想要翻轉漸變,能夠在面板名稱中添加一個_r後綴:

sns.palplot(sns.color_palette("BuGn_r"))

色調線性變換(飽和度和亮度)

 

sns.palplot(sns.cubehelix_palette(8, start=.75, rot=-.150))

light_palette() 和dark_palette()調用定製連續調色板

sns.palplot(sns.light_palette("green"))

上面是由淺變深

下面是由深變暗:

sns.palplot(sns.light_palette("navy", reverse=True))
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);

 

輸出:

三、單變量分析繪圖

複製代碼
%matplotlib inline
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,kde=False)

sns.distplot(x, bins=20, kde=False)   #bins指定直方圖的寬度

若是要畫出一個數據的分佈狀況,能夠:

x = np.random.gamma(6, size=200)
sns.distplot(x, kde=False, fit=stats.gamma)

根據均值和協方差生成數據

mean, cov = [0, 1], [(1, .5), (.5, 1)]      #mean爲均值,cov協方差
data = np.random.multivariate_normal(mean, cov, 200)    #生成200組數據
df = pd.DataFrame(data, columns=["x", "y"])    #數據類型爲panda的dataframe
df  #輸出

觀察兩個變量之間的分佈狀況:(散點圖)

sns.jointplot(x="x", y="y", data=df);    

輸出:

 若是數據太多,點太過密集又想看分佈狀況:

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")     #kind=hex  

 

 四、多變量分析繪圖

iris = sns.load_dataset("iris")    #傳入數據
sns.pairplot(iris)    

輸出:

 

 一共是四組數據,對角線由於是單個數據因此是單個數據的直方圖,散點圖都是由兩組數據得來的。

regplot()和lmplot()均可以繪製迴歸關係,推薦regplot()

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

輸出:

 

 若是值爲整數,不適合創建迴歸模型,如:

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

輸出:

咱們能夠給它加上一個小範圍的浮動:

sns.regplot(x="size", y="tip", data=tips, x_jitter=.05)

輸出:

 

 離羣點

小提琴圖

先導入數據:

複製代碼
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);

輸出:

這樣會致使數據重疊,影響觀察。

能夠添加:

sns.stripplot(x="day", y="total_bill", data=tips, jitter=True)  #jitter=True

輸出:

不太好看,因此咱們也能夠:

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

這樣輸出的圖是左右均勻的:

還能夠在圖中加一個分類的特徵:

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

輸出:

盒圖

  • 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);

輸出:

對time分類後不直觀也很差看,咱們能夠:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);

讓spilt = True,使得直觀好看:

顯示值的集中趨勢能夠用條形圖

sns.barplot(x="sex", y="survived", hue="class", data=titanic);

點圖能夠更好的描述變化差別

sns.pointplot(x="sex", y="survived", hue="class", data=titanic)  #hue表示指標

對於點圖,還能夠將圖畫的好看一點,設置一些參數

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

輸出:

寬型數據

sns.boxplot(data=iris,orient="h")

orient = "h"將圖弄成橫着的

****多層面板分類圖

這個將以前的幾種整合到一塊兒,將圖的類型做爲參數傳入

sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips)
sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar")  #kind爲圖的類型
sns.factorplot(x="day", y="total_bill", hue="smoker",
               col="time", data=tips, kind="swarm") 

輸出:

sns.factorplot(x="time", y="total_bill", hue="smoker",
               col="day", data=tips, kind="box", size=4, aspect=.5) #指定寬度和大小

關於factorplot

複製代碼
seaborn.factorplot(x=None, y=None, hue=None, data=None, row=None, col=None, col_wrap=None, estimator=, ci=95, n_boot=1000, units=None, order=None, hue_order=None, row_order=None, col_order=None, kind='point', size=4, aspect=1, orient=None, color=None, palette=None, legend=True, legend_out=True, sharex=True, sharey=True, margin_titles=False, facet_kws=None, **kwargs)

Parameters:
•x,y,hue 數據集變量 變量名
•date 數據集 數據集名
•row,col 更多分類變量進行平鋪顯示 變量名
•col_wrap 每行的最高平鋪數 整數
•estimator 在每一個分類中進行矢量到標量的映射 矢量
•ci 置信區間 浮點數或None
•n_boot 計算置信區間時使用的引導迭代次數 整數
•units 採樣單元的標識符,用於執行多級引導和重複測量設計 數據變量或向量數據
•order, hue_order 對應排序列表 字符串列表
•row_order, col_order 對應排序列表 字符串列表
•kind : 可選:point 默認, bar 柱形圖, count 頻次, box 箱體, violin 提琴, strip 散點,swarm 分散點 size 每一個面的高度(英寸) 標量 aspect 縱橫比 標量 orient 方向 "v"/"h" color 顏色 matplotlib顏色 palette 調色板 seaborn顏色色板或字典 legend hue的信息面板 True/False legend_out 是否擴展圖形,並將信息框繪製在中心右邊 True/False share{x,y} 共享軸線 True/False
複製代碼

五、facetgrid使用方法及繪製多變量

先導入:

複製代碼
import numpy as np
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib as mpl
import matplotlib.pyplot as plt

sns.set(style="ticks")
np.random.seed(sum(map(ord, "axis_grids")))
複製代碼

先看看數據:

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

將圖先實例化出來:

g = sns.FacetGrid(tips, col="time")

g = sns.FacetGrid(tips, col="time")
g.map(plt.hist, "tip")   #條形圖,tip爲x軸
g = sns.FacetGrid(tips, col="sex", hue="smoker")   #
g.map(plt.scatter, "total_bill", "tip", alpha=.7)   #alpha爲透明度
g.add_legend()     #加入圖例(最右邊的)

g = sns.FacetGrid(tips, row="smoker", col="time", margin_titles=True)
g.map(sns.regplot, "size", "total_bill", color=".1", fit_reg=False, x_jitter=.1)   #fit_reg 表示迴歸的直線要不要畫出來, x_jitter表示抖動區間

g = sns.FacetGrid(tips, col="day", size=4, aspect=.5)    #寬度和大小
g.map(sns.barplot, "sex", "total_bill")    #先x後y

若是想指定圖的順序:

複製代碼
from pandas import Categorical
ordered_days = tips.day.value_counts().index
print (ordered_days)            #CategoricalIndex(['Sat', 'Sun', 'Thur', 'Fri']
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")
複製代碼

pal = dict(Lunch="seagreen", Dinner="gray")
g = sns.FacetGrid(tips, hue="time", palette=pal, size=5)      #palette表示調色板
g.map(plt.scatter, "total_bill", "tip", s=50, alpha=.7, linewidth=.5, edgecolor="white")   #s表示點的大小
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);      #子圖之間的距離
複製代碼

iris = sns.load_dataset("iris")
g = sns.PairGrid(iris)      #繪製多變量
g.map(plt.scatter);       
g = sns.PairGrid(iris)
g.map_diag(plt.hist)    #指定對角線圖的類型
g.map_offdiag(plt.scatter)          #指定非對角線圖的類型
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();

六、熱度圖繪製

先導入庫:

複製代碼
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np; 
np.random.seed(0)
import seaborn as sns;
sns.set()
複製代碼

用random提供隨機的數據:

複製代碼
uniform_data = np.random.rand(3, 3)
"""
[[ 0.0187898   0.6176355   0.61209572]
 [ 0.616934    0.94374808  0.6818203 ]
 [ 0.3595079   0.43703195  0.6976312 ]]
"""
heatmap = sns.heatmap(uniform_data)
複製代碼

輸出:

ax = sns.heatmap(uniform_data, vmin=0.2, vmax=0.5)    #設置調色板上下限
normal_data = np.random.randn(3, 3)    #隨機數有負數
print (normal_data)
ax = sns.heatmap(normal_data, center=0)     #讓調色板的中心爲0
flights = sns.load_dataset("flights")    #庫提供的數據
flights.head()  
flights = flights.pivot("month", "year", "passengers")
print (flights)
ax = sns.heatmap(flights)

輸出:

若是要讓數字顯示出來:

ax = sns.heatmap(flights, annot=True,fmt="d")    #annot顯示數字 fmt設置數字格式

讓圖中數據更明顯:

ax = sns.heatmap(flights, linewidths=.5)  #設置小格寬度

自定義顏色:

ax = sns.heatmap(flights, cmap="YlGnBu")
相關文章
相關標籤/搜索