Python數(shù)據(jù)可視化教程之Matplotlib實(shí)現(xiàn)各種圖表實(shí)例
前言
數(shù)據(jù)分析就是將數(shù)據(jù)以各種圖表的形式展現(xiàn)給領(lǐng)導(dǎo),供領(lǐng)導(dǎo)做決策用,因此熟練掌握餅圖、柱狀圖、線圖等圖表制作是一個(gè)數(shù)據(jù)分析師必備的技能。Python有兩個(gè)比較出色的圖表制作框架,分別是Matplotlib和Pyechart。本文主要講述使用Matplotlib制作各種數(shù)據(jù)圖表。
Matplotlib是最流行的用于繪制2D數(shù)據(jù)圖表的Python庫(kù),能夠在各種平臺(tái)上使用,可以繪制散點(diǎn)圖、柱狀圖、餅圖等。
1、柱狀圖
是一種以長(zhǎng)方形或長(zhǎng)方體的高度為變量的表達(dá)圖形的統(tǒng)計(jì)報(bào)告圖,由一系列高度不等的縱向條紋表示數(shù)據(jù)分布的情況,用來(lái)比較兩個(gè)或以上的價(jià)值(不同時(shí)間或者不同條件),只有一個(gè)變量,通常利用于較小的數(shù)據(jù)集分析。柱狀圖可以用來(lái)比較數(shù)據(jù)之間的多少,可以用來(lái)觀察某一事件的變化趨勢(shì),柱狀圖亦可橫向排列,或用多維方式表達(dá)。
實(shí)現(xiàn)代碼:
# 導(dǎo)入繪圖模塊
import matplotlib.pyplot as plt
# 構(gòu)建數(shù)據(jù)
sales = [7125,12753,13143,8635]
# 中文亂碼的處理,rcParams也可以用于設(shè)置圖的分辨率,大小等信息
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 繪圖,第一個(gè)參數(shù)是x軸的數(shù)據(jù),第二個(gè)參數(shù)是y軸的數(shù)據(jù),第三個(gè)參數(shù)是柱子的大小,默認(rèn)值是1(值在0到1之間),color是柱子的顏色,alpha是柱子的透明度
plt.bar(range(4), sales, 0.4,color='r', alpha = 0.8)
# 添加軸標(biāo)簽
plt.ylabel('銷量')
# 添加標(biāo)題
plt.title('水果2018年度銷量')
# 添加刻度標(biāo)簽
plt.xticks(range(4),['蘋(píng)果','香蕉','梨','獼猴桃'])
# 設(shè)置Y軸的刻度范圍
plt.ylim([5000,15000])
# 為每個(gè)條形圖添加數(shù)值標(biāo)簽
for x,y in enumerate(sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 顯示圖形
plt.show()
效果圖:

只需繪制柱狀圖的函數(shù)bar()改成barh()就可以將柱狀圖長(zhǎng)方形或長(zhǎng)方體從垂直方向變?yōu)樗椒较颉?br />
實(shí)現(xiàn)代碼:
# 導(dǎo)入繪圖模塊
import matplotlib.pyplot as plt
# 構(gòu)建數(shù)據(jù)
sales = [7125,12753,13143,8635]
# 中文亂碼的處理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['蘋(píng)果','香蕉','梨','獼猴桃']
# 繪圖
plt.barh(range(4), sales, 0.4,color='r', alpha = 0.8)
# 添加軸標(biāo)簽
plt.ylabel('銷量')
# 添加標(biāo)題
plt.title('水果2018年度銷量')
# 添加刻度標(biāo)簽
plt.yticks(range(4),['蘋(píng)果','香蕉','梨','獼猴桃'])
# 設(shè)置Y軸的刻度范圍
plt.xlim([5000,15000])
# 為每個(gè)條形圖添加數(shù)值標(biāo)簽
for x,y in enumerate(sales):
plt.text(y+0.2,x,'%s' %y,va='center')
# 顯示圖形
plt.show()
效果圖:

除了bar()函數(shù)變成barh()之外。還有其他幾個(gè)地方要做修改,在給每個(gè)條形圖添加數(shù)值標(biāo)簽時(shí),將ha='center'改為va='center',將添加x軸標(biāo)簽的方法從xlabel改為ylabel。
柱狀圖和折線圖混合使用
柱狀圖可以和折線圖混合使用,用來(lái)表示某一個(gè)數(shù)據(jù)的變化趨勢(shì),下面是例子的柱狀圖表示水果的年度銷量,折線圖表示水果1月份的銷量。
代碼:
# 導(dǎo)入繪圖模塊
import matplotlib.pyplot as plt
jan_sales = [3010,4029,5021,3056]
# 構(gòu)建數(shù)據(jù)
sales = [7125,12753,13143,8635]
# 中文亂碼的處理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['蘋(píng)果','香蕉','梨','獼猴桃']
plt.plot(x,jan_sales,'r')# 折線 1 x 2 y 3 color
plt.plot(x,jan_sales,'g',lw=5)# 4 line w
# 繪圖
plt.bar(range(4), sales, 0.4,color='b', alpha = 0.8)
# 添加軸標(biāo)簽
plt.ylabel('銷量')
# 添加標(biāo)題
plt.title('水果2018年度銷量')
# 添加刻度標(biāo)簽
plt.xticks(range(4),['蘋(píng)果','香蕉','梨','獼猴桃'])
# 設(shè)置Y軸的刻度范圍
plt.ylim([2000,15000])
# 為每個(gè)條形圖添加數(shù)值標(biāo)簽
for x,y in enumerate(sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 顯示圖形
plt.show()
效果圖:

2、折線圖
折線圖主要用于表示數(shù)據(jù)變化的趨勢(shì)。折線圖是直線將不同的點(diǎn)連接起來(lái)。
# 導(dǎo)入繪圖模塊
import matplotlib.pyplot as plt
#構(gòu)建數(shù)據(jù)
jan_sales = [3010,4029,5021,3056]
# 中文亂碼的處理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['蘋(píng)果','香蕉','梨','獼猴桃']
#第一個(gè)參數(shù)是x軸,第二參數(shù)時(shí)y軸數(shù)據(jù),第三個(gè)參數(shù)是線的顏色,第二個(gè)參數(shù)是線條的粗細(xì)
plt.plot(x,jan_sales,'r',lw=5)# 4 line w
# 添加標(biāo)題
plt.title('水果2018年度1月份銷量圖')
plt.ylim([2000,15000])
# 為每個(gè)點(diǎn)添加數(shù)值標(biāo)簽
for x,y in enumerate(jan_sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 顯示圖形
plt.show()
效果圖:

折線圖通過(guò)調(diào)用plot()方法繪制。
3、餅圖
餅圖主要是用來(lái)表示數(shù)據(jù)的占比,給人一眼就可以看出數(shù)據(jù)的占比大小。餅圖使用pie()函數(shù)繪制。
import matplotlib.pyplot as plt
# 設(shè)置繪圖的主題風(fēng)格(不妨使用R中的ggplot分隔)
plt.style.use('ggplot')
# 構(gòu)造數(shù)據(jù)
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['蘋(píng)果','香蕉','梨','獼猴桃','桔子']
explode = [0,0.1,0,0,0] # 用于突出顯示大專學(xué)歷人群
colors=['#FEB748','#EDD25D','#FE4F54','#51B4FF','#dd5555'] # 自定義顏色
# 中文亂碼和坐標(biāo)軸負(fù)號(hào)的處理
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 將橫、縱坐標(biāo)軸標(biāo)準(zhǔn)化處理,保證餅圖是一個(gè)正圓,否則為橢圓
plt.axes(aspect='equal')
# 控制x軸和y軸的范圍
plt.xlim(0,4)
plt.ylim(0,4)
# 繪制餅圖
plt.pie(x = edu,# 繪圖數(shù)據(jù)
explode=explode, # 突出顯示香蕉人群
labels=labels, # 添加水果銷量水平標(biāo)簽
colors=colors, # 設(shè)置餅圖的自定義填充色
autopct='%.1f%%', # 設(shè)置百分比的格式,這里保留一位小數(shù)
pctdistance=0.8,# 設(shè)置百分比標(biāo)簽與圓心的距離
labeldistance = 1.15, # 設(shè)置銷量水平標(biāo)簽與圓心的距離
startangle = 180, # 設(shè)置餅圖的初始角度
radius = 1.5, # 設(shè)置餅圖的半徑
counterclock = False, # 是否逆時(shí)針,這里設(shè)置為順時(shí)針?lè)较?
wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 設(shè)置餅圖內(nèi)外邊界的屬性值
textprops = {'fontsize':12, 'color':'k'}, # 設(shè)置文本標(biāo)簽的屬性值
center = (1.8,1.8), # 設(shè)置餅圖的原點(diǎn)
frame = 1)# 是否顯示餅圖的圖框,這里設(shè)置顯示
# 刪除x軸和y軸的刻度
plt.xticks(())
plt.yticks(())
# 添加圖標(biāo)題
plt.title('2018年水果銷量分析')
# 顯示圖形
plt.show()
效果圖:

簡(jiǎn)單介紹下pie函數(shù)參數(shù):
- x: 指定繪圖的數(shù)據(jù)
- explode:指定餅圖某些部分的突出顯示,即呈現(xiàn)爆炸式
- labels:為餅圖添加標(biāo)簽說(shuō)明,類似于圖例說(shuō)明
- colors:指定餅圖的填充色
- autopct:設(shè)置百分比格式,如'%.1f%%'為保留一位小數(shù)
- shadow:是否添加餅圖的陰影效果
- pctdistance:設(shè)置百分比標(biāo)簽與圓心的距離
- labeldistance:設(shè)置各扇形標(biāo)簽(圖例)與圓心的距離;
- startangle:設(shè)置餅圖的初始擺放角度, 180為水平;
- radius:設(shè)置餅圖的半徑大小;
- counterclock:是否讓餅圖按逆時(shí)針順序呈現(xiàn), True / False;
- wedgeprops:設(shè)置餅圖內(nèi)外邊界的屬性,如邊界線的粗細(xì)、顏色等, 如wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'}
- textprops:設(shè)置餅圖中文本的屬性,如字體大小、顏色等;
- center:指定餅圖的中心點(diǎn)位置,默認(rèn)為原點(diǎn)
- frame:是否要顯示餅圖背后的圖框,如果設(shè)置為True的話,需要同時(shí)控制圖框x軸、y軸的范圍和餅圖的中心位置;
4、散點(diǎn)圖
散點(diǎn)圖主要的作用是判斷兩個(gè)變量之間關(guān)系的強(qiáng)弱或者是否存在關(guān)系。
散點(diǎn)圖由scatter()方法繪制。
import numpy as np import matplotlib.pyplot as plt # 數(shù)據(jù)個(gè)數(shù) n = 50 # 均值為0, 方差為1的隨機(jī)數(shù) x = np.random.normal(0, 1, n) y = np.random.normal(0, 1, n) # 計(jì)算顏色值 color = np.arctan2(y, x) # 繪制散點(diǎn)圖 plt.scatter(x, y, s = 75, c = color, alpha = 0.5) # 設(shè)置坐標(biāo)軸范圍 plt.xlim((-1.5, 1.5)) plt.ylim((-1.5, 1.5)) # 不顯示坐標(biāo)軸的值 plt.xticks(([-1,0,1,2,3,4])) plt.yticks(([-1,0,1,2,3,4])) plt.show()
效果圖:

5、箱線圖
箱線圖一般用來(lái)展現(xiàn)數(shù)據(jù)大小、占比、趨勢(shì)等等的呈現(xiàn),其包含一些統(tǒng)計(jì)學(xué)的均值、分位數(shù)、極值等等統(tǒng)計(jì)量,因此,該圖信息量較大,不僅能夠分析不同類別數(shù)據(jù)平均水平差異(需在箱線圖中加入均值點(diǎn)),還能揭示數(shù)據(jù)間離散程度、異常值、分布差異等等。
使用boxplot()方法繪制。
import numpy as np import matplotlib.pyplot as plt import pandas as pd np.random.seed(2) #設(shè)置隨機(jī)種子 df = pd.DataFrame(np.random.rand(5,4), columns=['A', 'B', 'C', 'D'])#先生成0-1之間的5*4維度數(shù)據(jù),再裝入4列DataFrame中 df.boxplot() #也可用plot.box() plt.show()
效果圖:

6、雷達(dá)圖
雷達(dá)圖可以用來(lái)顯示一個(gè)周期數(shù)值的變化,也可以用來(lái)展示對(duì)個(gè)對(duì)象/維度之間的關(guān)系
import numpy as np
import matplotlib.pyplot as plt
#標(biāo)簽
labels = np.array(['語(yǔ)文','數(shù)學(xué)','英語(yǔ)','生物','物理','化學(xué)'])
#數(shù)據(jù)個(gè)數(shù)
dataLenth = 6
#數(shù)據(jù)
data = np.array([7,4,3,6,4,8])
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
data = np.concatenate((data, [data[0]])) # 閉合
angles = np.concatenate((angles, [angles[0]])) # 閉合
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)# polar參數(shù)??!
ax.plot(angles, data, 'bo-', linewidth=2)# 畫(huà)線
ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
ax.set_title("matplotlib雷達(dá)圖", va='bottom', fontproperties="SimHei")
ax.set_rlim(0,10)
ax.grid(True)
plt.show()
效果圖:

7、氣泡圖
氣泡圖用于判斷3個(gè)變量之間是否存在某種關(guān)系。它跟散點(diǎn)圖有點(diǎn)類似,只不過(guò)氣泡圖以氣泡大小作為新的維度
import pandas as pd
import matplotlib.pyplot as plt
import pandas as pd
d = {"時(shí)間":pd.Series([2006,2007,2008,2009,2010]),
"數(shù)量":pd.Series([10,200,120,150,300]),
"大小":pd.Series([50,130,40,50,160]),
"分類":pd.Series([1,2,0,1,2]),
"判斷":pd.Series([True,True,True,True,True])}
df=pd.DataFrame(d)
#先定義氣泡大小,rank 函數(shù)將大小列進(jìn)行大小分配,越大的值分配結(jié)果也越高
#n 為倍數(shù),用來(lái)調(diào)節(jié)氣泡的大小,且看后頭
size=df['大小'].rank()
n=20
#定義一個(gè)字典,將顏色跟對(duì)應(yīng)的分類進(jìn)行綁定
color={0:'red',1:'blue',2:'orange'}
#增加color的參數(shù),用列表解析式將data分類中的每個(gè)數(shù)據(jù)的數(shù)字映射到前面color的顏色中
plt.scatter(df['數(shù)量'],df['大小'],color=[color[i] for i in df['分類']],s=size*n,alpha=0.6)
plt.show()
效果圖:

氣泡圖用也是scatter方法繪制,和散點(diǎn)圖一樣。差別在于點(diǎn)的大小不一樣,散點(diǎn)圖的點(diǎn)都是一樣的,而氣泡圖點(diǎn)的大小不一樣。
以上就是柱狀圖、散點(diǎn)圖、氣泡圖、折線圖的實(shí)現(xiàn)方式。希望給大伙帶來(lái)幫助。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- python數(shù)據(jù)可視化之matplotlib.pyplot基礎(chǔ)以及折線圖
- Python 數(shù)據(jù)可視化之Matplotlib詳解
- Python利用matplotlib模塊數(shù)據(jù)可視化繪制3D圖
- Python數(shù)據(jù)可視化之使用matplotlib繪制簡(jiǎn)單圖表
- Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情
- python數(shù)據(jù)可視化matplotlib繪制折線圖示例
- Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
相關(guān)文章
python爬取天氣數(shù)據(jù)的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python爬取天氣數(shù)據(jù)的實(shí)例詳解內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2020-11-11
學(xué)習(xí)python處理python編碼問(wèn)題
概括從python開(kāi)始就處理unicode字符,python源文件的編碼與解碼,我們寫(xiě)的python程序從產(chǎn)生到執(zhí)行的過(guò)程如下2011-03-03
2020最新pycharm漢化安裝(python工程獅親測(cè)有效)
這篇文章主要介紹了2020最新pycharm漢化安裝(python工程獅親測(cè)有效),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
使用pyshp包進(jìn)行shapefile文件修改的例子
今天小編就為大家分享一篇使用pyshp包進(jìn)行shapefile文件修改的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
Python?Panda中索引和選擇?series?的數(shù)據(jù)
這篇文章主要介紹了Python?Panda中索引和選擇series的數(shù)據(jù),文章通過(guò)圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Python 剪繩子的多種思路實(shí)現(xiàn)(動(dòng)態(tài)規(guī)劃和貪心)
這篇文章主要介紹了Python 剪繩子的多種思路實(shí)現(xiàn)(動(dòng)態(tài)規(guī)劃和貪心),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
python 用遞歸實(shí)現(xiàn)通用爬蟲(chóng)解析器
這篇文章主要介紹了python 用遞歸實(shí)現(xiàn)通用爬蟲(chóng)解析器的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
使用Python實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音并生成wav文件的例子
今天小編就為大家分享一篇使用Python實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音并生成wav文件的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

