之前介紹過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)
道阻且長,加油吧,少年!