Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情
簡(jiǎn)述
mat參照了函數(shù)設(shè)計(jì),plot表示繪圖的作用,lib則表示一個(gè)集合。今年在開源社區(qū)的推動(dòng)下,Matplotlib在科學(xué)計(jì)算領(lǐng)域得到了廣泛的應(yīng)用,成為Python中應(yīng)用非常廣的繪圖工具之一。其中Matplotlib應(yīng)用最廣的是matplotlib.pyplot模塊。
matplotlib.pyplot是一個(gè)命令風(fēng)格函數(shù)的集合,使得Matplotlib的機(jī)制更像MATLAB。每個(gè)繪圖函數(shù)都可對(duì)圖形進(jìn)行一些修改,如創(chuàng)建圖形,在圖形中創(chuàng)建繪圖區(qū)域,在繪圖區(qū)域繪制一些線條,使用標(biāo)簽裝飾繪圖等。在pyplot中,各種狀態(tài)跨函數(shù)調(diào)用保存,以便跟蹤諸如當(dāng)前圖形和繪圖 區(qū)域之類的東西,并且繪圖函數(shù)始終指向當(dāng)前軸域。本章以pyplot為基礎(chǔ)介紹和展開學(xué)習(xí)。
學(xué)習(xí)目標(biāo) :
- 掌握pyplot常用的繪圖參數(shù)的調(diào)節(jié)方法掌
- 握子圖的繪制方法
- 掌握繪制圖形的保存與展示方法
- 掌握散點(diǎn)圖和折線圖的作用與繪制方法
- 掌握直方圖、餅圖和箱線圖的作用與繪制方法
掌握繪圖基礎(chǔ)語(yǔ)法與基本參數(shù) 掌握pyplot基礎(chǔ)語(yǔ)法
大部分的pyplot圖形繪制都遵循一個(gè)流程,使用這個(gè)流程可以完成大部分圖形的繪制。pyplot基本繪圖流程主要分為3個(gè)部分。

創(chuàng)建畫布與創(chuàng)建子圖:
構(gòu)建出一張空白的畫布,并可以選擇是否將整個(gè)畫布劃分為多個(gè)部分,方便在同一幅圖上繪制多個(gè)圖形的情況。當(dāng)只需要繪制一幅簡(jiǎn)單的圖形時(shí),就可以不用分割。
pyplot創(chuàng)建畫布與選中子圖的常用函數(shù)

添加畫布內(nèi)容:
第二部分是繪圖的主體。
包括添加標(biāo)題、添加坐標(biāo)名稱、繪制圖形等步驟是并列的,沒有先后。但添加圖例一定是在繪制圖形之后進(jìn)行的。
pyplot中添加各類標(biāo)簽和圖例的常用函數(shù)

保存與顯示圖形:
第三部分用于保存和顯示圖形,通常只有兩個(gè)函數(shù),參數(shù)也很少
pyplot中保存額和顯示圖形的常用函數(shù)

pyplot中的基礎(chǔ)繪圖語(yǔ)法
import numpy as np
import matplotlib.pyplot as plt
#matplotlib inline表示在行中顯示圖片,在命令行運(yùn)行報(bào)錯(cuò)
data=np.arange(0110.01)
plt.title('lines')# 添加標(biāo)題
plt.xlabel('x')#添加x軸的名稱
plt.ylabel('y')#添加y軸的名稱
plt.xlim((0,1))#確定x軸范圍
plt.ylim((0,1))#確定y軸范圍
plt.xticks([0,0.2,0.4,0.6,0.8,1])#規(guī)定x軸刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1])#確定y軸刻度
plt.plot(data,data**2)#添加y=x^2曲線
plt.plot(data,data**4)#添加y=x^4曲線
plt.legend(['y=x^2','y=x^4'])
plt.savefig(' 3-1.png')
plt.show()
包含子圖的基礎(chǔ)語(yǔ)法
import numpy as np
import matplotlib.pyplot as plt
rad = np.arange(0, np.pi * 2, 0.01)
# 第一幅子圖
p1 = plt.figure(figsize=(8, 6), dpi=80) # 確定畫布大小
ax1 = p1.add_subplot(2, 1, 1) # 創(chuàng)建一個(gè)2行1列的子圖
plt.title('lines') # 添加標(biāo)題
plt.xlabel('x') # 添加x軸的名稱
plt.ylabel('y') # 添加y軸的名稱
plt.xlim((0, 1)) # 確定x軸范圍
plt.ylim((0, 1)) # 確定y軸范圍
plt.xticks([0, 0.2, 0.4, 0.6, 0.8, 1]) # 確定x軸刻度
plt.yticks([0, 0.2, 0.4, 0.6, 0.8, 1]) # 確定y軸刻度
plt.plot(rad, rad ** 2) # 添加曲線
plt.plot(rad, rad ** 4) # 添加曲線
plt.legend(['y=x^2'], ['y=x^4'])
# 第二幅子圖
ax2 = p1.add_subplot(2, 1, 2) # 開始繪制第二幅
plt.title('sin/cos')
plt.xlabel('rad')
plt.ylabel('value')
plt.xlim((0, np.pi * 2))
plt.ylim((-1, 1))
plt.xticks([0, np.pi / 2, np.pi, np.pi * 1.5, np.pi * 2])
plt.yticks([-1, -0.5, 0, 0.5, 1])
plt.plot(rad, np.sin(rad))
plt.plot(rad, np.cos(rad))
plt.legend(['sin'], ['cos'])
plt.savefig('sincos.png')
plt.show()
設(shè)置pyplot的動(dòng)態(tài)rc參數(shù):
pyplot使用rc配置文件來(lái)自定義圖形的各種默認(rèn)屬性,被稱為rc配置或rc參數(shù)。
默認(rèn)rc參數(shù)可以在python交互式環(huán)境中動(dòng)態(tài)更改。所有存儲(chǔ)在字變量中的rc參數(shù)被稱為rcParams。rc參數(shù)在修改過后,繪圖時(shí)使用默認(rèn)的參數(shù)就會(huì)改變。
調(diào)節(jié)線條的rc參數(shù)
import numpy as np
import matplotlib.pyplot as plt
# 原圖
x = np.linspace(0, 4 * np.pi)
y = np.sin(x)
plt.plot(x, y, label="$sin(x)$")
plt.title('sin')
plt.savefig('默認(rèn)sin曲線.png')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
#修改RC參數(shù)后的圖
plt.rcParams['lines.linestyle'] = '-.'
plt.rcParams['lines.linewidth']=3
plt.plot(x,y,label="$sin(x)$")
plt.title('sin')
plt.savefig('修改rc參數(shù)后sin曲線.png')
plt.show()
線條常用的rc參數(shù)名稱。解釋與取值:

lines.linstyle參數(shù)取值及其含義:

lines.marker參數(shù)取值及其意義:


lines.marker取值含義o圓圈D菱形h六邊形1H六邊形2-水平線8八邊形P五邊形,像素+加號(hào)None無(wú)、點(diǎn)s正方形*星號(hào)d小菱形v一角朝下的三角形<一角朝左的三角形>一角朝右的三角形^一角朝上的三角形|豎線xX
調(diào)節(jié)字體的rc參數(shù)
import numpy as np
import matplotlib.pyplot as plt
# 無(wú)法顯示中文標(biāo)題
x = np.linspace(0, 4 * np.pi)
y = np.sin(x)
plt.plot(x, y, label="$sin(x)$")
plt.title('sin曲線')
plt.savefig('無(wú)法顯示中文標(biāo)題sin曲線.png')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
# 修改rc參數(shù)后的圖
plt.plot(x, y, label='$sin(x)$')
plt.title('sin')
plt.savefig('修改rc參數(shù)后的sin曲線.png')
plt.show()
分析特征間的關(guān)系
繪制散點(diǎn)圖
散點(diǎn)圖,是利用坐標(biāo)即散點(diǎn)的分布形態(tài)反映特征間的統(tǒng)計(jì)關(guān)系的一種圖形。值由點(diǎn)在圖表中的位置表示,類別由圖中的不同標(biāo)記表示,通常用于比較跨類別的數(shù)據(jù)。
散點(diǎn)圖可以提供兩類關(guān)鍵信息:
- 特征之間是否存在數(shù)值或者數(shù)量的關(guān)聯(lián)趨勢(shì),關(guān)聯(lián)趨勢(shì)是線性的還是非線性的
- 如果某個(gè)點(diǎn)或者幾個(gè)點(diǎn)偏離大多數(shù)點(diǎn),這個(gè)點(diǎn)就是離群值,通過散點(diǎn)圖可以一目了然,從而可以進(jìn)一步分析這些離群值是否存在建模分析中產(chǎn)生很大的影響。
scatter函數(shù)常用參數(shù)及說明:

繪制2000-2017年個(gè)季度過敏生產(chǎn)總值散點(diǎn)圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
plt.figure(figsize=(8, 7))
plt.scatter(values[:, 0], values[:, 2], marker='o')
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('繪制2000-2017年個(gè)季度過敏生產(chǎn)總值散點(diǎn)圖')
plt.savefig('繪制2000-2017年個(gè)季度過敏生產(chǎn)總值散點(diǎn)圖.png')
plt.show()
繪制2000-2017年各季度國(guó)民生產(chǎn)總值散點(diǎn)圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
plt.figure(figsize=(8, 7))
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
values = data['values']
# 繪制散點(diǎn)圖1
plt.scatter(values[:, 0], values[:, 3], marker='o', c='red')
# 繪制散點(diǎn)圖2
plt.scatter(values[:, 0], values[:, 4], marker='D', c='blue')
# 繪制散點(diǎn)圖3
plt.scatter(values[:, 0], values[:, 5], marker='v', c='yellow')
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000-2017年各季度國(guó)民生產(chǎn)總值散點(diǎn)圖')
plt.legend(['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)'])
plt.savefig('2000-2017年各季度國(guó)民生產(chǎn)總值散點(diǎn)圖.png')
plt.show()
繪制折線圖
折線圖:將數(shù)據(jù)點(diǎn)按照順序連接起來(lái)的圖形。適合用于顯示隨時(shí)間而變化的連續(xù)數(shù)據(jù)。同時(shí)還可以看出數(shù)量的差異,增長(zhǎng)趨勢(shì)的變化。
pyplot繪制折線圖的函數(shù)為plot,基本語(yǔ)法如下:
matplotlib.pyplot.plot(*args,**kwargs)


繪制2000-2017年各季度過敏生產(chǎn)總值折線圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
plt.figure(figsize=(8, 7))
#,
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz',allow_pickle=True)
values = data['values']
plt.plot(values[:, 0], values[:, 2], color='r', linestyle='--')
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000~ 2017 年各季度 國(guó)民生產(chǎn) 總值折線')
plt.savefig('2000~ 2017 年各季度 國(guó)民生產(chǎn) 總值折線.png')
plt.show()
2000~ 2017年各季度國(guó)民生產(chǎn)總值點(diǎn)線圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz',allow_pickle=True)
values = data['values']
plt.figure(figsize=(8, 7))
plt.plot(values[:,0],values[:,2],color='r',linestyle='--',marker='o')
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000~ 2017年各季度國(guó)民生產(chǎn)總值點(diǎn)線圖')
plt.savefig('2000~ 2017年各季度國(guó)民生產(chǎn)總值點(diǎn)線圖.png')
plt.show()
2000~ 2017年各季度國(guó)民生產(chǎn)總值折線散點(diǎn)圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
values = data['values']
plt.figure(figsize=(8, 7))
plt.plot(values[:, 0], values[:, 3], 'bs-',
values[:, 0], values[:, 4], 'ro-',
values[:, 0], values[:, 5], 'gH--')
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.ylim((0, 100000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000~ 2017年各季度國(guó)民生產(chǎn)總值折線')
plt.legend(['第一產(chǎn)業(yè)','第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)'])
plt.savefig('2000~ 2017年各季度國(guó)民生產(chǎn)總值折線散點(diǎn)圖.png')
plt.show()
任務(wù)實(shí)現(xiàn)
任務(wù)1
繪制2000-2017各產(chǎn)業(yè)與行業(yè)的過敏生產(chǎn)總值散點(diǎn)圖:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
p = plt.figure(figsize=(12, 12))
# 子圖1
ax1 = p.add_subplot(2, 1, 1)
plt.scatter(values[:, 0], values[:, 3], marker='o', c='r')
plt.scatter(values[:, 0], values[:, 4], marker='D', c='b')
plt.scatter(values[:, 0], values[:, 5], marker='v', c='y')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('2000-2017年各產(chǎn)業(yè)與行業(yè)國(guó)民生產(chǎn)總值散點(diǎn)圖')
plt.legend(['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)'])
# 子圖2
ax2 = p.add_subplot(2, 1, 2)
plt.scatter(values[:, 0], values[:, 6], marker='o', c='r')
plt.scatter(values[:, 0], values[:, 7], marker='D', c='b')
plt.scatter(values[:, 0], values[:, 8], marker='v', c='y')
plt.scatter(values[:, 0], values[:, 9], marker='8', c='g')
plt.scatter(values[:, 0], values[:, 10], marker='p', c='c')
plt.scatter(values[:, 0], values[:, 11], marker='+', c='m')
plt.scatter(values[:, 0], values[:, 12], marker='s', c='k')
# 繪制散點(diǎn)圖
plt.scatter(values[:, 0], values[:, 13], marker='*', c='purple')
# 繪制散點(diǎn)圖
plt.scatter(values[:, 0], values[:, 14], marker='d', c='brown')
plt.legend(['農(nóng)業(yè)', '工業(yè)', '建筑', '批發(fā)', '交通', '餐飲', '金融', '房地產(chǎn)', '其他'])
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.savefig('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值散點(diǎn)子圖.png')
plt.show()
任務(wù)2
繪制2000-2017各產(chǎn)業(yè)與行業(yè)的過敏生產(chǎn)總值折線圖:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
p1 = plt.figure(figsize=(8, 7))
# 子圖1
ax3 = p1.add_subplot(2, 1, 1)
plt.plot(values[:, 0], values[:, 3], 'b-',
values[:, 0], values[:, 4], 'r--',
values[:, 0], values[:, 5], 'g--')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('2000-2017年各產(chǎn)業(yè)與行業(yè)國(guó)民生產(chǎn)總值折線圖')
plt.legend(['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)'])
# 子圖2
ax4 = p1.add_subplot(2, 1, 2)
plt.plot(values[:, 0], values[:, 6], 'r--',
values[:, 0], values[:, 7], 'b.',
values[:, 0], values[:, 8], 'y--',
values[:, 0], values[:, 9], 'g:',
values[:, 0], values[:, 10], 'c-',
values[:, 0], values[:, 11], 'm-',
values[:, 0], values[:, 12], 'k--',
# 繪制散點(diǎn)圖
values[:, 0], values[:, 13], 'r:',
# 繪制散點(diǎn)圖
values[:, 0], values[:, 14], 'b-')
plt.legend(['農(nóng)業(yè)', '工業(yè)', '建筑', '批發(fā)', '交通', '餐飲', '金融', '房地產(chǎn)', '其他'])
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.savefig('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值折線子圖.png')
plt.show()
分析特征內(nèi)部數(shù)據(jù)分布與分散狀況
直方圖、餅圖和箱線圖是另外3種數(shù)據(jù)分析常用的圖形,主要用于分析數(shù)據(jù)內(nèi)部的分布狀態(tài)和分散狀態(tài)。
- 直方圖主要用于查看各分組數(shù)據(jù)的數(shù)量分布,以及各個(gè)分組數(shù)據(jù)之間的數(shù)量比較。
- 餅圖傾向于查看各分組數(shù)據(jù)在總數(shù)據(jù)中的占比。箱線圖的主要作用是發(fā)現(xiàn)整體數(shù)據(jù)的分布分散情況。 繪制直方圖
- 在直方圖中可以發(fā)現(xiàn)分布表無(wú)法發(fā)現(xiàn)的數(shù)據(jù)模式、樣本的頻率分布和總體的分布
puplot中繪制直方圖的函數(shù)為bar,基本使用語(yǔ)法如下:
matplotlib.pyplot.bar(left,height,width=0.8,bottom=None,hold=None,data=None,**kwargs)

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
label = ['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)']
plt.figure(figsize=(6, 5))
plt.bar(range(3), values[-2, 3:6], width=0.5)
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值直方圖')
plt.xticks(range(3), label)
plt.savefig('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值直方圖.png')
plt.show()
繪制餅圖
餅圖(Pie Graph)是將各項(xiàng)的大小與各項(xiàng)總和的比例顯示在一張“餅”中,以“餅”的大小來(lái)確定每一項(xiàng)的占比。餅圖可以比較清楚地反映出部分與部分、部分與整體之間的比例關(guān)系,易于顯示每組數(shù)據(jù)相對(duì)于總數(shù)的大小,而且顯示方式直觀。
pyplot中繪制餅圖的函數(shù)為pie,其基本使用語(yǔ)法如下:
matplotlib.pyplot.pie(x,explode=None,labels=Nonecolors=None,autopctNone,pctdistance=0.6shadow=False,labeldistance=1.1,startangle=None,radius=None,counterclock=Truewedgeprops=Nonetextprops=Nonecenter=(0.0)frame=False
hold=Nonedata-None)

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
label = ['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)']
explode = [0.01, 0.01, 0.01]
plt.pie(values[-1, 3:6], explode=explode, labels=label, autopct='%1.1f%%')
plt.figure(figsize=(6, 6))
plt.title('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值餅圖')
plt.savefig('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值占比餅圖.png')
plt.show()
繪制箱線圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
plt.figure(figsize=(6, 4))
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
label = ['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)']
gdp = (list(values[:, 3]), list(values[:, 4]), list(values[:, 5]))
plt.boxplot(gdp, notch=True, labels=label, meanline=True)
plt.title('2000-2017年各產(chǎn)業(yè)國(guó)民生產(chǎn)總值箱線圖')
plt.savefig('2000-2017年各產(chǎn)業(yè)過敏生產(chǎn)總值箱線圖')
plt.show()
任務(wù)實(shí)現(xiàn)
任務(wù)1:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
plt.figure(figsize=(6, 6))
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
label1 = ['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)']
label2 = ['農(nóng)業(yè)', '工業(yè)', '建筑', '批發(fā)', '交通', '餐飲', '金融', '房地產(chǎn)', '其他']
p = plt.figure(figsize=(12, 12,))
# 子圖1
ax1 = p.add_subplot(2, 2, 1)
plt.bar(range(3), values[0, 3:6], width=0.5)
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值構(gòu)成分布直方圖')
plt.xticks(range(3), label1)
# 子圖2
ax2 = p.add_subplot(2, 2, 2)
plt.bar(range(3), values[0, 3:6], width=0.5)
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值構(gòu)成分布直方圖')
plt.xticks(range(3), label1)
# 子圖3
ax3 = p.add_subplot(2, 2, 3)
plt.bar(range(9), values[0, 6:], width=0.5)
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值構(gòu)成分布直方圖')
plt.xticks(range(9), label2)
# 子圖4
ax4 = p.add_subplot(2, 2, 4)
plt.bar(range(9), values[0, 6:], width=0.5)
plt.xlabel('年份')
plt.ylabel('生產(chǎn)總值(億元)')
plt.title('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值構(gòu)成分布直方圖')
plt.xticks(range(9), label2)
plt.savefig('2000~ 2017年各產(chǎn)業(yè)與行業(yè)各季度國(guó)民生產(chǎn)總值構(gòu)成分布直方圖.png')
plt.show()
任務(wù)2:
繪制國(guó)民生產(chǎn)總值構(gòu)成分布餅圖:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
plt.figure(figsize=(6, 6))
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
label1 = ['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)']
label2 = ['農(nóng)業(yè)', '工業(yè)', '建筑', '批發(fā)', '交通', '餐飲', '金融', '房地產(chǎn)', '其他']
explode1 = [0.01, 0.01, 0.01]
explode2 = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
p = plt.figure(figsize=(12, 12))
# 子圖1
ax1 = p.add_subplot(2, 2, 1)
plt.pie(values[0, 3:6], explode=explode1, labels=label1, autopct='%1.1f%%')
plt.title('2000年第一季度國(guó)民生產(chǎn)總值產(chǎn)業(yè)構(gòu)成分布餅圖')
# 子圖2
ax2 = p.add_subplot(2, 2, 2)
plt.pie(values[-1, 3:6], explode=explode1, labels=label1, autopct='%1.1f%%')
plt.title('2000年第一季度國(guó)民生產(chǎn)總值產(chǎn)業(yè)構(gòu)成分布餅圖')
# 子圖3
ax3 = p.add_subplot(2, 2, 3)
plt.pie(values[0, 6:], explode=explode2, labels=label2, autopct='%1.1f%%')
plt.title('2000年第一季度國(guó)民生產(chǎn)總值產(chǎn)業(yè)構(gòu)成分布餅圖')
# 子圖4
ax4 = p.add_subplot(2, 2, 4)
plt.pie(values[-1, 6:], explode=explode2, labels=label2, autopct='%1.1f%%')
plt.title('2000年第一季度國(guó)民生產(chǎn)總值產(chǎn)業(yè)構(gòu)成分布餅圖')
#保存并顯示圖形
plt.savefig('國(guó)民生產(chǎn)總值產(chǎn)業(yè)構(gòu)成分布餅圖.png')
plt.show()
任務(wù)3:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
plt.figure(figsize=(6, 6))
data = np.load('35data.npz/國(guó)民經(jīng)濟(jì)核算季度數(shù)據(jù).npz', allow_pickle=True)
name = data['columns']
values = data['values']
label1 = ['第一產(chǎn)業(yè)', '第二產(chǎn)業(yè)', '第三產(chǎn)業(yè)']
label2 = ['農(nóng)業(yè)', '工業(yè)', '建筑', '批發(fā)', '交通', '餐飲', '金融', '房地產(chǎn)', '其他']
gdp1 = (list(values[:, 3]), list(values[:, 4]), list(values[:, 5]))
gdp2 = ([list(values[:, i]) for i in range(6, 15)])
p = plt.figure(figsize=(8, 8))
# 子圖1
ax1 = p.add_subplot(2, 1, 1)
plt.boxplot(gdp1, notch=True, labels=label1, meanline=True)
plt.title('2000-2017年各產(chǎn)業(yè)國(guó)民生產(chǎn)總值箱線圖')
plt.ylabel('生產(chǎn)總值(億元)')
# 子圖2
ax2 = p.add_subplot(2, 1, 2)
plt.boxplot(gdp2, notch=True, labels=label2, meanline=True)
plt.title('2000-2017年各產(chǎn)業(yè)國(guó)民生產(chǎn)總值箱線圖')
plt.xlabel('行業(yè)')
plt.ylabel('生產(chǎn)總值(億元)')
plt.savefig('2000-2017年各產(chǎn)業(yè)過敏生產(chǎn)總值箱線圖.png')
plt.show()
實(shí)訓(xùn)
需求說明:
人口數(shù)據(jù)總共擁有6個(gè)特征,分別為年末總?cè)丝?、男性人口、女性人口、城?zhèn)人口、鄉(xiāng)村人口和年份。查看各個(gè)特征隨著時(shí)間推移發(fā)生的變化情況可以分析出未來(lái)男女人口比例、城鄉(xiāng)人口變化的方向。
具體步驟:
(1)使用NumPy庫(kù)讀取人口數(shù)據(jù)。
(2)創(chuàng)建畫布,并添加子圖。
(3)在兩個(gè)子圖上分別繪制散點(diǎn)圖和折線圖。
(4)保存,顯示圖片。
(5)分析未來(lái)人口變化趨勢(shì)。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']
# for i in data:
# print(i)
p = plt.figure(figsize=(10, 9))
# 子圖1
ax1 = p.add_subplot(2, 1, 1)
plt.scatter(range(data.shape[0] - 2), data[:-2, 1], marker='o', c='r')
plt.scatter(range(data.shape[0] - 2), data[:-2, 2], marker='D', c='b')
plt.scatter(range(data.shape[0] - 2), data[:-2, 3], marker='v', c='y')
plt.scatter(range(data.shape[0] - 2), data[:-2, 4], marker='+', c='c')
plt.scatter(range(data.shape[0] - 2), data[:-2, 5], marker='p', c='g')
plt.xlabel('時(shí)間-年份')
plt.ylabel('人口數(shù)(萬(wàn)人)')
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.title('1996~2015年各特征人口變化散點(diǎn)圖')
plt.legend(['年末人口', '男性人口', '女性人口', '城鎮(zhèn)人口', '鄉(xiāng)村人口和年份', '年份'])
# 子圖2
ax2 = p.add_subplot(2, 1, 2)
plt.plot(range(data.shape[0] - 2), data[:-2, 1], c='r', linestyle='--')
plt.plot(range(data.shape[0] - 2), data[:-2, 2], c='b', linestyle='--')
plt.plot(range(data.shape[0] - 2), data[:-2, 3], c='y', linestyle='--')
plt.plot(range(data.shape[0] - 2), data[:-2, 4], c='g', linestyle='--')
plt.plot(range(data.shape[0] - 2), data[:-2, 5], c='c', linestyle='--')
plt.legend(['年末總?cè)丝?, '男性人口', '女性人口', '城鎮(zhèn)人口', '鄉(xiāng)村人口'])
plt.xlabel('時(shí)間-年份')
plt.ylabel('人口數(shù)(萬(wàn)人)')
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.title('1996-2015年各特征人口數(shù)折線圖')
plt.show()
實(shí)訓(xùn)2
需求說明:
通過繪制各年份男女人口數(shù)目及城鄉(xiāng)人口數(shù)目的直方圖,男女人口比例及城鄉(xiāng)人口比例的餅圖可以發(fā)現(xiàn)人口結(jié)構(gòu)的變化。而繪制每個(gè)特征的箱線圖則可以發(fā)現(xiàn)不同特征增長(zhǎng)或者減少的速率是否變得緩慢。
實(shí)現(xiàn)步驟:
(1)創(chuàng)建3幅畫布并添加對(duì)應(yīng)數(shù)目的子圖。
(2)在每一幅子圖上繪制對(duì)應(yīng)的圖形。
(3)保存和顯示圖形。
(4)根據(jù)圖形,分析我國(guó)人口結(jié)構(gòu)變化情況以及變化速率的增減狀況。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']
pt = plt.figure(figsize=(12, 11))
# 創(chuàng)建子圖1
ax1 = pt.add_subplot(2, 1, 1)
plt.bar(range(data.shape[0] - 2), data[:-2, 2], width=0.5)
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.xlabel('1996~2015年男性人口總數(shù)')
plt.ylabel('人口數(shù)據(jù)特征')
plt.title('1996~2015年人口數(shù)據(jù)特征間的關(guān)系的直方圖')
# 創(chuàng)建子圖2
ax2 = pt.add_subplot(2, 2, 2)
plt.bar(range(data.shape[0] - 2), data[:-2, 3], width=0.5)
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.xlabel('1996-2015年女性人口數(shù)目')
plt.ylabel('人口數(shù)目(萬(wàn)人)')
# 創(chuàng)建子圖3
ax3 = pt.add_subplot(2, 2, 3)
plt.bar(range(data.shape[0] - 2), data[:-2, 4], width=0.5)
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.xlabel('1996-2015年城市人口數(shù)目')
plt.ylabel('人口數(shù)目(萬(wàn)人)')
# 創(chuàng)建子圖4
ax4 = pt.add_subplot(2, 2, 4)
plt.bar(range(data.shape[0] - 2), data[:-2, 5], width=0.5)
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.xlabel('1996-2015年鄉(xiāng)村人口數(shù)目')
plt.ylabel('人口數(shù)目(萬(wàn)人)')
plt.show()
# 繪制餅圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']
pt2 = plt.figure(figsize=(12, 10))
# 創(chuàng)建子圖1
ax1 = pt2.add_subplot(2, 2, 1)
plt.pie(data[:-2, 2], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年男性人口比例')
# 創(chuàng)建子圖2
ax2 = pt2.add_subplot(2, 2, 2)
plt.pie(data[:-2, 3], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年女性人口比例')
# 創(chuàng)建子圖3
ax3 = pt2.add_subplot(2, 2, 3)
plt.pie(data[:-2, 4], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年城市人口比例')
# 創(chuàng)建子圖4
ax4 = pt2.add_subplot(2, 2, 4)
plt.pie(data[:-2, 5], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年鄉(xiāng)村人口比例')
plt.show()
# 繪制箱線圖
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 漢字字體,優(yōu)先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False # 這兩行需要手動(dòng)設(shè)置
data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']
pt3 = plt.figure(figsize=(12, 10))
label = ['年末總?cè)丝?, '男性人口', '女性人口', '城鎮(zhèn)人口', '鄉(xiāng)村人口']
plt.boxplot(([list(data[:-2, i]) for i in range(1, 6)]), labels=label, meanline=True)
plt.title('1996-2015年各特征人口數(shù)線箱圖')
plt.ylabel('人口數(shù)(萬(wàn)人)')
plt.show()
到此這篇關(guān)于Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情的文章就介紹到這了,更多相關(guān)Python Matplotlib可視化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python數(shù)據(jù)分析之單因素分析線性擬合及地理編碼
- python數(shù)據(jù)分析繪圖可視化
- Python數(shù)據(jù)分析基礎(chǔ)之異常值檢測(cè)和處理方式
- Python數(shù)據(jù)分析numpy數(shù)組的3種創(chuàng)建方式
- Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
- Python數(shù)據(jù)分析之使用scikit-learn構(gòu)建模型
- Python數(shù)據(jù)分析matplotlib折線圖案例處理
- Python數(shù)據(jù)分析之堆疊數(shù)組函數(shù)示例總結(jié)
- 使用python對(duì)泰坦尼克號(hào)幸存者進(jìn)行數(shù)據(jù)分析與預(yù)測(cè)
相關(guān)文章
Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁(yè)面上是否彈出重復(fù)手機(jī)號(hào)碼提示框
這篇文章主要介紹了Python+Selenium隨機(jī)生成手機(jī)驗(yàn)證碼并檢查頁(yè)面上是否彈出重復(fù)手機(jī)號(hào)碼提示框,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
淺談python累加求和+奇偶數(shù)求和_break_continue
這篇文章主要介紹了淺談python累加求和+奇偶數(shù)求和_break_continue,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-02-02
Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境
這篇文章主要介紹了Ubuntu18.04安裝 PyCharm并使用 Anaconda 管理的Python環(huán)境的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
Python利用watchdog模塊監(jiān)控文件變化
這篇文章主要為大家介紹一個(gè)Python中的模塊:watchdog模塊,它可以實(shí)現(xiàn)監(jiān)控文件的變化。文中通過示例詳細(xì)介紹了watchdog模塊的使用,需要的可以參考一下2022-06-06
python 內(nèi)置函數(shù)-range()+zip()+sorted()+map()+reduce()+filte
這篇文章主要介紹了python 內(nèi)置函數(shù)-range()+zip()+sorted()+map()+reduce()+filter(),想具體了解函數(shù)具體用法的小伙伴可以參考一下下面的介紹,希望對(duì)你有所幫助2021-12-12
Python使用pydub模塊轉(zhuǎn)換音頻格式以及對(duì)音頻進(jìn)行剪輯
這篇文章主要給大家介紹了關(guān)于Python使用pydub模塊轉(zhuǎn)換音頻格式以及對(duì)音頻進(jìn)行剪輯的相關(guān)資料pydub是python的高級(jí)一個(gè)音頻處理庫(kù),可以讓你以一種不那么蠢的方法處理音頻。需要的朋友可以參考下2021-06-06
pandas學(xué)習(xí)之df.fillna的具體使用
本文主要介紹了pandas學(xué)習(xí)之df.fillna的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
python 參數(shù)列表中的self 顯式不等于冗余
Self in the Argument List: Redundant is not Explicit2008-12-12

