matplotlib是在python中进行数据可视化操作非常好用的一个模块,通过它,我们可以完成MATLAB中的大部分操作,而且比MATLAB更为简单好用。
目前只介绍pyplot模块的使用。
pyplot 基础语法
基本绘图流程:
-
创建画布与创建子图:
第一部分主要作用是构建出一张空白的画布, 并可以选择是否将整个画布划分为多个部
分, 方便在同一幅图上绘制多个图形的情况。 最简单的绘图可以省略第一部分, 而后直接在
默认的画布上进行图形绘制。
-
添加画布内容
第二部分是绘图的主体部分。 其中添加标题, 坐标轴名称, 绘制图形等步骤是并列的,
没有先后顺序, 可以先绘制图形, 也可以先添加各类标签。 但是添加图例一定要在绘制图形
之后。
- 存与展示图形
第三部分主要用于保存和显示图形。
设置 pyplot 的动态 rc 参数
pyplot 使用 rc 配置文件来自定义图形的各种默认属性, 被称为 rc 配置或 rc 参数。
在 pyplot 中几乎所有的默认属性都是可以控制的, 例如视图窗口大小以及每英寸点数、线条宽度、 颜色和样式、 坐标轴、 坐标和网格属性、 文本、 字体等。
线条的常用 rc 参数名称、 解释与取值:
rc参数有两种使用方式:
第一种直接在绘制图形时以参数给出属性值
如:
plt.plot(rang,sin3,color='pink', marker='o', markersize='12', mfc='C', mec='C',linewidth=3, linestyle=':')
第二种使用rcParams
以键值对形式进行设置
# 设置中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 设置正常显示符号,解决保存图像是符号“-”显示方块
# 两个设置一般一起使用
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['lines.linestyle'] = ':'
plt.rcParams['lines.marker'] = '+'
plt.rcParams['lines.linewidth'] = '0.1'
rc常用线条类型解释:
rc线条标记解释:
下面是对常用的统计图形的使用方法的介绍,以代码形式给出。
使用的统计文件见这个长长的链接
使用pyplot绘制散点图
import numpy as np
from matplotlib import pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 设置大文本显示
np.set_printoptions(threshold=10000)
data = np.load("matplot_data/国民经济核算季度数据.npz")
# print(type(data))#<class 'numpy.lib.npyio.NpzFile'>
values = data["values"]
columns = data["columns"]
# print(columns)
# print(values)
"""2000-2017 各产业与行业的国民生产总值散点图"""
# 1.创建画布
f = plt.figure(figsize=(10,13))
# 2.创建子视图
f.add_subplot(2,1,1)
# 3.绘制散点图
# 第一产业
plt.scatter(values[:,0],values[:,3],marker="D")
# 第二产业
plt.scatter(values[:,0],values[:,4],marker="o")
# 第三产业
plt.scatter(values[:,0],values[:,5],marker="+")
# 4.设置样式
# plt.xlabel("产业种类")
plt.ylabel("各产业生产总值(单位:亿元)")
plt.title("2000-2017年各产业的国民生产总值散点图")
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.legend(["第一产业","第二产业","第三产业"])
"""2000-2017 各产业与行业的国民生产总值折线图"""
# 1.创建画布
# f = plt.figure(figsize=(8,8),dpi=200)
# 2.创建子视图
f.add_subplot(2,1,2)
# 3.绘制散点图
# 农林牧渔业
plt.scatter(values[:,0],values[:,6],marker="D")
# 工业
plt.scatter(values[:,0],values[:,7],marker="o")
# 建筑业
plt.scatter(values[:,0],values[:,8],marker="+")
# 批发和零售业
plt.scatter(values[:,0],values[:,9],marker="x")
# 交通运输、仓储和邮政业
plt.scatter(values[:,0],values[:,10],marker="v")
# 住宿和餐饮业
plt.scatter(values[:,0],values[:,11],marker="h")
# 金融业
plt.scatter(values[:,0],values[:,12],marker="*")
# 房地产业
plt.scatter(values[:,0],values[:,13],marker="s")
# 其他行业
plt.scatter(values[:,0],values[:,14],marker="8")
# 4.设置样式
# plt.xlabel("产业种类")
plt.ylabel("各行业生产总值(单位:亿元)")
plt.title("2000-2017年各行业的国民生产总值散点图")
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.legend(["农林牧渔业","工业","建筑业","批发和零售业","交通运输、仓储和邮政业","住宿和餐饮业","金融业","房地产业","其他行业"])
# 5.保存与显示
plt.savefig("img/1.散点图1.png")
plt.show()
使用pyplot绘制折线图
import numpy as np
from matplotlib import pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 设置大文本显示
np.set_printoptions(threshold=10000)
data = np.load("matplot_data/国民经济核算季度数据.npz")
# print(type(data))#<class 'numpy.lib.npyio.NpzFile'>
values = data["values"]
columns = data["columns"]
# print(columns)
# print(values)
"""2000-2017 各产业与行业的国民生产总值散点图"""
# 1.创建画布
f = plt.figure(figsize=(10,13))
# 2.创建子视图
f.add_subplot(2,1,1)
# 3.绘制散点图
# 第一产业
plt.plot(values[:,0],values[:,3],marker="D")
# 第二产业
plt.plot(values[:,0],values[:,4],marker="o")
# 第三产业
plt.plot(values[:,0],values[:,5],marker="+")
# 4.设置样式
# plt.xlabel("产业种类")
plt.ylabel("各产业生产总值(单位:亿元)")
plt.title("2000-2017年各产业的国民生产总值散点图")
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.legend(["第一产业","第二产业","第三产业"])
# 5.保存与显示
# plt.savefig("img/1.散点图1.png")
"""2000-2017 各产业与行业的国民生产总值折线图"""
# 1.创建画布
# f = plt.figure(figsize=(8,8),dpi=200)
# 2.创建子视图
f.add_subplot(2,1,2)
# 3.绘制散点图
# 农林牧渔业
plt.plot(values[:,0],values[:,6],marker="D")
# 工业
plt.plot(values[:,0],values[:,7],marker="o")
# 建筑业
plt.plot(values[:,0],values[:,8],marker="+")
# 批发和零售业
plt.plot(values[:,0],values[:,9],marker="x")
# 交通运输、仓储和邮政业
plt.plot(values[:,0],values[:,10],marker="v")
# 住宿和餐饮业
plt.plot(values[:,0],values[:,11],marker="h")
# 金融业
plt.plot(values[:,0],values[:,12],marker="*")
# 房地产业
plt.plot(values[:,0],values[:,13],marker="s")
# 其他行业
plt.plot(values[:,0],values[:,14],marker="8")
# 4.设置样式
# plt.xlabel("产业种类")
plt.ylabel("各行业生产总值(单位:亿元)")
plt.title("2000-2017年各行业的国民生产总值散点图")
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.legend(["农林牧渔业","工业","建筑业","批发和零售业","交通运输、仓储和邮政业","住宿和餐饮业","金融业","房地产业","其他行业"])
# 5.保存与显示
plt.savefig("img/1.折线图1.png")
plt.show()
使用pyplot绘制柱状图
# 通用设置
import numpy as np
from matplotlib import pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 设置大文本显示
np.set_printoptions(threshold=10000)
# 1.创建画布
f = plt.figure(figsize=(10,12))
# 2.读取数据
data = np.load("./matplot_data/国民经济核算季度数据.npz")
values = data["values"]
columns = data["columns"]
print(columns)
print(values)
"""2000年第一季度各产业生产总值构成分布"""
# 1.创建子视图
f.add_subplot(2,2,1)
# 2.提取数据
value = values[0,3:6]
# print(value)
# 3.绘制柱状图
plt.bar(range(3,6),value,width=0.6)
# 4.样式设计
label=["第一产业","第二产业","第三产业"]
plt.xticks(range(3,6),label)
plt.title("2000年第一季度各产业生产总值构成分布")
plt.xlabel("2000年第一季度")
plt.ylabel("各产业国民生产总值(单位:亿元)")
"""2017年第一季度各产业生产总值构成分布"""
# 1.创建子视图
f.add_subplot(2,2,2)
# 2.提取数据
value = values[-1,3:6]
# print(value)
# 3.绘制直方图
plt.bar(range(3,6),value,width=0.6)
# 4.样式设计
label=["第一产业","第二产业","第三产业"]
plt.xticks(range(3,6),label)
plt.title("2017年第一季度各产业生产总值构成分布")
plt.xlabel("2017年第一季度")
plt.ylabel("各产业国民生产总值(单位:亿元)")
"""2000年第一季度各行业生产总值构成分布"""
# 1.创建子视图
f.add_subplot(2,2,3)
# 2.提取数据
value = values[0,6:]
# print(value)
# 3.绘制柱状图
plt.bar(range(9),value,width=0.3)
# 4.样式设计
label=["农林牧渔业","工业","建筑业","批发和零售业","交通运输、仓储和邮政业","住宿和餐饮业","金融业","房地产业","其他行业"]
plt.xticks(range(9),label,rotation=60)
plt.title("2000年第一季度各产业生产总值构成分布")
plt.xlabel("2000年第一季度")
plt.ylabel("各行业国民生产总值(单位:亿元)")
"""2017年第一季度各行业生产总值构成分布"""
# 1.创建子视图
f.add_subplot(2,2,4)
# 2.提取数据
value = values[-1,6:]
# print(value)
# 3.绘制柱状图
plt.bar(range(9),value,width=0.3)
# 4.样式设计
label=["农林牧渔业","工业","建筑业","批发和零售业","交通运输、仓储和邮政业","住宿和餐饮业","金融业","房地产业","其他行业"]
plt.xticks(range(9),label,rotation=60)
plt.title("2017年第一季度各行业生产总值构成分布")
plt.xlabel("2017年第一季度")
plt.ylabel("各产业国民生产总值(单位:亿元)")
# 5.保存与显示
plt.savefig("img/1.柱状图.png")
plt.show()
使用pyplot绘制扇形图
# 通用设置
import numpy as np
from matplotlib import pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 设置大文本显示
np.set_printoptions(threshold=10000)
# 1.创建画布
f = plt.figure(figsize=(10,12))
# 2.读取数据
data = np.load("./matplot_data/国民经济核算季度数据.npz")
values = data["values"]
columns = data["columns"]
print(columns)
print(values)
"""2000年各产业生产总值在国民生产总值中构成占比"""
# 1.创建子视图
f.add_subplot(2,2,1)
# 2.提取数据
value = values[0,3:6]
# print(value)
# 3.绘制饼状图
label=["第一产业","第二产业","第三产业"]
plt.pie(value,explode=[0.01,0.01,0.01],labels=label,autopct='%.2f%%')
# 4.样式设计
plt.title("2000年各产业生产总值在国民生产总值中构成占比")
"""2017年各产业生产总值在国民生产总值中构成占比"""
# 1.创建子视图
f.add_subplot(2,2,2)
# 2.提取数据
value = values[-1,3:6]
# print(value)
# 3.绘制饼状图
label=["第一产业","第二产业","第三产业"]
plt.pie(value,explode=[0.01,0.01,0.0],labels=label,autopct='%.2f%%')
# 4.样式设计
plt.title("2017年各产业生产总值在国民生产总值中构成占比")
"""2000年各行业生产总值在国民生产总值中构成占比"""
# 1.创建子视图
f.add_subplot(2,2,3)
# 2.提取数据
value = values[0,6:]
# print(value)
# 3.绘制饼状图
label=["农林牧渔业","工业","建筑业","批发和零售业","交通运输、仓储和邮政业","住宿和餐饮业","金融业","房地产业","其他行业"]
plt.pie(value,explode=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01],labels=label,autopct='%.2f%%')
# 4.样式设计
plt.title("2000年各行业生产总值在国民生产总值中构成占比")
"""2017年各行业生产总值在国民生产总值中构成占比"""
# 1.创建子视图
f.add_subplot(2,2,4)
# 2.提取数据
value = values[-1,6:]
# print(value)
# 3.绘制饼状图
label=["农林牧渔业","工业","建筑业","批发和零售业","交通运输、仓储和邮政业","住宿和餐饮业","金融业","房地产业","其他行业"]
plt.pie(value,explode=[0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01],labels=label,autopct='%.2f%%')
# 4.样式设计
plt.title("2017年各行业生产总值在国民生产总值中构成占比")
# 5.保存与显示
plt.savefig("img/1.饼状图.png")
plt.show()
使用pyplot绘制雷达图
import numpy as np
from matplotlib import pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
"""练习"""
# 1.获取数据
data = [3,4,7,9,5,6,8]
data2 = [2,5,7,3,8,9,4]
# 2.创建画布
plt.figure(figsize=(6,6))
# 3.角度与数据范围设置
angles = np.linspace(0,2*np.pi,7,endpoint=False)
# 使用concatenate组合数据进行数据闭合
new_data = np.concatenate((data,[data[0]]))
new_data2 = np.concatenate((data2,[data2[0]]))
# 使用concatenate组合角度进行角度闭合
new_angles = np.concatenate((angles,[angles[0]]))
# 4.绘制雷达图
plt.polar(new_angles,new_data,marker="+")
plt.polar(new_angles,new_data2,marker="D")
# 5.样式设置
plt.title("小明与小黄个人能力对比")
labels = ["智商","情商","动手能力","工作能力","忍耐力","爆发力","拼爹"]
plt.xticks(new_angles,labels,fontsize=10)
plt.legend(["小明","小黄"],fontsize=10)
# 6.保存与显示
plt.show()