pandas數據分析之繪圖方法詳解

之前介紹過matplotlib plot方法的詳細用法,今天來介紹一下pandas中繪圖方法,pandas中封裝的繪圖方法本質上還是調用了matplotlib的繪圖方法。

  • 基礎繪圖方法plot,pandas中Series和DataFrame的plot方法是包裝自matplotlib的plot方法
# Series繪圖
ts = pd.Series(
    np.random.randn(1000),
    index=pd.date_range('1/1/2000', periods=1000)
)
# cumsum累加求和,並保留累加的中間結果
ts = ts.cumsum(axis=0)
ts.plot()

  • 對DataFrame調用plot函數,會將各個屬性的名稱設置爲labels
df = pd.DataFrame(
    np.random.randn(1000, 4),
    index=ts.index,
    columns=["A", "B", "C", "D"]
)
df = df.cumsum(axis=0)
df.plot()

 

  • DataFrame調用plot函數時,可以通過指定x和y參數來繪製兩個屬性之間的關係
df3 = pd.DataFrame(
    np.random.randn(100, 2),
    columns=["B", "C"]
)
df3["A"] = pd.Series(list(range(len(df3))))
"""
    參數解釋:詳見matplotlib plot函數參數解釋
    x:橫軸數據
    y:縱軸數據
    color繪圖顏色
    linestyle:線條樣式
    linewidth:線條寬度
    figsize:繪圖大小
    legend:是否顯示圖例
    logy:是否對y軸數據進行log變化,控制數值範圍
"""
df3.plot(x="A", y="B", color="b", linestyle="-", linewidth=2, figsize=(10,10), legend=True, logy=True)

繪製線形圖以外的其他圖像時,可以通過plot函數的kind參數控制圖像樣式:

  • ‘bar’ or ‘barh’ for bar plots -> 條形圖(豎直或水平)
  • ‘hist’ for histogram -> 柱狀圖
  • ‘box’ for boxplot -> 箱型圖
  • ‘kde’ or ‘density’ for density plots -> 密度圖
  • ‘area’ for area plots -> 面積圖
  • ‘scatter’ for scatter plots -> 散點圖
  • ‘hexbin’ for hexagonal bin plots -> 六角本圖
  • ‘pie’ for pie plots -> 餅圖

1)、kind="bar"條形圖(豎直)

df.iloc[5].plot(kind="bar")
print(df.iloc[5])

2)、kind="barh"條形圖(水平)

df.iloc[5].plot(kind="barh")
print(df.iloc[5])

3)、除了使用plot的kind參數指定繪圖樣式,也可以直接使用plot.的形式指定繪圖樣式

# 繪製條形圖
df.iloc[5].plot.bar()

  • 繪製條形圖DataFrame.plot.bar()
df.iloc[5].plot.bar()
plt.axhline(0, color='b');

df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot.bar()

# 將條形圖進行堆疊
df2.plot.bar(stacked=True)

# 繪製水平條形圖
df2.plot.barh(stacked=True)

  • 繪製柱狀圖DataFrame.plot.hist()
df = pd.DataFrame(
    {
        "a": np.random.randn(1000) + 1,
        "b": np.random.randn(1000),
        "c": np.random.randn(1000) - 1
    },
    columns=["a", "b", "c"]
)
# alpha參數控制圖像的透明度
df.plot.hist(alpha=0.5)

# 柱狀圖堆疊,並指定柱狀圖的分箱數
#  bins參數控制統計區間的大小
df.plot.hist(stacked=True, bins=20)

# 也可以使用matplotlib庫hist方法提供的關鍵字參數
df.plot.hist(orientation="horizontal", cumulative=True)

# 除了通過df.plot.hist方式進行調用,DataFrame也有hist方法
# DataFrame的hist方法使用多個子圖分別繪製DataFrame的column
df.hist(bins=20)

s = pd.Series([1,3,4,6,7,9])
# diff函數用來判斷屬性的每個值與指定數值的差距,默認的指定數值爲前一行的數值內容
s.diff().hist()

# DataFrame的hist方法可以使用by參數來定義分組
data = pd.Series(np.random.randn(1000))
# np.random.randint(0, 4, 1000)隨機生成1000個0-3之間的數字,然後將這些數字進行分組,並將與之對應的data數據繪製直方圖
data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4))
pd.Series(np.random.randint(0, 4, 1000)).value_counts()

  • 繪製箱型圖DataFrame.plot.box() 

箱型圖簡介: 
(1)計算上四分位數(Q3),中位數,下四分位數(Q1) 
(2)計算上四分位數和下四分位數之間的差值,即四分位數差(IQR,interquartile range)Q3-Q1 
(3)繪製箱線圖的上下範圍,上限爲上四分位數,下限爲下四分位數。在箱子內部中位數的位置繪製橫線。 
(4)大於 上四分位數 1.5倍四分位數差 的值,或者小於下四分位數1.5倍四分位數差的值,劃爲異常值(outliers)。 
(5)異常值之外,最靠近上邊緣和下邊緣的兩個值處,畫橫線,作爲箱線圖的觸鬚。 
(6)極端異常值,即超出四分位數差3倍距離的異常值,用實心點表示;較爲溫和的異常值,即處於1.5倍-3倍四分位數差之間的異常值,用空心點表示。 
(7)爲箱線圖添加名稱,數軸等

df = pd.DataFrame(np.random.randn(10, 5), columns=["A", "B", "C", "D", "E"])
# 繪製所有數值屬性的箱線圖
df.plot.box()

# 繪製單獨一個屬性的箱線圖
df["A"].plot.box()

df.boxplot()

# 設置箱線圖的顏色
color = {'boxes': 'DarkGreen', 'whiskers': 'DarkOrange', 'medians': 'DarkBlue', 'caps': 'Gray'}
# sym指定異常值的樣式
df.plot.box(color=color, sym='r+')

  • 繪製面積圖DataFrame.plot.area() 

面積圖的意義:堆積面積圖是一種特殊的面積圖,可以用來比較在一個區間內的多個變量。堆疊面積圖和麪積圖的區別在於,堆疊面積圖每個數據系列的起點都是基於前一個數據系列繪製的(堆疊面積圖要求一列數據要麼全爲正,要麼全爲負),也就是每度量一行就要填滿行與行之間的區域。如果有多個數據系列,並想分析每個類別的部分到整體的關係,並展現部分量對於總量的貢獻時,使用堆積面積圖是非常合適的選擇。

df = pd.DataFrame(np.random.rand(10, 4), columns=["A", "B", "C", "D"])
df["B"] = df["B"] * -1.0
# 繪製的面積圖默認是堆疊的形式,堆疊面積圖要求同一個特徵的數值要麼全爲正,要麼全爲負
df.plot.area()
df.loc[0].sum() - df.loc[0, "B"], df.loc[0, "B"], df.loc[9].sum() - df.loc[9, "B"], df.loc[9, "B"]
(1.2377821011551786, -0.3169154766752843, 1.9799948518694093, -0.7935035073522937)

df.loc[0:5, "B"] = df.loc[0:5, "B"] * -1.0
df.plot.area(stacked=False)

  • 繪製散點圖DataFrame.plot.scatter() 

散點圖要求屬性是數值型的。

df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x="a", y="b")
# 在一個axes中繪製多個散點圖
# 獲取畫布的句柄,指定繪製的顏色,標記樣式
ax = df.plot.scatter(x="a", y="b", color="r", marker=".", figsize=(10, 8), s=50)
# 指定畫布,顏色,標記樣式,用來區分不同的數據
df.plot.scatter(x="c", y="d", ax=ax, color="b", marker="^")
df.plot.scatter(x="a", y="c", ax=ax, color="k", marker="<")

# 使用關鍵字c來爲每個數據點設置不同的顏色,通常用來顯示兩個變量(x,y)的共同作用對第三個變量c的影響
df.plot.scatter(x='a', y='b', c='c', s=50)

  • 不同繪圖方法的缺失值處理方法

  • 繪製散點圖矩陣pandas.plotting.scatter_matrix
from pandas.plotting import scatter_matrix

# 使用scatter_matrix繪製所有特徵組合之間的散點圖,並指定對角線上的顯示樣式密度kde或柱狀圖hist
df = pd.DataFrame(np.random.randn(1000, 4), columns=['a', 'b', 'c', 'd'])
scatter_matrix(df, alpha=0.2, figsize=(8, 8), diagonal="hist")

  • 繪製密度圖DataFrame.plot.kde()
df.plot.kde(legend=True)

 

參考:pandas官網 pandas CookBook

道阻且長,加油吧,少年!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章