1. 程式人生 > >python資料分析之matplotlib繪圖

python資料分析之matplotlib繪圖

matplotlib繪圖

Series和DataFrame都有一個用於生成各類圖表的plot方法。預設情況下,它們所生成的是線形圖

%matplotlib inline 是IPython 中的一個魔法函式。

以下命令都是在瀏覽器中輸入。

cmd命令視窗輸入:jupyter notebook

匯入庫

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
#內嵌畫圖
%matplotlib inline
#繪圖時可以顯示中文
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False

一、Matplotlib基礎知識

Matplotlib中的基本圖表包括的元素

  • x軸和y軸 axis
    水平和垂直的軸線

  • x軸和y軸刻度 tick
    刻度標示座標軸的分隔,包括最小刻度和最大刻度

  • x軸和y軸刻度標籤 tick label
    表示特定座標軸的值

  • 繪圖區域(座標系) axes

  • 座標系標題 title

  • 軸標籤 xlabel ylabel

1、包含單條曲線的圖 plt.plot(x)

  • 注意:y,x軸的值必須為數字
#只有一個引數的話,預設的下標做x軸
plt.plot(x)

這裡寫圖片描述

x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.plot(x,y)

這裡寫圖片描述

  • 繪製拋物線 :使用arange函式 y=x**2
x1=np.arange(-np.pi,np.pi,0.01)
y1=x1**2
plt.plot(x1,y1)

這裡寫圖片描述
- 繪製正弦曲線圖 y=sin(x)

x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
plt.plot(x,y)

這裡寫圖片描述

2、包含多個曲線的圖

2.1、連續呼叫多次plot函式

plt.plot(x,y)
plt.plot(x1,y1)

這裡寫圖片描述

2.2、也可以在一個plot函式中傳入多對X,Y值,在一個圖中繪製多個曲線

plt.plot(x1,y1,x1+1,y1+1)

這裡寫圖片描述

3、將多個曲線圖繪製在一個table區域中:物件形式建立表圖

  • a=plt.subplot(row,col,loc) 建立曲線圖
  • a.plot(x,y) 繪製曲線圖
#把table區域分成2行2列,最後一個1表示位置
a1=plt.subplot(2,2,1)
a1.plot(x,y)

a2=plt.subplot(2,2,2)
a2.plot(x,y)
a2.plot(x+1,y+1)

a3=plt.subplot(2,2,3)
a3.plot(x,y)

#也可以去掉逗號
a4=plt.subplot(224)
a4.plot(x,y)

這裡寫圖片描述

4、網格線 gride(XXX)

引數:

  • axis
  • color:支援十六進位制顏色
  • linestyle: – -. :
  • alpha

繪製一個正弦曲線圖,並設定網格

plt.grid(color='r',linestyle='-.')
plt.plot(x,y)

這裡寫圖片描述

  • 使用物件形式設定網格
ax_1=plt.subplot(111)
ax_1.grid(color='y')
ax_1.plot(x,y)

這裡寫圖片描述

  • 繪製一個兩行兩列的曲線圖陣,並設定網格
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
a1=plt.subplot(221)
a1.grid()
a1.plot(x,y)
a2=plt.subplot(222)
a2.grid()
a2.plot(x,y)
a3=plt.subplot(223)
a3.grid()
a3.plot(x,y)
a4=plt.subplot(224)
a4.grid()
a4.plot(x,y)

這裡寫圖片描述

5、座標軸界限

5.1 axis方法:修改x,y軸刻度值

plt.axis([xmin,xmax,ymin,ymax])

plt.plot(x,y)

這裡寫圖片描述

plt.axis([-4,4,-2,2])
plt.plot(x,y)

這裡寫圖片描述

5.2 plt.axis(‘off’)

關閉座標軸

plt.plot(x,y)
plt.axis('off')

這裡寫圖片描述

5.3 plt.figure(figsize=(a,b))

設定畫布比例:plt.figure(figsize=(a,b))

a:x刻度比例;

b:y刻度比例 (

2:1)表示x刻度顯示為y刻度顯示的2倍 。

plt.figure(figsize=(10,5))
plt.plot(x,y)

這裡寫圖片描述

5.4 xlim方法和ylim方法

還可以通過plt的xlim(xmin,xmax),ylim方法設定座標軸範圍

plt.xlim(-6,6)
plt.ylim(-2,2)
plt.plot(x,y)

這裡寫圖片描述

5.5 通過物件的方式設定x,y軸的刻度值範圍 ax.set_xlim(a,b)

ax1=plt.subplot(111)
ax1.set_xlim(-4,4)
ax1.set_ylim(-2,2)
ax1.plot(x,y)

這裡寫圖片描述

  • 繪製一個圓 x**2+y**2=1 y=1-x**2** 0.5
# 圓的基本資訊
# 1.圓半徑
r = 2.0
# 2.圓心座標
a, b = (0., 0.)

theta = np.arange(0, 2*np.pi, 0.01)
x = a + r * np.cos(theta)
y = b + r * np.sin(theta) 
axes = plt.subplot(111) 
axes.axis('equal')
axes.plot(x, y)

這裡寫圖片描述

x=np.linspace(-np.pi,np.pi,100)
y=(1-x**2)**0.5
y_=-y
plt.figure(figsize=(5,5))
plt.plot(x,y)
plt.plot(x,y_)
plt.axis('equal')

這裡寫圖片描述

6、座標軸標籤

  • color 標籤顏色
  • fontsize 字型大小
  • rotation 旋轉角度

  • plt的xlabel方法和ylabel方法

x=np.linspace(-np.pi,np.pi,100)
y=np.cos(x)
plt.title('Title')
plt.ylabel(s='yyy',fontsize=16,rotation=0,color='r')
plt.xlabel(s='xxx',fontsize=16)
plt.plot(x,y)

這裡寫圖片描述

  • 物件方法set_xlabel/ylabel()
ax=plt.subplot(111)
ax.set_xlabel('x_label')
ax.set_ylabel('y_label')
ax.set_title('title',fontsize=16)
ax.plot(x,y)

這裡寫圖片描述

6.1 顯示座標軸中文標籤

設定引數:fontproperties

x=np.linspace(-np.pi,np.pi,100)
y=np.cos(x)
ax=plt.subplot(111)
ax.set_xlabel('x軸',fontproperties='KaiTi',fontsize=30)
ax.set_ylabel('y軸',fontproperties='KaiTi',fontsize=30)
ax.set_title('title',fontsize=16)
ax.plot(x,y)

這裡寫圖片描述
其它字型:
這裡寫圖片描述

7、標題

plt.title()方法 ax.set_title()方法

8、圖例

8.1 legend方法

兩種傳參方法:
- 分別在plot函式中增加label引數,再呼叫plt.legend()方法顯示
- 直接在legend方法中傳入字串列表

x=np.linspace(0,10,30)
y=x ** 2
plt.plot(x,y,label='aaa')
plt.plot(x+1,y-1,label='bbb')
plt.legend()

這裡寫圖片描述

plt.plot(x,y)
plt.plot(x+1,y-1)
plt.legend(['a','b'])

這裡寫圖片描述

8.2 legend的引數

  • loc引數

  • loc引數用於設定圖例標籤的位置,一般在legend函式內

  • matplotlib已經預定義好幾種數字表示的位置
字串 數值 字串 數值
best 0 center left 6
upper right 1 center right 7
upper left 2 lower center 8
lower left 3 upper center 9
lower right 4 center 10
right 5
plt.plot(x,y)
plt.plot(x+1,y-1)
plt.legend(['aaa','bbb'],loc=5)

這裡寫圖片描述

loc引數可以是2元素的元組,表示圖例左下角的座標

  • [0,0] 左下
  • [0,1] 左上
  • [1,0] 右下
  • [1,1] 右上

  • ncol引數

ncol控制圖例中有幾列,在legend中設定ncol

plt.plot(x,y)
plt.plot(x+1,y-1)
plt.legend(['aaa','bbb'],loc=[1,1],ncol=2)

這裡寫圖片描述

9、儲存圖片

9.1 使用figure物件的savefig函式來儲存圖片

fig = plt.figure()

figure.savefig的引數選項
+ filename
含有檔案路徑的字串或Python的檔案型物件。影象格式由副檔名推斷得出,例如,.pdf推斷出PDF,.png推斷出PNG
(“png”、“pdf”、“svg”、“ps”、“eps”……)
+ dpi
影象解析度(每英寸點數),預設為100
+ facecolor ,開啟儲存圖片檢視
影象的背景色,預設為“w”(白色)

#儲存圖片注意事項:第一步必須先得到figure物件,
#再使用plt進行繪圖,然後儲存圖片
fig=plt.figure()
#關閉座標軸
plt.axis('off')
plt.plot(x,y)
fig.savefig(filename='./111.jpg',dpi=500)

這裡寫圖片描述

#讀取圖片
img=plt.imread('./111.jpg')
plt.imshow(img)
plt.show()

這裡寫圖片描述

二、設定plot的風格和樣式

plot語句中支援除X,Y以外的引數,以字串形式存在,來控制顏色、線型、點型等要素,語法形式為: plt.plot(X, Y, ‘format’, …)

1、顏色

引數color或c

x=np.linspace(0,10,30)
y=x ** 2
plt.plot(x,y,c='y')
plt.plot(x+1,y-1,color='r')

這裡寫圖片描述

顏色值的方式
  • 別名

    • color=’r’
  • 合法的HTML顏色名

    • color = ‘red’
顏色 別名 HTML顏色名 顏色 別名 HTML顏色名
藍色 b blue 綠色 g green
紅色 r red 黃色 y yellow
青色 c cyan 黑色 k black
洋紅色 m magenta 白色 w white
  • HTML十六進位制字串

    • color = ‘#eeefff’
  • 歸一化到[0, 1]的RGB元組

    • color = (0.3, 0.3, 0.4)

2、透明度

alpha引數

ax=plt.subplot(111)
ax.plot(x,y,c='r',alpha=0.4)

這裡寫圖片描述

3、背景色

設定背景色,通過傳入facecolor引數,來設定座標軸的背景色

#設定座標系的前景色
ax=plt.subplot(111)
ax.plot(x,y,c='r')
ax.set_facecolor('green')

這裡寫圖片描述

#設定座標系的背景色
f=plt.figure()
p=plt.plot(x,y)
f.set_facecolor('yellow')

這裡寫圖片描述

4、線型

引數linestyle或ls

線條風格 描述 線條風格 描述
‘-‘ 實線 ‘:’ 虛線
‘–’ 破折線 ‘steps’ 階梯線
‘-.’ 點劃線 ‘None’ / ‘,’ 什麼都不畫
plt.plot(x,y,ls=':')

這裡寫圖片描述

5、線寬

linewidth或lw引數

plt.plot(x,y,ls='steps',lw=5)

這裡寫圖片描述

6、點型

  • marker 設定點形
  • markersize 設定點形大小
標記 描述 標記 描述
’s’ 正方形 ‘p’ 五邊形
‘h’ 六邊形1 ‘H’ 六邊形2
‘8’ 八邊形
標記 描述 標記 描述
‘.’ ‘x’ X
‘*’ 星號 ‘+’ 加號
‘,’ 畫素
標記 描述 標記 描述
‘o’ 圓圈 ‘D’ 菱形
‘d’ 小菱形 ”,’None’,’ ‘,None
標記 描述 標記 描述
‘1’ 一角朝下的三腳架 ‘3’ 一角朝左的三腳架
‘2’ 一角朝上的三腳架 ‘4’ 一角朝右的三腳架
plt.plot(x,y,marker='o',lw=1)

這裡寫圖片描述
plot引數設定marker前後景色:markerfacecolor=’white’,markeredgecolor=’black’ markersize=30設定大小 。

plt.plot(x,y,marker='d',lw=3,markerfacecolor='yellow',markeredgecolor='red',markersize=40)

這裡寫圖片描述

7、多引數連用

注意:只可以設定顏色、點型、線型,可以把幾種引數寫在一個字串內進行設定 ‘r-.o’ 。

plt.plot(x,'or-.',x*2,'b--<')

這裡寫圖片描述

更多點和線的設定

引數 描述 引數 描述
color或c 線的顏色 linestyle或ls 線型
linewidth或lw 線寬 marker 點型
markeredgecolor 點邊緣的顏色 markeredgewidth 點邊緣的寬度
markerfacecolor 點內部的顏色 markersize 點的大小

8、在一條語句中為多個曲線進行設定

8.1 多個曲線同一設定

屬性名宣告

注意:不能多引數連用的形式設定 例如:’rh–’

plt.plot(x1, y1, x2, y2, fmt, …)

plt.plot(x,y,x+1,y-1,y+3,y-2,c='r')

這裡寫圖片描述

8.2 多個曲線不同設定

多個都進行設定,可以使用多參連用的形式 plt.plot(x1, y1, fmt1, x2, y2, fmt2, …)

p1,p2,p3=plt.plot(x,y,x+1,y-1,y+3,y-2,)
p1.set_lw(5)
p3.set_color('y')

這裡寫圖片描述

plt.plot(x,y,'or-.',x+1,y-1,'yd',y+3,y-2,'g--')

這裡寫圖片描述

9、X、Y軸座標刻度

9.1 對x和y軸的刻度做對映

如下方法是對x和y軸的刻度做對映而並非修改

plt.xticks()和plt.yticks()方法

  • 需指定刻度值和刻度名稱 plt.xticks([刻度列表],[名稱列表])
  • 支援fontsize、rotation、color等引數設定
plt.plot(x,y)

這裡寫圖片描述

plt.xticks([0,2,4,6,8,10],['a','b','c','d','e','f'])
plt.plot(x,y)

這裡寫圖片描述

9.2 使用面向物件的方法設定刻度方法

如下方法是用來修改x和y軸的刻度值,而不是對映 使用畫板的如下方法設定刻度axes = plt.subplot()

  • set_xticks、set_yticks 設定刻度值
  • set_xticklabels、set_yticklabels 設定刻度名稱
ax=plt.subplot(111)
ax.plot(x,y)
ax.set_yticks([0,200,400,600,800,1000])

這裡寫圖片描述

三、2D圖形

1、直方圖

  • 是一個特殊的柱狀圖,又叫做密度圖。

【直方圖的引數只有一個x!!!不像條形圖需要傳入x,y】

plt.hist()的引數:

  • bins
    可以是一個bin數量的整數值,也可以是表示bin的一個序列。預設值為10
  • normed
    如果值為True,直方圖的值將進行歸一化處理,形成概率密度,預設值為False
  • color
    指定直方圖的顏色。可以是單一顏色值或顏色的序列。如果指定了多個數據集合,例如DataFrame物件,顏色序列將會設定為相同的順序。如果未指定,將會使用一個預設的線條顏色
  • orientation
    通過設定orientation為horizontal建立水平直方圖。預設值為vertical
x=[1,2,2,3,4,4,5]
plt.hist(x,color='red')

這裡寫圖片描述

x=[1,2,2,3,4,4,5]
plt.hist(x,color='g',normed=True)

這裡寫圖片描述

2、條形圖:plt.bar()

  • 引數:第一個引數是索引。第二個引數是資料值。第三個引數是條形的寬度

-【條形圖有兩個引數x,y】

  • width 縱向設定條形寬度
  • height 橫向設定條形高度

bar()、barh()

x=[1,2,3,4,5]
y=[1,2,3,4,5]
plt.bar(x,y,0.5)

這裡寫圖片描述

水平條形圖

plt.barh(x,y,0.5)

這裡寫圖片描述

3、餅圖

【餅圖也只有一個引數x】

pie()
餅圖適合展示各部分佔總體的比例,條形圖適合比較各部分的大小

3.1 普通各部分佔滿餅圖
arr=[11,22,31,15]
plt.pie(arr)

這裡寫圖片描述

3.2 普通未佔滿餅圖:小數/比例

這裡寫圖片描述
餅圖陰影、分裂等屬性設定

labels引數設定每一塊的標籤;

labeldistance引數設定標籤距離圓心的距離(比例值)

autopct引數設定比例值小數保留位(%.3f%%);

​ %m.nf m 佔位 n 小數點後保留幾位 f 是以float格式輸出

pctdistance引數設定比例值文字距離圓心的距離

explode引數設定每一塊頂點距圓心的長度(比例值,列表);

colors引數設定每一塊的顏色(列表);

shadow引數為布林值,設定是否繪製陰影

startangle引數設定餅圖起始角度

arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'])

這裡寫圖片描述

arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3)

這裡寫圖片描述

arr=[11,22,31,15]
#顯示佔比
#%m.nf m 佔位 n 小數點後保留幾位 f 是以float格式輸出
plt.pie(arr,labels=['a','b','c','d'],
        labeldistance=0.3,autopct='%.6f%%')

這裡寫圖片描述

arr=[11,22,31,15]
plt.pie(arr,labels=['醬','醋','油','鹽'],
        labeldistance=0.3,
        shadow=True,
        explode=[0.2,0.3,0.2,0.4])

這裡寫圖片描述

4、散點圖:因變數隨自變數而變化的大致趨勢

【散點圖需要兩個引數x,y,但此時x不是表示x軸的刻度,而是每個點的橫座標!】

plt.scatter()

x=np.random.randn(300)
y=np.random.randn(300)
plt.scatter(x,y,marker='d',c=np.random.rand(300,3))

這裡寫圖片描述

x=np.random.randn(300)
y=np.random.randn(300)
plt.scatter(x,y,c=[i for i in random_color(300)])

這裡寫圖片描述

四、圖形內的文字、註釋、箭頭

控制文字屬性的方法:

Pyplot函式 API方法 描述
text() mpl.axes.Axes.text() 在Axes物件的任意位置新增文字
xlabel() mpl.axes.Axes.set_xlabel() 為X軸新增標籤
ylabel() mpl.axes.Axes.set_ylabel() 為Y軸新增標籤
title() mpl.axes.Axes.set_title() 為Axes物件新增標題
legend() mpl.axes.Axes.legend() 為Axes物件新增圖例
figtext() mpl.figure.Figure.text() 在Figure物件的任意位置新增文字
suptitle() mpl.figure.Figure.suptitle() 為Figure物件新增中心化的標題
annnotate() mpl.axes.Axes.annotate() 為Axes物件添加註釋(箭頭可選)

所有的方法會返回一個matplotlib.text.Text物件

1、圖形內的文字

plt.text()

plt.figtext()

x=[1,2,3]
y=[1,2,3]
plt.bar(x,y)
plt.text(0.7,1,s='第三',fontsize=40)
plt.figtext(0.4,0.8,s='排名',fontsize=40)

這裡寫圖片描述

2、註釋

annotate() xy引數設定箭頭指示的位置,xytext引數設定註釋文字的位置 arrowprops引數以字典的形式設定箭頭的樣式 width引數設定箭頭長方形部分的寬度,headlength引數設定箭頭尖端的長度, headwidth引數設定箭頭尖端底部的寬度,shrink引數設定箭頭頂點、尾部與指示點、註釋文字的距離(比例值)

3、箭頭

plt.figure(figsize=(12,9))
plt.axis([0, 10, 0, 20]);
arrstyles = ['-', '->', '-[', '<-', '<->', 'fancy', 
'simple', 'wedge']
for i, style in enumerate(arrstyles):
    plt.annotate(style, xytext=(1, 2+2*i), xy=(4, 1+2*i),
                 arrowprops=dict(arrowstyle=style));

connstyles=["arc", "arc,angleA=10,armA=30,rad=30", "arc3,rad=.2",
         "arc3,rad=-.2", "angle", "angle3"]
for i, style in enumerate(connstyles):
    plt.annotate(style, xytext=(6, 2+2*i), xy=(8, 1+2*i),
         arrowprops=dict(arrowstyle='->', connectionstyle=style));
plt.show()

這裡寫圖片描述

``'-'``        None
``'->'``       head_length=0.4,head_width=0.2
``'-['``       widthB=1.0,lengthB=0.2,angleB=None
``'|-|'``      widthA=1.0,widthB=1.0
``'-|>'``      head_length=0.4,head_width=0.2
``'<-'``       head_length=0.4,head_width=0.2
``'<->'``      head_length=0.4,head_width=0.2
``'<|-'``      head_length=0.4,head_width=0.2
``'<|-|>'``    head_length=0.4,head_width=0.2
``'fancy'``    head_length=0.4,head_width=0.4,tail_width=0.4
``'simple'``   head_length=0.5,head_width=0.5,tail_width=0.2
``'wedge'``    tail_width=<