Python數據分析應用之Matplotlib數據可視化詳情

簡述

mat參照瞭函數設計,plot表示繪圖的作用,lib則表示一個集合。今年在開源社區的推動下,Matplotlib在科學計算領域得到瞭廣泛的應用,成為Python中應用非常廣的繪圖工具之一。其中Matplotlib應用最廣的是matplotlib.pyplot模塊。

matplotlib.pyplot是一個命令風格函數的集合,使得Matplotlib的機制更像MATLAB。每個繪圖函數都可對圖形進行一些修改,如創建圖形,在圖形中創建繪圖區域,在繪圖區域繪制一些線條,使用標簽裝飾繪圖等。在pyplot中,各種狀態跨函數調用保存,以便跟蹤諸如當前圖形和繪圖 區域之類的東西,並且繪圖函數始終指向當前軸域。本章以pyplot為基礎介紹和展開學習。

學習目標 :

  • 掌握pyplot常用的繪圖參數的調節方法掌
  • 握子圖的繪制方法
  • 掌握繪制圖形的保存與展示方法
  • 掌握散點圖和折線圖的作用與繪制方法
  • 掌握直方圖、餅圖和箱線圖的作用與繪制方法

掌握繪圖基礎語法與基本參數 掌握pyplot基礎語法

大部分的pyplot圖形繪制都遵循一個流程,使用這個流程可以完成大部分圖形的繪制。pyplot基本繪圖流程主要分為3個部分。

創建畫佈與創建子圖:

構建出一張空白的畫佈,並可以選擇是否將整個畫佈劃分為多個部分,方便在同一幅圖上繪制多個圖形的情況。當隻需要繪制一幅簡單的圖形時,就可以不用分割。
pyplot創建畫佈與選中子圖的常用函數

添加畫佈內容:

第二部分是繪圖的主體。
包括添加標題、添加坐標名稱、繪制圖形等步驟是並列的,沒有先後。但添加圖例一定是在繪制圖形之後進行的。
pyplot中添加各類標簽和圖例的常用函數

保存與顯示圖形:

第三部分用於保存和顯示圖形,通常隻有兩個函數,參數也很少
pyplot中保存額和顯示圖形的常用函數

pyplot中的基礎繪圖語法

import numpy as np
import matplotlib.pyplot as plt
#matplotlib inline表示在行中顯示圖片,在命令行運行報錯
data=np.arange(0110.01)
plt.title('lines')# 添加標題
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(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()

包含子圖的基礎語法

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)  # 創建一個2行1列的子圖
plt.title('lines')  # 添加標題
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()

設置pyplot的動態rc參數:

pyplot使用rc配置文件來自定義圖形的各種默認屬性,被稱為rc配置或rc參數。

默認rc參數可以在python交互式環境中動態更改。所有存儲在字變量中的rc參數被稱為rcParams。rc參數在修改過後,繪圖時使用默認的參數就會改變。

調節線條的rc參數

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('默認sin曲線.png')
plt.show()

import numpy as np
import matplotlib.pyplot as plt

#修改RC參數後的圖
plt.rcParams['lines.linestyle'] = '-.'
plt.rcParams['lines.linewidth']=3
plt.plot(x,y,label="$sin(x)$")
plt.title('sin')
plt.savefig('修改rc參數後sin曲線.png')
plt.show()

線條常用的rc參數名稱。解釋與取值:

lines.linstyle參數取值及其含義:

lines.marker參數取值及其意義:

lines.marker取值含義o圓圈D菱形h六邊形1H六邊形2-水平線8八邊形P五邊形,像素+加號None無、點s正方形*星號d小菱形v一角朝下的三角形<一角朝左的三角形>一角朝右的三角形^一角朝上的三角形|豎線xX

調節字體的rc參數

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('無法顯示中文標題sin曲線.png')
plt.show()

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

# 修改rc參數後的圖
plt.plot(x, y, label='$sin(x)$')
plt.title('sin')
plt.savefig('修改rc參數後的sin曲線.png')
plt.show()

分析特征間的關系

繪制散點圖

散點圖,是利用坐標即散點的分佈形態反映特征間的統計關系的一種圖形。值由點在圖表中的位置表示,類別由圖中的不同標記表示,通常用於比較跨類別的數據。

散點圖可以提供兩類關鍵信息:

  • 特征之間是否存在數值或者數量的關聯趨勢,關聯趨勢是線性的還是非線性的
  • 如果某個點或者幾個點偏離大多數點,這個點就是離群值,通過散點圖可以一目瞭然,從而可以進一步分析這些離群值是否存在建模分析中產生很大的影響。

scatter函數常用參數及說明:

繪制2000-2017年個季度過敏生產總值散點圖

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/國民經濟核算季度數據.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('生產總值(億元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('繪制2000-2017年個季度過敏生產總值散點圖')
plt.savefig('繪制2000-2017年個季度過敏生產總值散點圖.png')
plt.show()

繪制2000-2017年各季度國民生產總值散點圖

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

plt.figure(figsize=(8, 7))
data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
values = data['values']
# 繪制散點圖1
plt.scatter(values[:, 0], values[:, 3], marker='o', c='red')
# 繪制散點圖2
plt.scatter(values[:, 0], values[:, 4], marker='D', c='blue')
# 繪制散點圖3
plt.scatter(values[:, 0], values[:, 5], marker='v', c='yellow')
plt.xlabel('年份')
plt.ylabel('生產總值(億元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000-2017年各季度國民生產總值散點圖')
plt.legend(['第一產業', '第二產業', '第三產業'])
plt.savefig('2000-2017年各季度國民生產總值散點圖.png')
plt.show()

繪制折線圖

折線圖:將數據點按照順序連接起來的圖形。適合用於顯示隨時間而變化的連續數據。同時還可以看出數量的差異,增長趨勢的變化。

pyplot繪制折線圖的函數為plot,基本語法如下:
matplotlib.pyplot.plot(*args,**kwargs)

繪制2000-2017年各季度過敏生產總值折線圖

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

plt.figure(figsize=(8, 7))
#,
data = np.load('35data.npz/國民經濟核算季度數據.npz',allow_pickle=True)
values = data['values']
plt.plot(values[:, 0], values[:, 2], color='r', linestyle='--')
plt.xlabel('年份')
plt.ylabel('生產總值(億元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000~ 2017 年各季度 國民生產 總值折線')
plt.savefig('2000~ 2017 年各季度 國民生產 總值折線.png')
plt.show()

2000~ 2017年各季度國民生產總值點線圖

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/國民經濟核算季度數據.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('生產總值(億元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000~ 2017年各季度國民生產總值點線圖')
plt.savefig('2000~ 2017年各季度國民生產總值點線圖.png')
plt.show()

2000~ 2017年各季度國民生產總值折線散點圖

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/國民經濟核算季度數據.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('生產總值(億元)')
plt.ylim((0, 100000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.title('2000~ 2017年各季度國民生產總值折線')
plt.legend(['第一產業','第二產業', '第三產業'])
plt.savefig('2000~ 2017年各季度國民生產總值折線散點圖.png')
plt.show()

任務實現

任務1

繪制2000-2017各產業與行業的過敏生產總值散點圖:

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/國民經濟核算季度數據.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('生產總值(億元)')
plt.title('2000-2017年各產業與行業國民生產總值散點圖')
plt.legend(['第一產業', '第二產業', '第三產業'])

# 子圖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')
# 繪制散點圖
plt.scatter(values[:, 0], values[:, 13], marker='*', c='purple')
# 繪制散點圖
plt.scatter(values[:, 0], values[:, 14], marker='d', c='brown')
plt.legend(['農業', '工業', '建築', '批發', '交通', '餐飲', '金融', '房地產', '其他'])
plt.xlabel('年份')
plt.ylabel('生產總值(億元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.savefig('2000~ 2017年各產業與行業各季度國民生產總值散點子圖.png')
plt.show()

任務2

繪制2000-2017各產業與行業的過敏生產總值折線圖:

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/國民經濟核算季度數據.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('生產總值(億元)')
plt.title('2000-2017年各產業與行業國民生產總值折線圖')
plt.legend(['第一產業', '第二產業', '第三產業'])

# 子圖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--',
# 繪制散點圖
values[:, 0], values[:, 13], 'r:',
# 繪制散點圖
values[:, 0], values[:, 14], 'b-')
plt.legend(['農業', '工業', '建築', '批發', '交通', '餐飲', '金融', '房地產', '其他'])
plt.xlabel('年份')
plt.ylabel('生產總值(億元)')
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
plt.savefig('2000~ 2017年各產業與行業各季度國民生產總值折線子圖.png')
plt.show()

分析特征內部數據分佈與分散狀況

直方圖、餅圖和箱線圖是另外3種數據分析常用的圖形,主要用於分析數據內部的分佈狀態和分散狀態

  • 直方圖主要用於查看各分組數據的數量分佈,以及各個分組數據之間的數量比較。
  • 餅圖傾向於查看各分組數據在總數據中的占比。箱線圖的主要作用是發現整體數據的分佈分散情況。 繪制直方圖
  • 在直方圖中可以發現分佈表無法發現的數據模式、樣本的頻率分佈和總體的分佈

puplot中繪制直方圖的函數為bar,基本使用語法如下:

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'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
name = data['columns']
values = data['values']
label = ['第一產業', '第二產業', '第三產業']
plt.figure(figsize=(6, 5))
plt.bar(range(3), values[-2, 3:6], width=0.5)
plt.xlabel('年份')
plt.ylabel('生產總值(億元)')
plt.title('000~ 2017年各產業與行業各季度國民生產總值直方圖')
plt.xticks(range(3), label)
plt.savefig('2000~ 2017年各產業與行業各季度國民生產總值直方圖.png')
plt.show()

繪制餅圖

餅圖(Pie Graph)是將各項的大小與各項總和的比例顯示在一張“餅”中,以“餅”的大小來確定每一項的占比。餅圖可以比較清楚地反映出部分與部分、部分與整體之間的比例關系,易於顯示每組數據相對於總數的大小,而且顯示方式直觀。

pyplot中繪制餅圖的函數為pie,其基本使用語法如下:
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'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
name = data['columns']
values = data['values']
label = ['第一產業', '第二產業', '第三產業']
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年各產業與行業各季度國民生產總值餅圖')
plt.savefig('2000~ 2017年各產業與行業各季度國民生產總值占比餅圖.png')
plt.show()

繪制箱線圖

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

plt.figure(figsize=(6, 4))
data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
name = data['columns']
values = data['values']
label = ['第一產業', '第二產業', '第三產業']
gdp = (list(values[:, 3]), list(values[:, 4]), list(values[:, 5]))
plt.boxplot(gdp, notch=True, labels=label, meanline=True)
plt.title('2000-2017年各產業國民生產總值箱線圖')
plt.savefig('2000-2017年各產業過敏生產總值箱線圖')
plt.show()

任務實現

任務1:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

plt.figure(figsize=(6, 6))
data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
name = data['columns']
values = data['values']
label1 = ['第一產業', '第二產業', '第三產業']
label2 = ['農業', '工業', '建築', '批發', '交通', '餐飲', '金融', '房地產', '其他']
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('生產總值(億元)')
plt.title('2000~ 2017年各產業與行業各季度國民生產總值構成分佈直方圖')
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('生產總值(億元)')
plt.title('2000~ 2017年各產業與行業各季度國民生產總值構成分佈直方圖')
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('生產總值(億元)')
plt.title('2000~ 2017年各產業與行業各季度國民生產總值構成分佈直方圖')
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('生產總值(億元)')
plt.title('2000~ 2017年各產業與行業各季度國民生產總值構成分佈直方圖')
plt.xticks(range(9), label2)
plt.savefig('2000~ 2017年各產業與行業各季度國民生產總值構成分佈直方圖.png')
plt.show()

任務2:

繪制國民生產總值構成分佈餅圖:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

plt.figure(figsize=(6, 6))
data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
name = data['columns']
values = data['values']
label1 = ['第一產業', '第二產業', '第三產業']
label2 = ['農業', '工業', '建築', '批發', '交通', '餐飲', '金融', '房地產', '其他']

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年第一季度國民生產總值產業構成分佈餅圖')
# 子圖2
ax2 = p.add_subplot(2, 2, 2)
plt.pie(values[-1, 3:6], explode=explode1, labels=label1, autopct='%1.1f%%')
plt.title('2000年第一季度國民生產總值產業構成分佈餅圖')
# 子圖3
ax3 = p.add_subplot(2, 2, 3)
plt.pie(values[0, 6:], explode=explode2, labels=label2, autopct='%1.1f%%')
plt.title('2000年第一季度國民生產總值產業構成分佈餅圖')
# 子圖4
ax4 = p.add_subplot(2, 2, 4)
plt.pie(values[-1, 6:], explode=explode2, labels=label2, autopct='%1.1f%%')
plt.title('2000年第一季度國民生產總值產業構成分佈餅圖')
#保存並顯示圖形
plt.savefig('國民生產總值產業構成分佈餅圖.png')
plt.show()

任務3:

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

plt.figure(figsize=(6, 6))
data = np.load('35data.npz/國民經濟核算季度數據.npz', allow_pickle=True)
name = data['columns']
values = data['values']

label1 = ['第一產業', '第二產業', '第三產業']
label2 = ['農業', '工業', '建築', '批發', '交通', '餐飲', '金融', '房地產', '其他']

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年各產業國民生產總值箱線圖')
plt.ylabel('生產總值(億元)')
# 子圖2
ax2 = p.add_subplot(2, 1, 2)
plt.boxplot(gdp2, notch=True, labels=label2, meanline=True)
plt.title('2000-2017年各產業國民生產總值箱線圖')
plt.xlabel('行業')
plt.ylabel('生產總值(億元)')
plt.savefig('2000-2017年各產業過敏生產總值箱線圖.png')
plt.show()

實訓

需求說明:

人口數據總共擁有6個特征,分別為年末總人口、男性人口、女性人口、城鎮人口、鄉村人口和年份。查看各個特征隨著時間推移發生的變化情況可以分析出未來男女人口比例、城鄉人口變化的方向。

具體步驟:

(1)使用NumPy庫讀取人口數據。
(2)創建畫佈,並添加子圖。
(3)在兩個子圖上分別繪制散點圖和折線圖。
(4)保存,顯示圖片。
(5)分析未來人口變化趨勢。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

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('時間-年份')
plt.ylabel('人口數(萬人)')
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.title('1996~2015年各特征人口變化散點圖')
plt.legend(['年末人口', '男性人口', '女性人口', '城鎮人口', '鄉村人口和年份', '年份'])
# 子圖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(['年末總人口', '男性人口', '女性人口', '城鎮人口', '鄉村人口'])
plt.xlabel('時間-年份')
plt.ylabel('人口數(萬人)')
plt.xticks(range(data.shape[0] - 2), data[:-2, 0], rotation=45)
plt.title('1996-2015年各特征人口數折線圖')
plt.show()

實訓2

需求說明:

通過繪制各年份男女人口數目及城鄉人口數目的直方圖,男女人口比例及城鄉人口比例的餅圖可以發現人口結構的變化。而繪制每個特征的箱線圖則可以發現不同特征增長或者減少的速率是否變得緩慢。

實現步驟:

(1)創建3幅畫佈並添加對應數目的子圖。
(2)在每一幅子圖上繪制對應的圖形。
(3)保存和顯示圖形。
(4)根據圖形,分析我國人口結構變化情況以及變化速率的增減狀況。

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']
pt = plt.figure(figsize=(12, 11))

# 創建子圖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年男性人口總數')
plt.ylabel('人口數據特征')
plt.title('1996~2015年人口數據特征間的關系的直方圖')


# 創建子圖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年女性人口數目')
plt.ylabel('人口數目(萬人)')

# 創建子圖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年城市人口數目')
plt.ylabel('人口數目(萬人)')

# 創建子圖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年鄉村人口數目')
plt.ylabel('人口數目(萬人)')
plt.show()

# 繪制餅圖
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']

pt2 = plt.figure(figsize=(12, 10))
# 創建子圖1
ax1 = pt2.add_subplot(2, 2, 1)
plt.pie(data[:-2, 2], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年男性人口比例')

# 創建子圖2
ax2 = pt2.add_subplot(2, 2, 2)
plt.pie(data[:-2, 3], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年女性人口比例')
# 創建子圖3
ax3 = pt2.add_subplot(2, 2, 3)
plt.pie(data[:-2, 4], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年城市人口比例')

# 創建子圖4
ax4 = pt2.add_subplot(2, 2, 4)
plt.pie(data[:-2, 5], labels=data[:-2, 0], autopct='%1.1f%%')
plt.title('1996-2015年鄉村人口比例')
plt.show()

# 繪制箱線圖
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'  # 漢字字體,優先使用楷體,如果找不到楷體,則使用黑體
plt.rcParams['axes.unicode_minus'] = False  # 這兩行需要手動設置

data = np.load('Data/populations.npz', allow_pickle=True)
feature_names = data['feature_names']
data = data['data']

pt3 = plt.figure(figsize=(12, 10))
label = ['年末總人口', '男性人口', '女性人口', '城鎮人口', '鄉村人口']
plt.boxplot(([list(data[:-2, i]) for i in range(1, 6)]), labels=label, meanline=True)
plt.title('1996-2015年各特征人口數線箱圖')
plt.ylabel('人口數(萬人)')
plt.show()

到此這篇關於Python數據分析應用之Matplotlib數據可視化詳情的文章就介紹到這瞭,更多相關Python Matplotlib可視化內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: