數據分析_Python作圖

概述

工作時有時候有些數據在用Python處理完直接作圖比較方便。下面敘述一下日常作圖的步驟和常用的圖表實現方式。玫瑰圖等比較帥的圖的做法後續補上。可視化要是做的好還是挺能吸人眼球的,而且python也能實現比發雜的作圖。

選圖_根據目的

想要呈現的關係畫圖第一步就是要決定使用哪種圖,使用哪種圖取決於作圖目的,上面列出9種,每種下面都有對應的基礎圖形(哪些就不用說了),根據需求選擇。

選圖_根據數據關係

如果上面的方式沒辦法掌握,就按照想要呈現的數據關係進行選擇。
比較:比較數據間各類別的關係,或者是它們隨着時間的變化趨勢,比如折線圖。
聯繫:查看兩個或兩個以上變量之間的關係,比如散點圖。
構成:每個部分佔整體的百分比,或者是隨着時間的百分比變化,比如餅圖。
分佈:關注單個變量,或者多個變量的分佈情況,比如直方圖。

常用圖介紹及代碼實現

在這裏插入圖片描述

散點圖

特點:非常適合展示兩個變量之間的關係。當然,除了二維的散點圖,還有三維的散點圖。具體實現如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 數據準備
N = 1000
x = np.random.randn(N)
y = np.random.randn(N)
# 用Matplotlib畫散點圖
plt.scatter(x, y,marker='x',c = 'g')
plt.show()
# 用Seaborn畫散點圖
df = pd.DataFrame({'x': x, 'y': y})
sns.jointplot(x="x", y="y", data=df, kind='scatter',);
sns.set_style('whitegrid')
plt.show()
  • Matplotlib:marker 代表了標記的符號。比如“x”、“>”或者“o”
  • Seaborn:其中 x、y 是 data 中的下標。data 就是我們要傳入的數據,一般是 DataFrame 類型。kind 這類我們取 scatter,代表散點的意思。 kind 還可以取其他值,後面說,不同的 kind 代表不同的視圖繪製方式。

Matplotlib:
在這裏插入圖片描述
Seaborn:
在這裏插入圖片描述
區別:Matplotlib 默認情況下呈現出來的是個長方形。而 Seaborn 呈現的是個正方形,而且不僅顯示出了散點圖,還給了這兩個變量的分佈情況。

折線圖

特點:可以用來表示數據隨着時間變化的趨勢。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 數據準備
x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019]
y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35]
# 使用Matplotlib畫折線圖
plt.plot(x, y)
plt.show()
# 使用Seaborn畫折線圖
df = pd.DataFrame({'x': x, 'y': y})
sns.lineplot(x="x", y="y", data=df)
plt.show()
  • Matplotlib:需要提前把數據按照 x 軸的大小進行排序,要不畫出來的折線圖就無法按照 x 軸遞增的順序展示。

Matplotlib:
在這裏插入圖片描述
Seaborn:
在這裏插入圖片描述
區別:在 seaborn 中標記了 x 和 y 軸的含義,散點圖也是加了座標軸含義。

直方圖

特點:側重於分佈,直方圖是比較常見的視圖,它是把橫座標等分成了一定數量的小區間,這個小區間也叫作“箱子”,然後在每個“箱子”內用矩形條(bars)展示該箱子的箱子數(也就是 y 值),這樣就完成了對數據集的直方圖分佈的可視化。


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
a = np.random.randn(100)
s = pd.Series(a) 
# 用Matplotlib畫直方圖
plt.hist(s)
plt.show()
# 用Seaborn畫直方圖
sns.distplot(s, kde=True)
plt.show()
sns.distplot(s, kde=False)
plt.show()

Matplotlib:
在這裏插入圖片描述
Seaborn(核密度估計)
在這裏插入圖片描述
Seaborn(無核密度估計)
在這裏插入圖片描述
區別:Seaborn帶核密度估計,默認顏色比較小清新,低飽和度。

條形圖

特點:如果說通過直方圖可以看到變量的數值分佈,那麼條形圖可以幫我們查看類別的特徵(頻數)。做成動態排行會很好看。

import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5']
y = [5, 4, 8, 12, 7]
# 用Matplotlib畫條形圖
plt.bar(x, y)
plt.show()
# 用Seaborn畫條形圖
sns.barplot(x, y)
plt.show()
  • Seaborn:sns.barplot(x=None, y=None, data=None),還是可以用DataFrame格式,感覺這是Seaborn的通用格式。

Mathplotlib:
在這裏插入圖片描述
Seaborn:
在這裏插入圖片描述
區別:Seaborn默認不是單色

箱線圖

特點:又稱盒式圖,由五個數值點組成:最大值 (max)、最小值 (min)、中位數 (median) 和上下四分位數 (Q3, Q1)。它可以幫我們分析出數據的差異性、離散程度和異常值等。可以應用在去除噪聲數據。

# 數據準備
# 生成10*4維度數據
data=np.random.normal(size=(10,4)) 
lables = ['A','B','C','D']
# 用Matplotlib畫箱線圖
plt.boxplot(data,labels=lables)
plt.show()
# 用Seaborn畫箱線圖
df = pd.DataFrame(data, columns=lables)
sns.boxplot(data=df)
plt.show()
  • numpy.random.normal(loc=0.0, scale=1.0, size=None),概率分佈的均值,scale:概率分佈的標準差(對應於分佈的寬度,scale越大越矮胖,scale越小,越瘦高)size:輸出的shape,默認爲None,只輸出一個值。loc=0.0, scale=1.0就是正態分佈。

Matplotlib:
在這裏插入圖片描述
Seborn:
在這裏插入圖片描述
區別:Style不同。

餅圖

特點:常用在統計學模塊,可以顯示每個部分大小與總和之間的比例。在 Python 數據可視化中,它用的不算多。我們主要採用 Matplotlib 的 pie 函數實現它。

import matplotlib.pyplot as plt
# 數據準備
nums = [25, 37, 33, 37, 6]
labels = ['High-school','Bachelor','Master','Ph.d', 'Others']
# 用Matplotlib畫餅圖
plt.pie(x = nums, labels=labels)
plt.show()

在這裏插入圖片描述

熱力圖

特點:熱力圖是一種矩陣表示方法,其中矩陣中的元素值用顏色來代表,不同的顏色代表不同大小的值。通過顏色就能直觀地知道某個位置上數值的大小。

import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
flights = sns.load_dataset("flights")
data=flights.pivot('year','month','passengers')
# 用Seaborn畫熱力圖
sns.heatmap(data)
plt.show()
  • 這裏我們使用 Seaborn 中自帶的數據集 flights,該數據集記錄了 1949 年到 1960 年期間,每個月的航班乘客的數量。
    在這裏插入圖片描述
    在這裏插入圖片描述

蜘蛛圖

特點:顯示一對多關係的方法。在蜘蛛圖中,一個變量相對於另一個變量的顯著性是清晰可見的。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.font_manager import FontProperties
%matplotlib inline
# 數據準備
labels=np.array([u"推進","KDA",u"生存",u"團戰",u"發育",u"輸出"])
stats=[83, 61, 95, 67, 76, 88]
# 畫圖數據準備,角度、狀態值
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
stats=np.concatenate((stats,[stats[0]]))
angles=np.concatenate((angles,[angles[0]]))
# 用Matplotlib畫蜘蛛圖
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)   
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
# 設置中文字體
font = FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=14)  
ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font)
plt.show()
  • 需要在原有 angles 和 stats 數組上增加一位,也就是添加數組的第一個元素,加上之後纔可以構成一個環。
  • 字符前加u是用unicode編碼,中文需要,英文一般不用。
  • np.linspace(start,end,num,endpoint)用於生成等差數列,endpoint=False代表不排除終點。
  • flt.figure 是創建一個空白的 figure 對象,這樣做的目的相當於畫畫前先準備一個空白的畫板。然後 add_subplot(111) 可以把畫板劃分成 1 行 1 列。再用 ax.plot 和 ax.fill 進行連線以及給圖形上色。
  • 中文字體simhei.ttf下載鏈接:http://www.downcc.com/font/7665.html
  • ax.fill(angles, stats, alpha=0.25) ,alpha=0.25代表蛛網部分透明度。

在這裏插入圖片描述

二元變量分佈

特點:如果我們想要看兩個變量之間的關係,就需要用到二元變量分佈。在 Seaborn 裏,使用二元變量分佈非常方便, sns.jointplot(x, y, data=None, kind) 函數即可。其中用 kind 表示不同的視圖類型:“kind=‘scatter’”代表散點圖,“kind=‘kde’”代表核密度圖,“kind=‘hex’ ”代表 Hexbin 圖,它代表的是直方圖的二維模擬。

import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
tips = sns.load_dataset("tips")
print(tips.head(10))
# 用Seaborn畫二元變量分佈圖(散點圖,核密度圖,Hexbin圖)
sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde')
sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex')
plt.show()
  • 這裏我們使用 Seaborn 中自帶的數據集 tips,這個數據集記錄了不同顧客在餐廳的消費賬單及小費情況。代碼中 total_bill 保存了客戶的賬單金額,tip 是該客戶給出的小費金額。我們可以用 Seaborn 中的 jointplot 來探索這兩個變量之間的關係。
    在這裏插入圖片描述
    散點圖:
    在這裏插入圖片描述
    核密度圖:
    在這裏插入圖片描述
    Hexbin 圖:
    在這裏插入圖片描述

成對關係

特點:探索數據集中的多個成對雙變量的分佈,可以直接採用 sns.pairplot() 函數。它會同時展示出 DataFrame 中每對變量的關係,另外在對角線上,你能看到每個變量自身作爲單變量的分佈情況。pairplot 函數的使用,就像在 DataFrame 中使用 describe() 函數一樣方便,是數據探索中的常用函數。

import matplotlib.pyplot as plt
import seaborn as sns
# 數據準備
iris = sns.load_dataset('iris')
# 用Seaborn畫成對關係
sns.pairplot(iris)
plt.show()
  1. 這裏我們使用 Seaborn 中自帶的 iris 數據集,這個數據集也叫鳶尾花數據集。鳶尾花可以分成 Setosa、Versicolour 和 Virginica 三個品種,在這個數據集中,針對每一個品種,都有 50 個數據,每個數據中包括了 4 個屬性,分別是花萼長度、花萼寬度、花瓣長度和花瓣寬度。通過這些數據,需要你來預測鳶尾花卉屬於三個品種中的哪一種。import matplotlib.pyplot as plt
    -在這裏插入圖片描述

總結:

  1. Seaborn 是基於 Matplotlib 更加高級的可視化庫。
  2. pairplot() 的使用,相好比 Pandas 中的 describe() 使用一樣方便。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章