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=<