Matplotlib庫-Python數據可視化

Matplotlib基礎

Matplotlib庫介紹

  1. Matplotlib是Python的繪圖庫,是和交互式的進行製圖,而且可以方便的將它作爲繪圖軟件,嵌入GUI應用程序中
  2. Matplotlib庫由各種可視化類構成,內部結構複雜
  3. Matplotlib.pyplot是繪製各類可視化圖形的命令字庫,相當於快捷方式
  4. Matplotlib文檔完備,並且gallery頁面中有上百幅縮略圖,打開之後有源代碼。如果需要繪製某種類型的圖,只需要在這個頁面上瀏覽、複製、粘貼一下,大多都能夠通過修改數據和設置搞定

Gallery

快速繪圖

  1. Matplotlib中的快速繪圖的函數庫可以通過import語句導入
  2. 調用figure創建一個繪圖對象,並且使它成爲當前的繪圖對象
  3. 通過figure參數可以指定繪圖對象的寬度和高度,單位爲英寸;dpi參數指定繪圖對象的分辨率,即每英寸可以多少個像素,缺省值爲80
  4. 也可以不創建繪圖對象直接調用plot函數直接繪圖,Matplotlib會自動創建一個繪圖對象
  5. 如果需要同時繪製多幅圖標的話,可以給figure傳遞一個整數參數指定圖標的序號,如果所指定序號的繪圖對象已經存在的話,將不創建新的對象,而只是讓它成爲當前繪圖對象
  6. plot函數的調用方式很靈活,使用關鍵字參數指定各種屬性(label:給所繪製的曲線一個名字,此名字在圖示(legend)中顯示。color:指定曲線的顏色。linewidth:指定曲線的寬度。參數"b--":指定曲線的顏色和線型)
  7. plt.xlabel/ylabel:設置X軸/Y軸的文字
  8. plt.title:設置圖標的標題
  9. plt.ylim:設置Y軸的範圍
  10. plt.legend:圖例圖示
  11. plt.show():顯示出創建的所有繪圖對象
  12. plt.savefig()將當前的figure對象保存成圖像文件,圖像格式由圖像文件的擴展名決定
import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(0,10,100)
y=np.sin(x)
z=np.cos(x**2)

plt.plot(x,y,"r-",label="$sin(x)$",linewidth=2)
plt.plot(x,y,"b--",label="$cos(x^2)$")

plt.xlabel("Times(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")
plt.legend()

plt.show()

折線圖

折線圖:通常用來表示數據隨時間或有序類別變化的趨勢

簡單折線圖

import matplotlib.pyplot as plt
data=[1,2,3,4,5,6,7,8,9,1,2,4,5,7,9]
#隨意創建的數據
plt.plot(data)
#引用Matplotlib庫中的pyplot模塊繪圖
plt.show()
  • plot()函數的第一個參數表示橫座標數據
  • 第二個表示縱座標數據
  • 第三個表示顏色、線型和標記樣式
  • 顏色常用的值有(r/g/b/c/m/y/k/w)
  • 線型常用的值(-/--/:/-.)
  • 標記樣式常用的值有(./,/o/v/^/s/*/D/d/x/</>/h/H/1/2/3/4/_/|)
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

yy=[1,2,3,4,5,3,1,2,7,8]#隨便創建的數據
xx=[3,5,4,1,9,3,2,5,6,3]
zz=[2,2,4,7,4,8,2,4,5,6]
plt.plot(yy,color='r',linewidth=5,linestyle=':',label='Data 1')
plt.plot(xx,color='g',linewidth=2,linestyle='--',label='Data 2')
plt.plot(zz,color='b',linewidth=0.5,linestyle='-',label='Data 3')
plt.legend(loc=2)
plt.xlabel('X軸名稱',fontproperties='simhei')
plt.ylabel('y軸名稱',fontproperties='simhei')
plt.title('折線圖美化實例',fontproperties='simhei')
plt.ylim(0,10)
plt.show()

散點圖

10個位置隨機散點圖

#10個點位置隨機散點圖
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
plt.scatter(x,y)
plt.show()

10個點隨機大小 

#10個點隨機大小
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
size=(30*np.random.rand(N))**2
plt.scatter(x,y,s=size)
plt.show()

更改散點顏色、透明度 

#更改散點顏色、透明度:顏色隨機,透明度爲0.5
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
size=(30*np.random.rand(N))**2
color=np.random.rand(N)
plt.scatter(x,y,s=size,c=color,alpha=0.5)
plt.show()

更改散點形狀 

#更改散點形狀,點形狀改爲上三角
import matplotlib.pyplot as plt
import numpy as np

N=10
x=np.random.rand(N)
y=np.random.rand(N)
size=(30*np.random.rand(N))**2
color=np.random.rand(N)
plt.scatter(x,y,s=size,c=color,alpha=0.5,marker="^")
plt.show()

一張圖繪製兩組數據 

#一張圖繪製兩組數據
import matplotlib.pyplot as plt
import numpy as np

N=10
x1=np.random.rand(N)
y1=np.random.rand(N)

x2=np.random.rand(N)
y2=np.random.rand(N)

plt.scatter(x1,y1,alpha=0.5,marker="^")
plt.scatter(x2,y2,alpha=0.5,marker="s")
plt.show()

爲散點圖增加圖例 

#爲散點圖增加圖例
import matplotlib.pyplot as plt
import numpy as np

N=10
x1=np.random.rand(N)
y1=np.random.rand(N)

x2=np.random.rand(N)
y2=np.random.rand(N)

plt.scatter(x1,y1,alpha=0.5,marker="^",label='triangle')
plt.scatter(x2,y2,alpha=0.5,marker="s",label="circle")
plt.legend(loc="best")#自己選擇圖例在合適的位置
plt.show()

柱狀圖

  1. 使用Matplotlib提供的bar()函數來繪製柱狀圖
  2. 與plot()函數類似,程序每次調用bar()函數時都會生成一組柱狀圖,如果希望生成多組柱狀圖,則可通過多次調用bar()函數來實現
bar(x,height,width=0.8,*,align='center',**kwargs)
  • x:包含所有柱子的下標的列表
  • height:y軸的數值序列,也是柱狀圖的高度,一般就是我們需要展示的數據
  • width:爲柱狀圖的寬度,一般爲0.8即可
  • align:柱子對齊方式,center和edge。center表示每根柱子是根據下標來對齊,edge則表示每根柱子全部以下標爲起點,然後顯示到下標的右邊。如果不指定該參數,默認值是center。
  • color:每根柱子呈現的顏色,可指定一個固定的顏色或者一個列表
  • edgecolor:每根柱子邊框的顏色
  • linewidth:每根柱子的邊框寬度。如果沒有設置該參數,默認無邊框
  • tick_label:每根柱子上顯示的標籤,默認無標籤
  • xerr:每根柱子頂部在橫軸方向的線段長度
  • yerr:每根柱子頂端在縱軸方向的線段長度
  • ecolor:設置xerr和yerr的線段的顏色,可以指定一個固定值或者一個列表

簡單柱狀圖

#簡單柱狀圖
import matplotlib.pyplot as plt
num_list=[1.5,0.6,7.8,6]
plt.bar(range(len(num_list)),num_list)
plt.show()

設置柱子顏色 

#設置柱子的顏色
import matplotlib.pyplot as plt
num_list=[1.5,0.6,7.8,6]
plt.bar(range(len(num_list)),num_list,color='crgb')
plt.show()

設置標籤 

#設置標籤
import matplotlib.pyplot as plt
name_list=['Monday','Tuesday','Wednesday','Thursday']
num_list=[1.5,0.6,7.8,6]
plt.bar(range(len(num_list)),num_list,color='crgb',tick_label=name_list)
plt.show()

堆疊柱狀圖 

#堆疊柱狀圖
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Wednesday','Thursday']
num_list = [1.5,0.6,7.8,6]
num_list2 = [1,2,1,2]
plt.bar(range(len(num_list)),num_list,color='c',tick_label=name_list,label='boys')
plt.bar(range(len(num_list)),num_list2,color='m',tick_label=name_list,bottom=num_list,label='girls')
#bottom在第一個柱狀圖的基礎
plt.legend()
plt.show()

橫向柱狀圖 

#橫向柱狀圖
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Wednesday','Thursday']
num_list = [1.5,0.6,7.8,6]
num_list2 = [1,2,1,2]
plt.barh(range(len(num_list)),num_list,color='c',tick_label=name_list,label='boys')
plt.barh(range(len(num_list)),num_list2,color='m',tick_label=name_list,label='girls')
#bottom在第一個柱狀圖的基礎
plt.legend()
plt.show()

並列柱狀圖 

#並列柱狀圖
import matplotlib.pyplot as plt
name_list = ['Monday','Tuesday','Wednesday','Thursday']
num_list = [1.5,0.6,7.8,6]
num_list2 = [1,2,1,2]
x=list(range(len(num_list)))
total_width=0.8
n=2
width=total_width/2
plt.bar(x,num_list,color='c',tick_label=name_list,width=width,label='boys')
for i in range(len(x)):
    x[i]=x[i]+width
plt.bar(x,num_list2,color='m',tick_label=name_list,width=width,label='girls')
#bottom在第一個柱狀圖的基礎
plt.legend(loc='best')
plt.show()

餅狀圖

  • 餅狀圖顯示一個系列中各項的大小與各項總和的比例
  • 餅狀圖可自動根據數據的百分比畫餅

繪製餅狀圖的基本語法:

  1. 創建數組x的餅圖,每個楔形的面積由x/sum(x)決定;
  2. 若sum(x)<1,則x數組不會被標準化,x值即爲楔形區域面積佔比。注意,該種情況會出現1-sum(x)的空楔形
  3. 若sum(x)>1,則由x[i]/sum(x)算出每個楔形佔比,餅圖360°區域均被填充
  4. pie函數精講
def pie(x, explode=None, labels=None, colors=None, autopct=None,
        pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
        radius=None, counterclock=True, wedgeprops=None, textprops=None,
        center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)
  • x:(創建餅狀圖的數據,每一塊)的比例,如果sum(x)>1會使用sum(x)歸一化;
  • explode:(每一塊)離開中心距離,一個list或數組
  • labels:list、optional、default:none;爲每個楔形添加標籤
  • color:array-like,optional,default:none;若無,則用currently active cycle中的顏色添加
  • autopct:控制餅圖內百分比設置,可以使用format字符串或者format function:可以是整數('%d%%')、浮點數('%1.3f%%')、字符串('%s%%')、函數。
  • label distance:float,optional,default:1.1;label標記的繪圖位置,相對於半徑的比例,默認值爲1.1,如<1則繪製餅圖內側
  • pctdistance:float,optional,default:0.6;類似於labeldistance,指定autopct的位置刻度,默認值爲0.6
  • shadow:bool、optional、default:False;爲餅圖圖畫陰影(True)
  • startangle:float,optional,default:none;起始繪製角度,默認圖是從x軸正方向逆時針畫起,如設定=90則從y軸正方向畫起
  • radius:float,optional,default:none;餅圖的半徑,若爲none時,則默認爲1
  • counterclock:bool、optional、default:True;指定分數方向,逆時針True或順時針
  • wedgeprops:dict,optional,default:none;描述楔形邊界線寬度值,參數形式“wedgeprops={‘linewidth’:3}”楔形邊界線寬度爲3
  • textprops:dict、optional,default:none;傳遞給文本對象的字典參數
  • center:list of float,optional,default:(0,0);圖標的中心爲,默認(0,0),也可以是兩個標量的序列(sequence of 2 scalars)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
plt.pie(sizes,labels=labels)
plt.title('簡單餅狀圖')
plt.show()

一塊餅圖到中心的距離 

#explode參數:一塊餅圖到中心的距離,默認位0
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
#explode參數:一塊餅圖到中心的距離
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode)
plt.title('簡單餅狀圖')
plt.show()

 標註每塊餅圖的顏色 

#colos:數組,可選參數,默認爲none;用來標註每塊餅圖的Matplotlib顏色參數序列
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
color=['r','k','g','m']
#explode參數:一塊餅圖到中心的距離
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color)
plt.title('簡單餅狀圖')
plt.show()

控制餅圖內百分比設置 

#autopct:控制餅圖內百分比設置,可以使用format字符串或者format function
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[10,10,10,10]
color=['r','c','g','m']
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color,autopct='%1.1f%%')
plt.title('簡單餅狀圖')
plt.show()
#x:每一塊餅圖的比例,爲必填項,如果sum(x)>1,會將多餘的部分進行均分
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[0.1,0.2,0.3,0.2]
color=['r','c','g','m']
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color,autopct='%1.1f%%')
plt.title('簡單餅狀圖')
plt.show()

添加圖例 

#添加圖例,ply.legend()
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
labels='A','B','C','D'
sizes=[0.1,0.2,0.3,0.2]
color=['r','c','g','m']
explode=(0,0,0.1,0)

plt.pie(sizes,labels=labels,explode=explode,colors=color,autopct='%1.2f%%')
plt.title('簡單餅狀圖')
plt.legend(loc="upper right",fontsize=8,borderaxespad = 0.3)
plt.show()

雷達圖

  • 雷達圖(Rader Chart),又可稱爲戴布拉圖、蜘蛛網圖(Spider Chart),可以很好的刻畫出某些指標的橫向或縱向的對比關係
  • 雷達圖常用於對比項指標的全面分析
  • Python中用Matplotlib模塊繪製雷達圖需要用到極座標系

polar函數

import numpy as np
import matplotlib.pyplot as plt
plt.polar(0.25*np.pi,20,'ro',lw=2)
plt.ylim(0,50)
plt.show()
#0.25*np.pi:極角
#20:極徑
#‘ro’:繪極座標形狀爲紅色圓點
#lw=2:極座標圖形寬度爲2

如果繪製多個極角和極軸

import numpy as np
import matplotlib.pyplot as plt
theta=np.array([0.25,0.5,0.75,1,1.25,1.5,1.75,2])
r=[75,60,50,70,50,85,45,70]
plt.polar(theta*np.pi,r,'cs',lw=2)
plt.ylim(0,100)
#設置y軸的範圍
plt.show()
#0.25*np.pi:極角
#20:極徑
#‘ro’:繪極座標形狀爲紅色圓點
#lw=2:極座標圖形寬度爲2

閉合曲線

#閉合曲線:多構造一個極座標點,和第一個點重疊
import numpy as np
import matplotlib.pyplot as plt
theta=np.array([0.25,0.5,0.75,1,1.25,1.5,1.75,2,0.25])
r=[75,60,50,70,50,85,45,70,75]
#最後一個極座標與第一個參數相同
plt.polar(theta*np.pi,r,'cs--',lw=2)
plt.ylim(0,100)
#設置y軸的範圍
plt.show()
#0.25*np.pi:極角
#20:極徑
#‘ro’:繪極座標形狀爲紅色圓點
#lw=2:極座標圖形寬度爲2

Fill()函數填充雷達圖

#fill()函數填充雷達圖
import numpy as np
import matplotlib.pyplot as plt
theta=np.array([0.25,0.5,0.75,1,1.25,1.5,1.75,2,0.25])
r=[75,60,50,70,50,85,45,70,75]
#最後一個極座標與第一個參數相同
plt.polar(theta*np.pi,r,'cs--',lw=2)
plt.fill(theta*np.pi,r,facecolor='r',alpha=0.25)
#填充
plt.ylim(0,100)
#設置y軸的範圍
plt.show()
#0.25*np.pi:極角
#20:極徑
#‘ro’:繪極座標形狀爲紅色圓點
#lw=2:極座標圖形寬度爲2

學生成績清單雷達圖

#導入庫
import numpy as np
import matplotlib.pyplot as plt
#數據準備
courses=['Python','Java','C++',
         'C','PHP','R',]
scores=[10,20,30,40,50,60]
datalength=len(scores)
#等分圓,曲線閉合
angles=np.linspace(0,2*np.pi,datalength,endpoint=False)
scores.append(scores[0])
angles=np.append(angles,angles[0])
#繪圖
plt.polar(angles,scores,'rv--',lw=2)
#設置標籤
plt.thetagrids(angles*180/np.pi,courses,fontproperties='simhei')
#填充雷達圖
plt.fill(angles,scores,facecolor='c',alpha=0.3)

plt.show()

三維圖

  • Matplotlib支持一些基礎的三維圖表繪製,需要使用mpl_toolkits模塊
  • 在繪製三維圖形時,至少需要指定x、y、z三個座標軸的數據,然後再根據不同的圖形類型指定額外的參數設置圖形的屬性
plot_surface(X,Y,Z,*args,**kwargs)
  • 常用參數:
  • rstride和cstride分別控制x和y兩個方向的步長,這決定了曲面上每個面片的大小
  • color指定面片的顏色
  • cmap指定面片的顏色映射表

三維散點圖

p3d.Axes3D.scatter( xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True, 
                   *args, **kwargs )

p3d.Axes3D.scatter3D( xs, ys, zs=0, zdir=’z’, s=20, c=None, depthshade=True,
                   *args, **kwargs)
  • xs、ys、zs分別用來指定散點符號的x、y、z座標,如果同時爲標量則制定一個三點符號的座標,如果同時爲等長數組則指定一系列散點符號的座標
  • s用來指定散點符號的大小,可以是標量或與xs等長的數組

三維柱狀圖

bar3d(self, x, y, z, dx, dy, dz, color=None, zsort='average', shade=True, lightsource=None, \*args, \*\*kwargs)[source]
  • x、y、z分別用來表示每個柱底面的座標,如果這三個參數都是標量則指定一個柱的底面座標、如果是三個等長的數組則指定多個柱的底面座標
  • dx、dy、dz分別用來指定柱在三個座標軸上的跨度,即x方向的寬度、y方向的厚度和z方向的高度
  • color用來指定柱的表面顏色
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()
ax=fig.gca(projection='3d')

#測試數據
theta=np.linspace(-4*np.pi,4*np.pi,100)
z=np.linspace(-4,4,100)*0.3
r=z**4+1
x=r*np.sin(theta)
y=r*np.cos(theta)

ax.plot(x,y,z,'b^-',label='3D Picture Test')
mpl.rcParams['legend.fontsize']=20
ax.legend(loc='best')
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章