栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python基础示例 - Matplotlib 库与数据可视化

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 = 'green', 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='green')             #  marker 点型, 颜色color为blue
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+1e-5),'g')
ax4.legend(['y=log(x)'],loc='lower right')             # 图例在右下方
plt.show()

第四个图如果将ax4.plot(x, np.log(x+1e-5),'g')换成ax4.plot(x, np.log(x),'g')即与示例图一致,但会报divide by zero encountered in log的错误,因为log在负数域计算为无穷小了,导致第四张图无法加载y<0的部分。x+1e-5代表将其转变为高精度浮点数,能够显示的区域就会变大到现在的样子。

 

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

(1)图片的大小、标题title、图例legend、字体大小fontsize      

(2)坐标轴的4个属性:刻度xticks、范围xlim、标签xlabel、字体大小fontsize      

(3)折线图的6个属性:颜色color、点型marker、点型大小marksize、                 线型linestyle 、线宽linewidth、透明度alpha

        

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(r"C:pythonFilespythonProject教材各章数据教材各章数据第11章数据SH000001.xls")                # 沪指综合指数交易数据
sheet = wb.sheet_by_index(0)                                            # 通过索引获取sheet表格
d = sheet.col_values(0)[3100:3400]                                   # 第1列:交易日期
y = sheet.col_values(4)[3100:3400]                                   # 第5列:沪指收盘指数
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='blue')                           # 绘制折线图
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)                                 # rotation=45:旋转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='r',fontsize=12)                # 最高点
plt.text(i_min-75,Min+6, str(Min)+'(最低点)' ,color='r',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(r"C:pythonFilespythonProject教材各章数据教材各章数据第11章数据人均消费金额与人均国民收入.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回归经典二分类数据集(数据:testSet.txt)

import matplotlib.pyplot as plt
def loadDataSet():                                   # ---------定义函数:加载二分类经典数据集 -------------
    x1 = [];  y1 = [] ;  x2 = [];  y2 = []
    f = open(r'C:pythonFilespythonProject教材各章数据教材各章数据第11章数据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='blue',marker='o')            # 类别为0的点:散点图,颜色red,点型:o
plt.scatter(x2,y2,color='black',marker='+')          # 类别为1的点:散点图,颜色blue,点型:+
plt.legend(['类别0','类别1'],loc='upper left')      # 设置图例,位置:左上方
plt.show()

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

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='red', 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='red', 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(r"C:pythonFilespythonProject教材各章数据教材各章数据第11章数据高数线代考试成绩.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='red',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》,如表所示,绘制考研人数的条形图。

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='r',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  利用例题11-11中数据,绘制考研录取人数的横放条形图。

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 利用例题11-11数据,绘制高校毕业、硕研报考、录取人数的并列条形图

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();

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/861974.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号