-
pandas繪圖
import matplotlib as mpl import matplotlib.pyplot as plt import pandas as pd import numpy as np # 解決坐標軸刻度負號亂碼 plt.rcParams['axes.unicode_minus'] = False # 解決中文亂碼問題 plt.rcParams['font.sans-serif'] = ['Simhei']
如果想利用 pandas 繪圖,可使用 Series 或 DataFrame 對象,並利用 series.plot() 或 dataframe.plot() 進行繪圖
-
1、Series.plot()
import pandas as pd series = pd.Series([2.5, 4.1, 2.7, 8.8, 1.0]) series.index.name='site' # series的索引會轉化為橫坐標,索引的標簽會轉化為橫坐標的標簽名 series.plot(kind="line",linestyle='-.', color='k', marker='o');
結果為:
import pandas as pd series = pd.Series([2.5, 4.1, 2.7, 8.8, 1.0]) series.index = ["a","b","c","d","e"] series.index.name = 'site' series.plot(kind="bar", fontsize=12);
結果為:
通過 series.plot() 中的 kind 參數,能畫以下圖:
- 'line' : 線圖(默認)
- 'bar' : 垂直條形圖
- 'barh' : 水平條形圖
- 'hist' : 直方圖
- 'box' : 箱型圖
- 'kde' : 核密度估計圖
- 'density' :與'kde'相同
- 'area' : 面積圖
- 'pie' :餅圖
-
2、dataframe.plot()
-
2.1 通過 kind 參數設置想要畫圖的類型
通過 dataframe.plot() 中的 kind 參數,可以繪制以下圖:
- 'line' :線圖(默認)
- ‘bar’ or ‘barh’ :柱狀圖、條型圖
- ‘hist’ :頻率柱狀圖(計算某些值出現的頻率)
- ‘box’ :箱線圖
- ‘kde’ or ‘density’ :密度圖(需要scipy這個包)
- ‘area’ :區域圖(不同區域的面積占比)
- ‘scatter’ :散點圖 >>> plt.scatter(df['part A'], df['part B'])
- ‘hexbin’ : plt.hexbin(df['part A'], df['part B'], df['part C'])
- ‘pie’ :餅圖,比較適合於 Series 對象,看不同的占比
dataframe = pd.DataFrame({'A':[9, 4, 4, 5, 7], 'B':[2, 4, 2, 8, 1]}) dataframe.index = ["一","二","三","四","五"]
dataframe.plot(kind="bar"); # dataframe.plot(subplots=True, sharex=True); # 畫在多個子圖當中
結果為:
dataframe = pd.DataFrame({'A':[9, 4, 4, 5, 7], 'B':[2, 4, 2, 8, 1]}) dataframe.plot(linestyle='dashed', color=['k','r'], marker='o', xticks=[0, 1, 2, 3, 4], yticks=np.arange(0, 10.0, 0.5), xlim=[-0.25, 4.25], title='dataframe photo');
結果為:
-
2.2 dataframe.plot.bar() 柱狀圖或條形圖
dataframe = pd.DataFrame({'A':[9, 4, 4, 5, 7], 'B':[2, 4, 2, 8, 1]}) dataframe.index = ['once', 'twice', 'thrice', 'forth', 'fifth'] dataframe.plot.bar(); # 同 dataframe.plot(kind="bar"); # dataframe.plot(subplots=True, sharex=True);
結果為:
-
2.3 dataframe.plot.hist() 直方圖
直方圖(histogram)是一種可以對值頻率進行離散化顯示的柱狀圖,數據點被拆分到離散的、間隔均勻的面元中,繪制的是各面元中數據點的數量
dataframe.plot.hist(bins=20)
- bins=20表示數值分辨率,具體來說是將隨機數設定一個范圍
- 例如5.6,5.7,6.5,如果數值分辨率越低,則會將三個數分到5-7之間
- 如果數值分辨率越高,5.6,5.7將會分到5-6之間,而6.5將會分到6-7之間
import numpy as np a = np.random.randn(100) df = pd.DataFrame({'length':a }) df.plot.hist(bins=20);
結果為:
X 軸是 DataFrame 當中的數值分布,Y 軸是對應數值出現的次數
對多列數據畫直方圖:
# plt.figure() #表示設定繪制圖標對象 df= pd.DataFrame({'a': np.random.randn(100) + 1, 'b': np.random.randn(100), 'c': np.random.randn(100) - 1}, index=range(1,101), columns=['a', 'b', 'c']) df.plot.hist();
結果為:
如果要用直方圖只查看上面的 DataFrame 中的其中一個 Series(比如a) 的數據分布,"抽"這列出來即可:
df['a'].plot.hist(orientation='horizontal', cumulative=True); # 該圖是將DataFrame對象當中的a進行數值累加,並繪制橫向直方圖,橫軸表示頻率(Frequency),縱軸表示數值 # cumulative=True的效果是將各Frequency的數值累加
結果為:
df.diff() 的效果是將 DataFrame 當中 column 分開,即將 a,b 和 c 分開繪制成三張圖
例如:df.diff().hist() 可達到這個效果,即將所有 column 分開
df.diff().hist(color='k', alpha=0.5, bins=50);
結果為:
-
2.4 series.plot.box(),dataframe.plot.box() 箱線圖
- 箱線圖所表示的各個數值的含義:線條右下到上分別表示
- 最小值、第一四分位數、中位數、第三四分位數和最大值
- 第一四分位數(Q1),又稱“較小四分位數”或“下四分位數”,等於該樣本中所有數值由小到大排列后第25%的數字;
- 第二四分位數(Q2),又稱“中位數”,等於該樣本中所有數值由小到大排列后第50%的數字;
- 第三四分位數(Q3),又稱“較大四分位數”或“上四分位數”,等於該樣本中所有數值由小到大排列后第75%的數字;
- 第三四分位數與第一四分位數的差距又稱四分位間距(InterQuartile Range,IQR)。
- 計算四分位數首先要確定Q1、Q2、Q3的位置(n表示數字的總個數):
- Q1的位置=(n+1)/4
- Q2的位置=(n+1)/2
- Q3的位置=3(n+1)/4
箱線圖可以用如下方式繪制:
- series.plot.box()
- dataframe.plot.box()
- dataframe.boxplot()
np.random.seed(80) a = np.random.rand(10, 5) #np.random.rand產生的隨機數都為0-1之間的正數 df = pd.DataFrame(a, columns=['A', 'B', 'C', 'D', 'E']) df.plot.box();
結果為:
- 修改箱線圖線條顏色需要有以下4個方面:
- boxes(盒身)
- whiskers(須)
- medians(中位數)
- caps(最大值,最小值)
- 可以將顏色與上面的4個keys建立字典關系,並在繪圖時引入到 color 參數中
#盒身為深綠色,須為深黃色,中位數為深藍色,最大最小值為灰色 color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray') df.plot.box(color=color, sym='r+'); #這里參數 sym 是設置離群值的樣式,"r+"表示"紅色,展示圖形為+",類似可以設置為 "k*","bv" 等等
結果為:
#可繪制水平箱線圖, positions 表示的意思是 ABCDE 這5個箱線圖擺放位置,A在1位置,B在4位置,AB之間間隔2,3這兩個位置 df.plot.box(vert=True, positions=[1, 4, 5, 6, 8], sym='k*');
結果為:
-
2.5 區域面積圖(堆積折線圖)
繪圖方式:
- series.plot.area()
- dataframe.plot.area()
作用:相當於可以看到不同時刻的餅圖占比情況
import pandas as pd np.random.seed(80) df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd']) df.plot.area() #生成堆積圖 df.plot.area(stacked=False); #非堆積效果圖
結果為:
-
2.6 散點圖
繪圖方式:dataframe.plot.scatter()
import pandas as pd np.random.seed(80) df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd']) # abcd四列中,各列設定50個隨機數 df.plot.scatter(x='a', y='b'); # 以a列為X軸數值,b列為Y軸數值繪制散點圖
結果為:
df.plot.scatter(x='c', y='d', color='DarkBlue', label='Group 1'); #先設定第一個散點圖,顏色為深藍色標簽為Group 1,以cd兩列作為x及y軸的值
結果為:
如果有兩組散點圖,如何放在同一張圖中作對比?
ax = df.plot.scatter(x='a', y='b', color='DarkBlue', label='Group 1') #先設定第一個散點圖,顏色為深藍色標簽為Group 1,以ab兩列作為x及y軸的值 df.plot.scatter(x='c', y='d', color='r', label='Group 2', ax=ax); #第二個散點圖以cd兩列作為x及y軸的值,顏色為深綠色標簽為Group 2,ax=ax的作用是將ax這個圖繪制到Group 2圖片當中,形成兩層圖形嵌套關系
結果為:
-
2.7 餅圖
繪圖方式:
- series.plot.pie()
- dataframe.plot.pie()
import pandas as pd series = pd.Series(np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series') series.plot.pie(figsize=(6, 6));
結果為:
df.plot.pie(y='x');
結果為:
df = pd.DataFrame(np.random.rand(4, 3), index=['a', 'b', 'c', 'd'], columns=['x', 'y', 'z']) df.plot.pie(subplots=True, figsize=(8, 4),); #df中三列數據通過subplots=True來設定畫三個餅狀子圖
結果為: