本文將結合這些函數,一一講解下列圖形的繪製:
注意:本文所涉及的原始數據表格可通過公眾號後臺回復python2獲取。
一、餅圖
餅圖能夠直觀地顯示每部分的比例。用plt.pie()函數進行繪製:
案例1:
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs, 'Logs'sizes = [15, 30, 45, 10] explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)plt.axis('equal')plt.show()
案例2:
import matplotlib.pyplot as pltactivities = ['sleep','eat','work','leisure']slices = [7,2,2,13]cols = ['c','m','r','b']plt.pie(slices,labels=activities, colors=cols, startangle=90, shadow= True, explode=(0,0.1,0,0), autopct='%1.1f%%') plt.title('my day')plt.show()二、散點圖
1、用途
散點圖主要用於二維數據可視化,通常用於比較兩個變量來尋找相關性或分組。因變量隨自變量而變化的大致趨勢,據此可以選擇合適的函數對數據點進行擬合。
import numpy as npimport matplotlib.pyplot as plt
fig, ax=plt.subplots()ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')ax.set_title('Simple Scatter')
plt.show()2、scatter函數的參數解讀
matplotlib模塊中scatter函數語法及參數含義:
plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None)s:指定散點圖點的大小,默認為20,通過傳入新的變量,實現氣泡圖的繪製;cmap:指定色圖,只有當c參數是一個浮點型的數組的時候才起作用;norm:設置數據亮度,標準化到0~1之間,使用該參數仍需要c為浮點型的數組;vmin、vmax:亮度設置,與norm類似,如果使用了norm則該參數無效;3、案例
(1)一般散點圖的繪製
案例:汽車速度與剎車距離的關係,表格cars
# 導入模塊
import pandas as pdimport matplotlib.pyplot as plt%matplotlib inline# 設置繪圖風格
# 設置中文編碼和負號的正常顯示
plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = False# 讀入數據
f = open('cars.csv')cars = pd.read_csv(f)# 繪圖
plt.scatter(cars.speed, cars.dist, s = 30, c = 'steelblue', marker = 's', alpha = 0.9, linewidths = 0.3, edgecolors = 'red' )# 添加軸標籤和標題
plt.title('汽車速度與剎車距離的關係')plt.xlabel('汽車速度')plt.ylabel('剎車距離')# 去除圖邊框的頂部刻度和右邊刻度
plt.tick_params(top = 'off', right = 'off')# 顯示圖形
這樣一張簡單的散點圖就呈現出來了,很明顯的發現,汽車的剎車速度與剎車距離存在正相關關係,即隨著速度的增加,剎車距離也在增加。
(2)分組散點圖的繪製
案例:iris數據集,表格iris
# 讀取數據
f = open('iris.csv')iris = pd.read_csv(f)# 自定義顏色
colors = ['steelblue', '#9999ff', '#ff9999']# 三種不同的花品種
Species = iris.Species.unique()# 通過循環的方式,完成分組散點圖的繪製
for i in range(len(Species)): plt.scatter(iris.loc[iris.Species == Species[i], 'Petal.Length'], iris.loc[iris.Species == Species[i], 'Petal.Width'], s = 35, c = colors[i], label = Species[i])# 添加軸標籤和標題
plt.title('花瓣長度與寬度的關係')plt.xlabel('花瓣長度')plt.ylabel('花瓣寬度')# 去除圖邊框的頂部刻度和右邊刻度
plt.tick_params(top = 'off', right = 'off')# 添加圖例
plt.legend(loc = 'upper left')# 顯示圖形
從圖中可以發現,三種花的花瓣長度與寬度之間都存在正向的關係,只不過品種setasa的體型比較小,數據點比較聚集。
三、箱線圖
1、用途
箱線圖一般用來展現數據的分布(如上下四分位值、中位數等),同時,也可以用箱線圖來反映數據的異常情況。繪圖之前,我們先來講解一下matplotlib包中boxplot函數的參數含義及使用方法:
plt.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)notch:是否是凹口的形式展現箱線圖,默認非凹口;vert:是否需要將箱線圖垂直擺放,默認垂直擺放;whis:指定上下須與上下四分位的距離,默認為1.5倍的四分位差;positions:指定箱線圖的位置,默認為[0,1,2…];meanline:是否用線的形式表示均值,默認用點來表示;showcaps:是否顯示箱線圖頂端和末端的兩條線,默認顯示;boxprops:設置箱體的屬性,如邊框色,填充色等;labels:為箱線圖添加標籤,類似於圖例的作用;filerprops:設置異常值的屬性,如異常點的形狀、大小、填充色等;medianprops:設置中位數的屬性,如線的類型、粗細等;meanprops:設置均值的屬性,如點的大小、顏色等;capprops:設置箱線圖頂端和末端線條的屬性,如顏色、粗細等;whiskerprops:設置須的屬性,如顏色、粗細、線的類型等;3、箱線圖的繪製
案例:titanic年齡箱線圖,表格titanic_train
(1)整體乘客的年齡箱線圖
# 導入第三方模塊
import pandas as pdimport matplotlib.pyplot as plt%matplotlib inline# 讀取Titanic數據集
f = open('titanic_train.csv')titanic = pd.read_csv(f)# 不妨刪除含有缺失年齡的觀察
titanic.dropna(subset=['Age'], inplace=True)# 設置圖形的顯示風格
# 設置中文和負號正常顯示
plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = False# 繪圖:整體乘客的年齡箱線圖
plt.boxplot(x = titanic.Age, patch_artist=True, showmeans=True, boxprops = {'color':'black','facecolor':'#9999ff'}, flierprops = {'marker':'o','markerfacecolor':'red','color':'black'}, meanprops = {'marker':'D','markerfacecolor':'indianred'}, medianprops = {'linestyle':'--','color':'orange'})# 設置y軸的範圍
# 去除箱線圖的上邊框與右邊框的刻度標籤
plt.tick_params(top='off', right='off')# 顯示圖形
對於所有乘客而言,從圖中容易發現,乘客的平均年齡在30歲,有四分之一的人低於20歲,另有四分之一的人超過38歲,換句話說,有一半的人,年齡落在20~38歲之間;從均值(紅色的菱形)略高於中位數(黃色虛線)來看,說明年齡是有偏的,並且是右偏;同時,我們也會發現一些紅色的異常值,這些異常值的年齡均在64歲以上。
(2)不同等級倉的年齡箱線圖
# 按艙級排序,為了後面正常顯示分組盒形圖的順序
titanic.sort_values(by = 'Pclass', inplace=True)# 通過for循環將不同倉位的年齡人群分別存儲到列表Age變量中
Age = []Levels = titanic.Pclass.unique()for Pclass in Levels: Age.append(titanic.loc[titanic.Pclass==Pclass,'Age'])# 繪圖
plt.boxplot(x = Age, patch_artist=True, labels = ['一等艙','二等艙','三等艙'], showmeans=True, boxprops = {'color':'black','facecolor':'#9999ff'}, flierprops = {'marker':'o','markerfacecolor':'red','color':'black'}, meanprops = {'marker':'D','markerfacecolor':'indianred'}, medianprops = {'linestyle':'--','color':'orange'})# 顯示圖形
如果對人群的年齡按不同的艙位來看,我們會發現一個明顯的趨勢,就是艙位等級越高的乘客,他們的年齡越高,三種艙位的平均年齡為38、30和25,說明年齡越是偏大一點,他們的經濟能力會越強一些,所買的艙位等級可能就會越高一些。同時,在二等艙和三等艙內,乘客的年齡上存在一些異常用戶。
四、折線圖
1、用途
折線圖主要是看內容隨時間變化的趨勢情況。
2、案例
(1)用戶分析,表格 user_analysis
import pandas as pdimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falsedf = pd.read_excel(r'user_analysis.xlsx')dfdf.dropna(axis=0)fig = plt.figure(figsize=(8,4))plt.plot(df['時間'], df['新關注人數'], )plt.title('公眾號每天新增用戶數')plt.xlabel('日期')plt.ylabel('新增人數')fig.autofmt_xdate(rotation = 45)plt.show()、
#一張圖上多個折線圖
fig = plt.figure(figsize=(8,4))plt.style.use('seaborn')plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falseplt.plot( df['新關注人數'], marker = 'o', markersize = 5, markerfacecolor='mediumpurple' )plt.plot( df['取消關注人數'], marker = 'o', markersize = 5, markerfacecolor='orangered' )plt.title('公眾號關注情況')plt.xlabel('日期')plt.ylabel('新增人數')fig.autofmt_xdate(rotation = 45)plt.legend()plt.show()#一張圖上多個折線圖
fig = plt.figure(figsize=(8,4))plt.style.use('seaborn')plt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falseplt.plot( df['新關注人數'], )plt.plot( df['淨增關注人數'], )plt.title('公眾號每天新增用戶數')plt.xlabel('日期')plt.ylabel('新增人數')fig.autofmt_xdate(rotation = 45)plt.legend()plt.show()
五、直方圖
1、用途
直方圖主要反映一維數據分布情況。直方圖和條形圖長得很像,雖然很像,但是還是有些區別的,主要是以下三點:
(1)首先,條形圖是用條形的長度表示各類別頻數的多少或數值的大小,其寬度(表示類別)則是固定的;直方圖是用面積表示各組頻數的多少,矩形的高度表示每一組的頻數或頻率,寬度則表示各組的組距,因此其高度與寬度均有意義。(2)由於分組數據具有連續性,直方圖的各矩形通常是連續排列,而條形圖則是分開排列。(3)條形圖主要用於展示分類數據,而直方圖則主要用於展示數據型數據
了解了直方圖與條形圖的區別,那我們看看在Matplotlib裡如何繪製直方圖
x: 指定要繪製直方圖的數據;
bins:指定直方圖條形的個數;
range:指定直方圖數據的上下界,默認包含繪圖數據的最大值和最小值;
density:是否將直方圖的頻數轉換成頻率;
weights:該參數可為每一個數據點設置權重;
cumulative:是否需要計算累計頻數或頻率;
bottom:可以為直方圖的每個條形添加基準線,默認為0;
histtype:指定直方圖的類型,默認為bar,此外有barstacked, step, stepfilled;
align:設置條形邊界值的對齊方式,默認為mid,除此還有』left』和'right』;
orientation:設置直方圖的擺放方向,默認為垂直方向;
rwidth:設置直方圖條形寬度的百分比;
align:設置條形邊界值的對齊方式,默認為mid,除此還有left和'right』;
orientation:設置直方圖的擺放方向,默認為垂直方向;
rwidth:設置直方圖條形寬度的百分比;
log:是否需要對繪圖數據進行log變換;
color:設置直方圖的填充色;
label:設置直方圖的標籤,可通過legend展示其圖例
2、直方圖的繪製
案例1:年齡分布直方圖
population_ages = [22,55,62,45,21,22,34,42,42,4,99,42,60,70,31,32,20,41,45,52,80,75,65,54,44,43,42,48]bins = [20,30,40,50,60,70,80,90,100]import matplotlib.pyplot as pltplt.hist(population_ages,bins=bins, color = 'steelblue', edgecolor = 'k', density=False,weights=None,cumulative=False,histtype='bar',align='mid',orientation='vertical')plt.xlabel('年齡範圍') plt.ylabel('數量') plt.legend(['年齡']) plt.title('年齡分布圖') plt.show()案例2:房價分布直方圖,表格house_data
import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_excel(r'house_data.xlsx')df.head()import matplotlib.pyplot as pltimport matplotlib%matplotlib inlineplt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falsedf['均價'].plot(kind='hist',color='violet',legend=True,edgecolor = 'b',title='上海徐匯區二手房均價分布直方圖')plt.xlabel('均價(元)')plt.ylabel('計數')Text(0,0.5,'計數')#繪製累積分布直方圖
alpha=0.4 df['均價'].plot(kind='hist',cumulative = True,legend=True,edgecolor = 'k',alpha=0.4,title='上海徐匯區二手房均價累積分布直方圖')plt.xlabel('均價(元)')plt.ylabel('計數')Text(0,0.5,'計數')六、條形圖
在matplotlib中,繪製條形圖使用的函數是bar,下面是bar函數的原型定義:
matplotlib.pyplot.bar(left,height,alpha=1,width=0.8color=,edgecolor=,1abe1=,1w=3)
left:x軸的位置序列,一般採用rangel函數產生一個序列,但是有時候可以是字符串
height:y軸的數值序列,也就是柱形圖的高度,一般就是我們需要展示的數據;
alpha:透明度,值越小越透明
width:為柱形圖的寬度,一般為0.8即可
color或facecolor:柱形圖填充的顏色;
edgecolor:圖形邊緣顏色
label:解釋每個圖像代表的含義,這個參數是為legend函數做鋪墊的,表示該次bar的標籤
import pandas as pdimport matplotlib.pyplot as pltdf = pd.read_excel('house_data.xlsx')df.head()import matplotlib.pyplot as pltimport matplotlib%matplotlib inlineplt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falsedf['地段'].value_counts().plot(kind='bar', legend=True,title='上海徐匯區二手房在售數量分布區域')、
import matplotlib.pyplot as pltimport matplotlib%matplotlib inlineplt.rcParams['font.sans-serif'] = 'SimHei'plt.rcParams['axes.unicode_minus'] = Falsedf['地段'].value_counts().plot(kind='barh', legend=True,title='上海徐匯區二手房在售數量分布區域')七、堆疊圖1、導入庫
import matplotlib.pyplot as plt2、虛擬數據準備
days = [1,2,3,4,5]sleeping = [7,8,6,11,7]eating = [2,3,4,3,2]working = [7,8,7,2,2]playing = [8,5,7,8,13]3、設置Label和顏色
plt.plot([],[],color='m', label='Sleeping', linewidth=5)plt.plot([],[],color='c', label='Eating', linewidth=5)plt.plot([],[],color='r', label='Working', linewidth=5)plt.plot([],[],color='k', label='Playing', linewidth=5)4、開始畫圖
plt.stackplot(days, sleeping,eating,working,playing, colors=['m','c','r','k'])plt.xlabel('第N天')plt.ylabel('時間花費')plt.title('時間花費堆疊圖')plt.show()八、3D圖from matplotlib import pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfig = plt.figure()ax = fig.add_subplot(111, projection='3d')X = [1, 1, 2, 2]Y = [3, 4, 4, 3]Z = [1, 2, 1, 1]ax.scatter(X, Y, Z)ax.plot_trisurf(X, Y, Z)plt.show()