Python數據分析案例 | Matplotlib圖像繪製

2022-01-25 溫小語
在之前的文章中有提到過,Matlotlib只需幾行代碼即可生成繪圖,條形圖、散點圖、箱線圖、折線圖、直方圖等。那麼,今天用幾個案例介紹一下如何通過Matplotlib庫繪製圖像。本文內容比較長,建議一邊看一邊對照代碼進行實操。

在進入圖表繪製前,先看一下pyplot的基礎圖標函數:

本文將結合這些函數,一一講解下列圖形的繪製:

注意:本文所涉及的原始數據表格可通過公眾號後臺回復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')df

df.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 plt

2、虛擬數據準備

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()

相關焦點

  • matplotlib繪製數學函數
    本文主要通過繪製數學函數,從而學習matplotlib圖形的坐標軸、圖例、畫布等各個選項的設置。導入matplotlib繪圖庫,一般情況下,不用import整個matplotlib模塊,只需要調用pyplot模塊。
  • Python中使用matplotlib繪製灰度直方圖
    灰度直方圖在數據統計分析、圖像處理中有著比較廣泛的應用,下面就介紹一下如何在Python中使用matplotlib來繪製灰度直方圖。
  • 從零開始學Python數據分析【16】-- matplotlib(雷達圖)
    【1】--數據類型及結構從零開始學Python數據分析【2】-- 數值計算及正則表達式從零開始學Python數據分析【3】-- 控制流與自定義函數從零開始學Python數據分析【4】-- numpy從零開始學Python數據分析【5】-- pandas(序列部分)從零開始學Python數據分析【6】-- pandas(數據框部分01)
  • Python-matplotlib 學術柱狀圖繪製
    黑灰顏色或者黑白陰影的柱狀圖或者條形圖,下面就具體介紹使用Python-matplotlib 的實現過程。matplotlib繪製這種柱狀圖或者條形圖還是比較簡單的,主要涉及的知識點就是ax.bar()方法的應用,首先進行黑灰顏色柱狀圖的繪製,具體代碼如下:plt.rcParams['font.family'] = ['Times New Roman']fig,ax = plt.subplots(1,1,figsize=(7,4.5),dpi=200
  • Python數據分析之matplotlib作圖
    繪製簡單的折線圖下面我們來使用前面介紹過的matplotlib庫繪製一個簡單的折線圖,再對其進行定製,以實現信息更豐富的數據可視化,我們將使用平方數序列1、4、9、16和25來繪製這個圖表。只需向matplotlib提供如下數字,matplotlib就能完成其他的工作:我們首先導入了模塊pyplot,並給它指定了別名plt,以免反覆輸入pyplot。在線示例大都能夠這樣做,我們在這裡也採取這種方法。模塊pyplot包含了很多用於生成圖表的函數。
  • 【數據分析】Matplotlib
    Matplotlib是一個強大的Python繪圖和數據可視化的工具包。數據可視化也是我們數據分析的最重要的工作之一,可以幫助我們完成很多操作,例如:找出異常值、必要的一些數據轉換等。完成數據分析的最終結果也許就是做一個可交互的數據可視化。
  • Python 數據分析:Matplotlib 繪圖
    簡介Matplotlib 是 Python 提供的一個繪圖庫,通過該庫我們可以很容易的繪製出折線圖、直方圖、散點圖、餅圖等豐富的統計圖,安裝使用 pip install matplotlib 命令即可,Matplotlib 經常會與 NumPy 一起使用。
  • 從零開始學Python數據分析【15】-- matplotlib(散點圖)
    【1】--數據類型及結構從零開始學Python數據分析【2】-- 數值計算及正則表達式從零開始學Python數據分析【3】-- 控制流與自定義函數從零開始學Python數據分析【4】-- numpy從零開始學Python數據分析【5】-- pandas(序列部分)從零開始學Python數據分析【6】-- pandas(數據框部分01)
  • Matplotlib數據可視化!
    Matplotlib是一個Python 2D繪圖庫(使用Matplotlib發布的mpl_toolkits庫可以畫3D圖形 ),能夠以多種硬拷貝格式和跨平臺的交互式環境生成出版物質量的圖形,用來繪製各種靜態,動態,交互式的圖表。
  • Python Matplotlib入門學習(一)
    ,各行各業都會遇到與數據相關的行業,所以數據可視化過程是理解數據必不可少的部分,今天就帶大家通過matplotlib的官方文檔帶領大家學習如何進行基本繪圖。當然我們擁有了畫板後,在畫板上進行函數圖的繪製,第一步就是繪製坐標軸,沒錯,matplotlib.pyplot.axes()函數就是為了畫坐標軸而準備的函數,同樣我們看看官方文檔給出的函數用法。
  • 如何用matplotlib繪圖呢?
    什麼是matplotlib?使用過python做數據分析的小夥伴都知道,matplotlib是一款命令式、較底層、可定製性強、圖表資源豐富、簡單易用、出版質量級別的python 2D繪圖庫。matplotlib算是python繪圖的元老級庫,類似程式語言裡的C語言。很多其它的python繪圖庫是基於matplotlib開發的,比如seaborn、ggplot、plotnine、holoviews、basemap等。matplotlib可用於python腳本、python shell、jupyter notebook、web等。
  • Python數據可視化——matplotlib使用
    >matplotlib的圖像都位於figure對象中,相當於一塊畫布。%matplotlib inlineimport matplotlib.pyplot as pltfrom numpy.random import randnimport numpy as npfig=plt.figure()ax1=fig.add_subplot
  • Python-Matplotlib: 官方學習手冊獲取與學習
    此外,matplotlib還有一個基於圖像處理庫(如開放圖形庫OpenGL)的pylab接口,其設計與MATLAB非常類似--儘管並不怎麼好用。SciPy就是用matplotlib進行圖形繪製。matplotlib最初由John D. Hunter撰寫,它擁有一個活躍的開發社區,並且根據BSD樣式許可證分發。在John D.
  • Python-matplotlib: 散點圖的繪製
    ,所使用的數據關於全球教育水平劃分的師生比例,涉及到的包主要為matplotlib和seaborn,當然用於數據處理分析的pandas和 numpy也必不可少。本文涉及的數據主要包括兩種,一種為全球各大洲的網格數據,用於繪製另類散點圖例,一種為全球各州的教育水平的師生比例,用於散點圖的繪圖。各大洲的網格數據如下(部分):如紅框所示,為所需要的數據,用於繪圖。
  • python使用matplotlib畫動態圖
    matplotlib是python的核心繪圖庫,是python的一個開源項目,旨在為python提供一個繪圖庫。matplotlib與numpy組合是一種可行的matlab替代方案。在可視化中matplotlib是最常使用的工具,是對數據整體判斷、效果預測不可或缺的重要模塊。
  • 高效使用 Python 可視化工具 Matplotlib
    此外,許多python的高級軟體包,如seaborn和ggplot都依賴於matplotlib。因此,了解這些基礎知識後再學那些功能更強大的框架會容易一些。最後,我不是說你應該避免選擇例如ggplot(aka ggpy),bokeh,plotly或者altair等其他更好的工具。我只是認為你需要從對matplotlib + pandas + seaborn 有一個基本了解開始。
  • 這麼用MatPlotLib視覺化呈現數據,你值得擁有!
    數據科學中的數據視覺化眾所周知,人腦更易於理解圖像。因此有句俗語說:一圖勝千言。而這完全適用於數據科學,因為其需要分析大量視覺化呈現的數據以推演數據模型。數據視覺化是數據科學領域的一項技術,可使你講出具有信服力的故事,通過易於理解、模擬化的方式將數據和分析結果視覺化呈現。
  • python數據科學系列:matplotlib入門詳細教程
    與之齊名,matplotlib作為數據科學的的另一必備庫,算得上是python可視化領域的元老,更是很多高級可視化庫的底層基礎,其重要性不言而喻。本篇對matplotlib進行系統性介紹,不會面面俱到,但求體系完備、詳略得當。
  • Python數據分析利器:matplotlib超詳細基礎介紹!!!
    ,會讓你的數據分析等工作錦上添花,讓人印(升)象(職)深(加)刻(薪)。matplotlib是python優秀的數據可視化庫,python數據分析必備利器,本文專門為你整理了matplotlib詳細使用方法,來學習吧!--- 以下是正文 ---數據可視化非常重要,因為錯誤或不充分的數據表示方法可能會毀掉原本很出色的數據分析工作。
  • 從零開始學Python數據分析【14】-- matplotlib(折線圖)
    作者:劉順祥個人微信公眾號:每天進步一點點2015前文傳送門:從零開始學Python數據分析