Python | Matplotlib库与数据可视化

例11-1 给定11个点坐标,绘制简单折线图 (x,y)

代码示例:

import numpy as np
import matplotlib.pyplot as plt  # 引入绘图库

x = np.arange(11)  # 从0开始,步长为1 的11个整数
y = np.array([0.15, 0.16, 0.14, 0.17, 0.12, 0.16, 0.1, 0.08, 0.05, 0.07, 0.06])  # 取11个数
plt.plot(x, y, color='cornflowerblue', marker='o')  # 绘制11个点的折线图
plt.show()

运行结果:

 

例11-2 绘制散点图 y = sin(x)

代码示例:

import matplotlib.pyplot as plt;
import numpy as np

x = np.linspace(0, 2 * np.pi, 30)  # 将[0,2*PI]等分为30份的一维数组
y = np.sin(x)
plt.scatter(x, y, marker='.', color='cornflowerblue')  # marker 点型
plt.show()

运行结果:

 

 

例11-3 绘制4个子图

代码示例:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 100)
fig = plt.figure(figsize=(8, 6), dpi=80)
ax1 = fig.add_subplot(2, 2, 1)  # (2,2)表示将画布分成2行,2列,可画4个子图
ax1.plot(x, x)
ax1.legend(['y=x'])
ax2 = fig.add_subplot(2, 2, 2)  # 这是第2个子图
ax2.plot(x, -x, 'r');
ax2.legend(['y=-x'])
ax3 = fig.add_subplot(2, 2, 3)  # 这是第3个子图
ax3.plot(x, x ** 2, 'b')
ax3.legend(['y=x*x'])
ax4 = fig.add_subplot(2, 2, 4)  # 这是第4个子图
ax4.plot(x, np.log(x), 'g')
ax4.legend(['y=log(x)'], loc='lower right')  # 图例在右下方
plt.show()

运行结果:

 

 

例11-4 用画布的各种设置,绘制折线图:y = sin(x),z = cos(x)

代码示例:

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)
f = plt.figure(figsize=(8, 4), dpi=80)  # 画布大小:宽8英寸,高4英寸
f.set_facecolor((0.92, 0.92, 0.96))  # 设置坐标轴颜色
plt.title('正弦、余弦函数图形', fontsize=12)  # 标题 ,字体大小:12
plt.xlabel('x 变量', fontsize=12)  # x轴标签
plt.ylabel('y 变量', fontsize=12)
plt.xlim((0, 6.6))  # 确定x轴范围
plt.ylim((-1, 1))
plt.xticks(np.arange(0, 6.6, 0.4))  # 确定 x 轴刻度
plt.yticks(np.arange(-1, 1, 0.2))
plt.plot(x, y, marker='o', linestyle='-', linewidth=1.2)  # 绘制正弦折线图:点型、线型、线宽
y = np.cos(x)
plt.plot(x, y, color='r', marker=',', linestyle='-', linewidth=1.2)  # 绘制余弦:颜色、点型、线型、线宽
plt.legend(['y=sin(x)', 'y=cos(x)'], fontsize=12)  # 设置图例
plt.text(3.2, np.sin(3.2) + 0.08, 'y = sin(3.2)', fontsize=12)  # 在点(3.2,sin(3.2)+0.08)处添加文本
plt.show()

运行结果:

 

 

例11-5  绘制沪指综合指数收盘数据趋势图

代码示例:

import numpy as np
import xlrd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'
wb = xlrd.open_workbook("SH000001.xls")
sheet = wb.sheet_by_index(0)
d = sheet.col_values(0)[3100:3400]
y = sheet.col_values(4)[3100:3400]
f = plt.figure(figsize=(8, 4), dpi=80)
plt.xlabel('交易日期', fontsize=12)
plt.ylabel('沪指综合收盘指数', fontsize=12)
x = range(0, len(y));
t = []
plt.plot(x, y, marker=',', c='coral')
for i in range(len(d)):
    a = str(int(d[i]));
    b = a[0:4] + "." + a[4:6] + "." + a[6:8]
    t.append(b)
plt.xticks(range(0, 300, 15), t[0:300:15], rotation=45)
date1 = t[0];
date2 = t[-1];
f.set_facecolor((0.92, 0.92, 0.96))
plt.title('沪指综合收盘指数' + '(日期:' + date1 + '-' + date2 + ')', fontsize=12)
i_min, Min = np.argmin(y), np.min(y)
i_max, Max = np.argmax(y), np.max(y)
plt.text(i_max + 3, Max - 10, str(Max) + '(最高点)', color='blue', fontsize=12)
plt.text(i_min - 75, Min + 6, str(Min) + '(最低点)', color='blue', fontsize=12)
plt.show()

运行结果:

例11-6  绘制 :y = x **3 散点图(10个点)

代码示例:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 16, 10)  # 把[0,16]分为10等份
y = x ** 3
c = []  # 颜色列表
size = []  # 大小列表
for i in range(10):
    size.append(20 + i ** 3)  # i越大,点的形状越大
    if i % 2 == 0:  # 能被 2 整数
        c.append('red')  # 偶数: 红色
    else:
        c.append('blue')  # 奇数: 蓝色
plt.scatter(x, y, color=c, s=size)  # 散点图
plt.legend(['y=x^3'], fontsize=10)
plt.show()

运行结果:

 

例11-7   绘制:人均消费金额y与人均国民收入x之间的散点图

代码示例:

import matplotlib.pyplot as plt;
import xlrd

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
wb = xlrd.open_workbook("./人均消费金额与人均国民收入.xls")
sheet = wb.sheet_by_index(0)  # 通过索引获取表格
col_1 = sheet.col_values(2)  # 获取第2列内容:人均国民收入
col_2 = sheet.col_values(3)  # 获取第3列内容:人均收费金额
x = col_1[1:21]
y = col_2[1:21]  # 获取第1行至20行数据
plt.figure(figsize=(8, 5))  # 设置图片大小
plt.title('人均国民收入与人均消费金额散点图', fontsize=15)  # 标题
plt.xlabel('人均国民收入 x (元)', fontsize=12)  # 设置x标签及字体大小
plt.ylabel('人均消费金额 y (元)', fontsize=12)
plt.scatter(x, y, color='blue', marker='o')  # 散点图:marker表示点的形状
plt.show()

运行结果:

例11-8  logistic回归经典二分类数据集

代码示例:

import matplotlib.pyplot as plt


def loadDataSet():  # 定义函数:加载二分类经典数据集
    x1 = [];
    y1 = [];
    x2 = [];
    y2 = []
    f = open('./testSet.txt')  # 打开文本文件
    for line in f.readlines():  # 按行迭代读取数据
        lineList = line.strip().split()  # 按默认字符(空格)拆分数据
        if int(lineList[2]) == 0:  # 类别0 的点
            x1.append(float(lineList[0]))
            y1.append(float(lineList[1]))
        else:  # 类别1的点
            x2.append(float(lineList[0]))
            y2.append(float(lineList[1]))
    return x1, y1, x2, y2


x1, y1, x2, y2 = loadDataSet()  # 二维点(x,y)的分类: 0 或 1
plt.rcParams['font.sans-serif'] = ['SimHei']  # 绘图时可以显示中文
plt.rcParams['axes.unicode_minus'] = False
plt.title('二维随机变量(x,y)散点图分类', fontsize=12)  # 标题
plt.xlabel('随机变量 x ', fontsize=12)
plt.ylabel('随机变量 y ', fontsize=12)
plt.scatter(x1, y1, color='red', marker='o')  # 类别为0的点:散点图,颜色red,点型:o
plt.scatter(x2, y2, color='blue', marker='+')  # 类别为1的点:散点图,颜色blue,点型:+
plt.legend(['类别0', '类别1'], loc='upper left')  # 设置图例,位置:左上方
plt.show()

 运行结果:

 

例11-9 绘制:随机生成10000数据,服从均值为0,方差为1的正态分布的频率直方图

代码示例:

import matplotlib.pyplot as plt;
import numpy as np

plt.figure(figsize=(8, 4), dpi=80)
np.random.seed(0);
d = np.random.normal(0, 1, 10000)  # 生成10000个标准正态分布数据
n, bins, patches = plt.hist(d, 30, density=0, facecolor='blue', alpha=0.8, edgecolor='white', lw=1)
plt.show()

运行结果:

 

绘制:服从均值为0,方差为1的正态分布的概率密度直方拟合图

代码示例:

import matplotlib.pyplot as plt;
import numpy as np

plt.figure(figsize=(8, 4), dpi=80)
np.random.seed(0);
d = np.random.normal(0, 1, 10000)  # 生成10000个标准正态分布数据
n, bins, patches = plt.hist(d, 30, density=1, facecolor='blue', alpha=0.8, edgecolor='white', lw=1)
y = np.exp(-0.5 * bins * bins) / np.sqrt(2 * np.pi)  # 概率密度值
plt.plot(bins, y, 'r-')  # 概率密度折线图
plt.title(r'Histogram of IQ: $\mu=0$, $\sigma=1$')  # 用专用格式化符号,添加标题,r表示不转义
plt.show()

运行结果:

 

例11-10  文件:高数线代考试成绩.xls包含了某年级同学的考试成绩。根据这些成绩,绘制频率直方图

代码示例:

import numpy as np;
import xlrd;
import matplotlib.pyplot as plt

wb = xlrd.open_workbook("./高数线代考试成绩.xls")
sheet = wb.sheet_by_index(0)  # 通过索引获取sheet表格
col_2 = sheet.col_values(3)  # 获取第3列内容:考试成绩
x = np.array(col_2[1:], dtype=float)  # 考试成绩
f = plt.figure(figsize=(8, 4), dpi=80)  # 设置画布大小
f.set_facecolor((0.92, 0.92, 0.96))  # 设置坐标轴颜色
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False
n, bins, patches = plt.hist(x, 10, density=1, facecolor='blue', edgecolor='white', lw=1, alpha=0.75)
mu = np.mean(x)  # 平均值
sigma = np.std(x)  # 标准差
y = np.exp(-0.5 * (bins - mu) * (bins - mu) / (sigma ** 2)) / (np.sqrt(2 * np.pi) * sigma)  # 密度值
plt.plot(bins, y, 'r-')  # 概率密度折线拟合图
plt.title('高等数学考试成绩频率直方图' + ',人数:' + str(len(x)))
plt.legend([r'正态分布: $\mu=%.2f$, $\sigma=%.2f$' % (mu, sigma)])
plt.show()

运行结果:

 

 

例11-11 根据文件《普通高校毕业生人数、考研报考人数、考研录取人数.xls》,如表11-6 所示,绘制考研人数的条形图

代码示例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ('2016', '2017', '2018', '2019', '2020')  # 条形图标签数据:年份(对应x轴)
y = [177, 201, 238, 290, 341]  # 硕研报考人数(条形图高度数据)
plt.bar(x, y, color='b', width=0.45, tick_label=x, edgecolor='k')  # 条形的边框颜色
plt.xticks(fontsize=12);
plt.yticks(fontsize=12)  # 坐标轴刻度:字体大小
plt.title('我国硕士研究生报考人数(2016-2020年)', fontsize=13)
for i in range(len(x)):  # 添加文本数据
    plt.text(i - 0.3, y[i] + 12, str(y[i]) + '万人', fontsize=12)
plt.show()

运行结果:

 

例11-12 绘制考研录取人数的横放条形图

代码示例:

import matplotlib.pyplot as plt

f = plt.figure(figsize=(5, 3), dpi=80)  # 设置画布大小
f.set_facecolor((0.92, 0.92, 0.96))  # 设置坐标轴颜色
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
y = ('2016', '2017', '2018', '2019', '2020')  # 条形图标签数据:年份(对应y轴)
w = [59, 72.2, 76.3, 80, 111.4]  # 硕研录取人数(条形图宽度数据)
c = ['g', 'r', 'b', 'g', 'b']  # 条形图的颜色列表
plt.barh(y, w, height=0.5, color=c, tick_label=y)  # 绘制横放条形图
plt.title('我国硕士研究生录取人数(2016-2020年)', fontsize=13)
plt.xticks(fontsize=12);
plt.yticks(fontsize=12)
plt.xlabel('人数', fontsize=12);
plt.ylabel('年份', fontsize=12)
for i in range(len(y)):
    plt.text(w[i] + 2, y[i], str(w[i]) + '万人')
plt.show()

运行结果:

 

 

例11-13 绘制高校毕业、硕研报考、录取人数的并列条形图

 代码示例:

import matplotlib.pyplot as plt;
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei'];
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(8, 4), dpi=80)
x = ('2016', '2017', '2018', '2019', '2020')  # 条形图标签数据:年份(对应x轴)
h1 = [765, 795, 820, 834, 874]  # 普通高校毕业人数
h2 = [177, 201, 238, 290, 341]  # 硕研报考人数(条形图高度数据)
h3 = [59, 72.2, 76.3, 80, 111.4]  # 硕研录取人数(条形图宽度数据)
bar_width = 0.6  # 条形宽度
bar1 = np.arange(0, len(x) * 2, 2)  # 条形图1的横坐标位置
bar2 = bar1 + bar_width  # 条形图2的横坐标位置
bar3 = bar2 + bar_width  # 条形图2的横坐标位置
plt.bar(bar1, height=h1, width=bar_width, color='b', label='毕业人数')
plt.bar(bar2, height=h2, width=bar_width, color='g', label='报考人数')
plt.bar(bar3, height=h3, width=bar_width, color='r', label='录取人数')
plt.xticks(bar1 + bar_width, x, fontsize=12)
plt.ylim(0, 1200);
plt.yticks(fontsize=12)  # 坐标轴范围、刻度:字体大小
plt.title('普通高校毕业、硕研报考、录取人数(2016-2020年),单位:万人', fontsize=13)
plt.legend(loc='upper left')  # 显示图例
for i in range(len(x)):  # 添加文本数据
    plt.text(i * 2 - 0.2, h1[i] + 12, str(h1[i]), fontsize=12)
    plt.text(i * 2 + 0.4, h2[i] + 12, str(h2[i]), fontsize=12)
    plt.text(i * 2 + 1.0, h3[i] + 12, str(h3[i]), fontsize=12)
plt.show()

运行结果:

 

例11-14  据某一年度数据,我国部分地区各类在校学生总数2.82亿人,绘制饼图

 代码示例:

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
label = ["幼儿园", "小学生", "初中生", "高中生", "高校生", "研究生", "其他"]
data = [4713.88, 10561.24, 4827.14, 3994.9, 3715.63, 286.37, 101]
exp = [0, 0, 0, 0, 0.1, 0, 0.32]  # 各项离饼图圆心为n个半径
plt.pie(x=data, labels=label, explode=exp, shadow=True)
plt.pie(x=data, labels=label, explode=exp, shadow=True, autopct='%1.0f%%')
plt.legend()
plt.show()

运行结果:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值