-
seaborn
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pd # 解決坐標軸刻度負號亂碼 plt.rcParams['axes.unicode_minus'] = False # 解決中文亂碼問題 plt.rcParams['font.sans-serif'] = ['Simhei']
-
1、Seaborn基礎
-
1.1 關於 matplotlib 與 seaborn
-
要實現復雜的數據可視化,要寫大量的樣板代碼
-
Matplotlib比Pandas更早開發,要使用Matplotlib實現DataFrame的數據可視化,相對Seaborn比較麻煩
-
Seaborn是在Matplotlib基礎上開發的一套API,為圖形樣式和顏色設置提供合理的選擇,同時為很多常用的統計圖形提供專門的高級函數調用
-
Pandas與DataFrame有機結合,是使用Matplotlib時很好的附加工具
-
1.2 風格選擇
使用 seaborn 畫圖之前的圖樣:
import matplotlib.pyplot as plt import numpy as np def hehe(): plt.rcParams['font.sans-serif'] = ['Simhei'] # 解決中文亂碼問題 x=np.linspace(0.05,10,100) y_01=np.cos(x) y_02=np.sin(x) plt.plot(x,y_01,ls="-",label=r"$\cos(x)$") plt.plot(x,y_02,ls="-",label=r"$\sin(x)$") plt.legend(loc="lower left",title="函數",) #或者寫loc=3 plt.title("正弦函數和余弦函數的折線圖"); hehe()
結果為:
- seaborn 的風格,它們分別是:
- darkgrid(默認)
- whitegrid
- dark
- white
- ticks
- sns.set() 可以用來重置 Seaborn 默認的主題
- 運行下面的 sns.set() 語句之后,會將接下來運行的 Matplotlib 繪圖設置成 Seaborn 默認的主題,重新運行上面的圖:
import seaborn as sns sns.set() hehe()
結果為:
如果想改變 Seaborn 主題,可以使用以下語句:
- axes_style()
- set_style() 比如我們又想將默認的 darkgrid 主題改成 ticks :
sns.set_style("whitegrid") hehe()
結果為:
-
1.3 自定義坐標軸
如果不想要軸脊柱(圖形邊框的上下左右四條軸),可以通過 sns.despine() 來移除(先畫圖后移除,默認移除右和上兩條軸):
hehe() sns.despine() # sns.despine(left=True, bottom=True, top=False, right=False)
結果為:
offset 參數可以設置圖形距離原地的距離:
hehe() sns.despine(offset=10); # 絕對距離,以點為單位
結果為:
-
1.4 自定義繪圖元素比例
Seaborn 有一套的參數可以控制繪圖元素的比例,通過 sns.set_context() 設置,有四個預置環境,按大小從小到大排列分別為:paper < notebook < talk < poster,其中,默認是 notebook
sns.set_context("talk") hehe()
結果為:
-
2、數據集分布的可視化
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(100) # 隨機數生成種子
-
2.1 單變量分布圖 sns.distplot()
在 Seaborn 中,快速觀察單變量分布的最方便的方法就是使用 distplot() 函數,默認會使用柱狀圖(histogram)來繪制
- bin:直方圖在橫坐標的數據值范圍內均等分的形成一定數量的數據段數量
- hist:bool,可選,是否繪制(標准化)直方圖
- kde:bool,可選,是否繪制核密度估計曲線(高斯)
- rug : bool, 可選,在每個觀察點上的垂直小標簽
x = np.random.normal(size=100) sns.distplot(x); #如果運行代碼出現報錯,那么運行pip install --upgrade scipy
結果為:
x = np.random.normal(size=100) sns.distplot(x, hist=True,bins=30,kde=False, rug=True); # kde, 是否畫核密度曲線 # rug,是否將數組中的數據點畫出來作為坐標軸的刻度線
結果為:
-
2.2 二元分布圖
-
2.2.1 散點圖 sns.jointplot()
在 Seaborn 中,對於雙變量分布的可視化,最簡單的方法就是使用 joinplot() 函數,它能夠創建一個多面板圖形來展示兩個變量之間的聯合關系,以及每個軸上單變量的分布情況
x = np.random.rand(100) y = np.random.rand(100) #從0到1之間,生成100個 df = pd.DataFrame({"A":x, "B":y}) sns.jointplot(x="A", y="B", data=df);
結果為:
-
2.2.2 Hexbin 圖
- 對於相對較大的數據集進行繪圖,使用 “hexbin” 圖最好,它展示了落在六角形箱內的觀測量
- “hexbin” 圖可以通過 matplotlib 的 plt.hexbin 函數繪制
- “hexbin” 圖也可以作為 jointplot 的一種類型參數使用,設置 sns.jointplot() 內的參數 kind="hex"
- 使用白色背景的時候視覺效果最好
sns.axes_style("white") x = np.random.rand(200) y = x+np.random.rand(200) sns.jointplot(x=x, y=y, kind="hex", color="k");
結果為:
-
2.2.3 多元矩陣圖 sns.pairplot()
當需要對多維數據集進行可視化時,可以使用矩陣圖 sns.pairplot()
導入鳶尾花數據集:
iris = sns.load_dataset("iris") iris.head()
繪制多元矩陣圖:
sns.pairplot(iris);
結果為:
-
3、其他常見圖形
-
散點圖
sns.scatterplot(x="字段名A", y="字段名B", data=“某DataFrame”)
sns.scatterplot(x="petal_length", y="petal_width", data=iris);
結果為:
- 線圖
sns.lineplot(x="字段名A", y="字段名B", data="某DataFrame")
sns.lineplot(x="petal_length", y="petal_width", data=iris);
結果為:
- 柱狀圖
sns.barplot(x="字段A", y="字段B", data="某DataFrame")
sns.barplot(x="petal_length", y="petal_width", data=iris);
結果為:
- 計數圖
sns.countplot(x="字段A", data="某DataFrame")
sns.countplot(x="petal_length", data=iris);
結果為: