python數據可視化之pandas繪圖


  • 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來設定畫三個餅狀子圖

結果為:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM