Python数据可视化 课件 06章Matplotlib库其他绘图函数_第1页
Python数据可视化 课件 06章Matplotlib库其他绘图函数_第2页
Python数据可视化 课件 06章Matplotlib库其他绘图函数_第3页
Python数据可视化 课件 06章Matplotlib库其他绘图函数_第4页
Python数据可视化 课件 06章Matplotlib库其他绘图函数_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python数据可视化第6章Matplotlib库其他绘图函数教师:xxx2024.07第1节

绘制动态图第6章Matplotlib库其他绘图函数第2节

绘制世界地图第3节

文本数据可视化Matplotlib不仅可绘制静态图形,还可绘制动态图形(动画),可保存为.gif动画文件。虽然这个动图功能比较有限,但给用户提供了一种全新的数据展示手段,提升了视觉表现力。第1节

绘制动态图一、

动图函数FuncAnimation动图绘制需使用matplotlib中的animation.FuncAnimation函数。绘制的大致过程为:先编写init初始化及update更新两个子函数,将这两个子函数作为参数传入FuncAnimation函数,此后系统将自动周期性调用update函数更新图像。创建动图的语法格式为:ani=FuncAnimation(fig,func,frames=None,init_func=None,repeat,interval)fig:承载动画的画布func:动画的更新函数(update),用于产生动画的帧frames:一轮动画所需的数据,动画过程中每一帧的数据会传递给更新函数update(n)的形参“n”init_func:初始化函数,每次新一轮动画开始时执行一次,非必须参数repeat:动画是否一直循环,默认值Trueinterval:每帧更新时间间隔,默认值200毫秒一、

动图函数FuncAnimation#设为notebook输出模式,以便在jupyter中观察动画效果%matplotlibnotebookfrommatplotlib.animationimportFuncAnimation #引入动图函数,绘制一条会“动”的余弦曲线x=np.arange(0,2*np.pi,0.01) lines_lst=plt.plot(x,np.cos(x)) #执行后返回Line2D列表line=lines_lst[0] #取出第0根线,这是update函数需要改变的全局对象definit(): #初始化函数,每次新一轮动画开始时执行一次,不是必须的line.set_ydata(np.cos(x))

defupdate(n): #最重要的更新动画函数,每帧自动重复调用#print('帧号:',n)line.set_ydata(np.cos(x+n/10)) #每次传入的n值不同,更新Y轴数据,图像自动更新

ani=FuncAnimation(fig=plt.gcf(), #创建动画对象,gcf()获取当前画布,作为动画的载体func=update, #设置更新函数frames=100, #如为单个整数,则数据序列为range(0,100)init_func=init, #设置初始化函数interval=20,repeat=True) #每帧间隔20毫秒,默认值True,动画一直循环ani.save('img/cos_ani.gif',fps=10) #保存为gif动画文件,每秒10帧一、

动图函数FuncAnimation上例中动图绘制的核心是update(n)函数,用于更新动画的每一帧。每帧更新时,该函数被自动调用,传入数据n,根据n重新计算y坐标值,line.set_ydata()就会更新图形。update函数被自动周期性调用就产生了动画效果。FuncAnimation中的参数frames设定一轮动画的数据序列,本例设置为整数100,则表示数据序列为range(0,100),一轮动画有100帧,此时update(n)更新时传入的n相当于当前帧号。frames也可设定为一个序列,每帧更新时就依次收到序列中的一个数据。机器学习的线性二分类问题中我们需要找一条直线将两类数据分开。在寻找最优直线的过程中需不断更新其斜率和截距,以下的动画模拟演示了更新斜率的过程。#如在spyder中调试,可设为qt弹出窗口模式,观察动画效果%matplotlibqtfrommatplotlib.animationimportFuncAnimationfig,ax=plt.subplots()

#新建画布defupdate(k):

#更新函数,此处k是直线斜率ax.clear()

#清空子图,后续代码重绘各图形对象ax.set_xlim(0,10)ax.set_ylim(0,20)ax.scatter([2,2],[10,15],s=60,marker='D',c='r')

#绘制两类散点ax.scatter([4,8],[7,7.2],s=60,marker='x',c='b')x=np.array([0,10])y=k*x+1

#斜率变动,重算yax.plot(x,

y)

#重新绘制直线ax.text(2,

2,

f'y={k:.2f}*x+1',fontsize=20) #标注公式#本例设定直线斜率在[0,2.4]间变动ani=FuncAnimation(fig,update,frames=np.linspace(0,2.4,20),interval=300,repeat=False)二、直线图动画直线图动画的另一种实现代码如下,两种方法效果相同。frommatplotlib.animationimportFuncAnimationfig,ax=plt.subplots()

#定义画布ax.set_xlim(0,10)ax.set_ylim(0,20)ax.scatter([2,2],[10,15],s=60,marker='D',c='r')

#绘制散点ax.scatter([4,8],[7,7.2],s=60,marker='x',c='b')x=np.array([0,10])k=0y=k*x+1line,=ax.plot(x,y) #返回直线列表(注意line后有一个逗号,用于拆分列表,得到直线)txtobj=ax.text(2,2,f'y={k:.2f}*x+1',fontsize=20) #txtobj对应公式文本defupdate(k):

#更新函数,k是斜率y=k*x+1

#斜率变动,重算yline.set_ydata(y)

#更新直线txtobj.set_text(f'y={k:.2f}*x+1') #更新公式文本ani=FuncAnimation(fig,update,frames=np.linspace(0,2.4,20),interval=300,repeat=False) 二、直线图动画假定某公司在4个城市都有销售,要动态对比各个城市每个月的销售金额,用动态条形图实现如下:np.random.seed(7)city=['武汉','广东','深圳','北京']month=[str(x)+'月'forxinrange(1,13)] #1月至12月data=np.random.randint(100,200,size=(12,4)) #销售数据fig,ax=plt.subplots(figsize=(8,5))defupdate(k): #更新函数

ax.clear() #清空子图

ax.barh(city,data[k],height=0.5,color=['r','g','b','y'],alpha=0.5) #重绘条形图

ax.set_title(month[k],fontsize=20)ani=FuncAnimation(fig,update,interval=500,frames=len(month)) #动画对象三、条形图动画Cartopy库是Python平台下的一款地图工具包,在气象学领域应用广泛。本节介绍该包的使用,教材最后一章会使用这个库绘制全球疫情地图。第2节

绘制世界地图一、地图绘制包CartopyCartopy是一个地图绘制包,提供了多种地图投影和地理信息处理方法。该包提供易于使用的访问接口,可与matplotlib库配合创建满足出版质量的地图。Anaconda平台可在命令行上执行下面的命令安装所需的包。pipinstallcartopy

Cartopy和matplotlib配合使用,两者版本需匹配。Cartopy0.23(2024.7月的最新版本)和matplotlib3.7匹配,Cartopy0.22和matplotlib3.5匹配。Cartopy绘制地图的方式很简单,先按某种投影模式创建子图(即地图),然后使用stock_img方法将背景图片添加到地图中,再根据经纬度添加标注数据。下面展示了两种地图投影模式:importcartopy.crsasccrs #导入cartopy中的ccrs(含多种地图投影模式)ax1=plt.subplot(121,projection=ccrs.Mollweide()) #ccrs.Mollweide圆形地图ax1.stock_img() #设置默认的地图背景ax1.set_title('Mollweide圆形地图',fontsize=16)ax2=plt.subplot(122,projection=ccrs.PlateCarree()) #ccrs.PlateCarree矩形平面地图ax2.stock_img()ax2.set_title('PlateCarree矩形地图',fontsize=16) 一、地图绘制包Cartopy下面根据给定的经纬度在两个城市间连线:importcartopy.crsasccrs ax=plt.axes(projection=ccrs.PlateCarree()) #创建具有地理投影的子图,此子图上的点需用经纬度表示ax.stock_img()city=['纽约','上海']lon=[-74.0,121.48] #经度(东经正值,西经负值)lat=[40.7,31.22] #纬度(北纬正值,南纬负值)ax.plot(lon,lat,lw=2,marker='o',mfc='r') #ax采用地理投影,经纬度会自动定位到地图上forkinrange(len(city)):ax.text(lon[k],lat[k]-5,city[k],ha='center',va='top',c='b',fontsize=20)#标注城市名,ha水平居中 一、地图绘制包Cartopy代码“ax=plt.axes(projection=ccrs.PlateCarree())”按平面矩形投影模式创建子图ax,后续绘图时x坐标对应经度,y坐标对应纬度,经纬度会被自动投影到地图上正确的位置。此外还可以给地图添加地貌线和经纬网格线,如下所示:importcartopy.featureascfeatureimportcartopy.crsasccrsfig=plt.figure(figsize=(8,6),dpi=100)ax=fig.add_subplot(projection=ccrs.PlateCarree())ax.stock_img()#设置网格线的范围并要求标注gl=ax.gridlines(ylocs=np.arange(-90,90+30,30),

xlocs=np.arange(-180,180+60,60),draw_labels=True,linestyle='--')gl.top_labels=False #网格线的上标签不显示gl.right_labels=False #网格线的右标签不显示ax.add_feature(cfeature.COASTLINE) #海岸轮廓线ax.add_feature(cfeature.RIVERS) #河流轮廓线ax.add_feature(cfeature.LAKES) #湖泊轮廓线 一、地图绘制包Cartopy本例演示使用cartopy的API接口给国家着色,利用颜色可直观区分各国的诸如人口、经济等数据。首先借助cartopy.io.shapereader内的natural_earth和Reader接口完成各个国家地理信息的获取。natural_earth用于获取世界地理信息的文件路径,Reader读取文件得到国家的经纬度和轮廓线等地理信息。然后用add_geometries在地图上描绘国家边界线并同时根据统计数据填充颜色,最后再添加一个颜色标尺显示颜色和和值的对应关系。代码实现如下:二、世界地图着色importmatplotlibasmplimportcartopy.crsasccrsfromcartopy.ioimportshapereader #引入相关地理文件接口np.random.seed(7)#1.设置国家地理文件的路径信息filename=shapereader.natural_earth(resolution='110m',category='cultural',name='admin_0_countries')#创建地理文件阅读器对象reader=shapereader.Reader(filename)二、世界地图着色#2.用随机数模拟每个国家的数据(数据个数和reader中包含的国家和地区数一样)data=np.random.randint(50,1000,len(list(reader.records())))#数据中的最大值,用于颜色转换max_value=data.max()#3.创建世界地图fig=plt.figure(figsize=(8,6),dpi=100)ax=fig.add_subplot(projection=ccrs.PlateCarree())#4.遍历国家,country中含有国家的地理数据fori,countryinenumerate(reader.records()):rgba=mpl.cm.rainbow(data[i]/max_value) #将数据利用rainbow()工具转为rgba元组颜色#子图上添加国家,参数(国家地理信息,投影类型,填充颜色,边界线颜色)ax.add_geometries([country.geometry],ccrs.PlateCarree(),facecolor=rgba,edgecolor='k')生成一些随机数据,作为每个国家的模拟统计数据。数据个数要和文件内的国家和地区数一致;创建地理投影子图,仍使用平面矩形投影模式;遍历reader中的国家,将统计数据用rainbow()工具转换为一个rgba颜色元组。二、世界地图着色#5.在子图右侧添加新绘图区(颜色标尺)cax=fig.add_axes([0.92,0.25,0.02,0.5])#创建颜色的归一化转换器norm=mpl.colors.Normalize(vmin=50,vmax=max_value)#创建颜色标尺并添加到cax子图mpl.colorbar.ColorbarBase(cax,cmap=mpl.cm.rainbow,norm=norm)在子图右侧添加颜色标尺。此处不能使用以前的plt.colorbar()方法添加,因为add_geometries绘图命令并没有使用cmap参数,系统无从参照去绘制颜色条。此处的颜色标尺需人工设定,先用归一化转化器Normalize将统计数据归一化到0~1之间,再使用ColorbarBase创建一个颜色条并添加到cax子图中。文本可视化可以分为文本内容可视化、文本关系可视化和文本多特征信息可视化三个方面。其中,文本的内容可以通过关键词、短语、句子和主题进行展示。本节介绍文本内容可视化中关键词的词云绘制方法。第3节

文本数据可视化importre #引入正则模块regdp='2020年我国的GDP总量是100万亿元're.findall('\d+',gdp)

#从文本中提取所有的数字,\d+代表所有数字Out:['2020','100'] #返回提取得到的信息列表re.findall('\D+',gdp)

#从文本中提取所有的非数字,\D+代表非数字Out:['年我国的GDP总量是','万亿元']一、正则表达式文本处理需要从文本中提取信息,正则表达式是最好的提取工具。正则表达式使用特定的规则去匹配或检索字符串。例如“\d+”匹配一连串数字,“[a-z]+”匹配一连串小写字母。在支持正则表达式的编程语言中,正则表达式的语法规则是一样的,区别只在于支持的语法数量有略微差异。元字符用于匹配某类字符,表达某种规则,常用的元字符如下:. :句点符匹配除了换行符\n外的任意单个字符\w :匹配字符(英文或中文)和数字,即[a~zA~Z中文0-9]\W :匹配任何非单词字符,与\w相反\d :匹配数字[0-9]\D :匹配非数字的字符,与\d相反\s :匹配单个空白字符,如空格、换行符\n,回车符\r,制表符\t等\S :匹配任何非空白字符,与\s相反^ :匹配字符串的开始$ :匹配字符串末尾\ :取消转义,将元字符视为普通字符* :前词可重复0次到无限次? :前词可重复0次或1次+ :前词可重复1次到无限次() :()内包含要提取的内容表达一、正则表达式正则表达式的功能异常强大,写法非常灵活。有时表达形式很复杂,要多次尝试才能找到正确的规则。re模块中常用的正则函数如下:importrere.findall(pattern,string,flags) #查找返回所有匹配的字符串列表re.match(pattern,string,flags)

#必须从头部开始匹配,返回匹配对象或None值re.search(pattern,string,flags) #可从任意位置开始匹配,返回匹配对象或None值re.split(pattern,string,flags) #分割字符串re.sub(pattern,repl,string,count=0,flags=0) #替换子字符串参数中“pattern”代表正则表达式,“string”表示要匹配的字符串,“flags”是标志位,控制匹配方式,例如是否区分大小写、多行匹配等。一、正则表达式下面是一些正则表达式的示例:s

=

'Pythonisaprogramminglanguage're.findall('p',s)

#查找字母pOut:['p']

#默认区分大小写,所以只找到一个小写pre.findall('p',s,flags=re.I)

#re.I表示忽略大小写Out:['P','p']

#大写、小写p均找到re.findall('\w+',

s)

#提取所有单词Out:['Python','is','a','programming','language']re.findall('\w{6,8}',

s)

#提取6-8个字符长度的单词,{6,8}长度限定Out:['Python','programm','language']re.findall('\w{7,}',

s)

#提取长度>=7的单词,注意{7,}逗号后没有空格Out:['programming','language']一、正则表达式s='网址,联系邮箱abc@126.com。're.findall('http://[a-z0-9\.]+\.[a-z0-9]+',s,flags=re.I) #提取网址Out:['']一、正则表达式正则表达式“http://[a-z0-9\.]+\.[a-z0-9]+”表示匹配“http://英文数字.英文数字”这样的字符串。“[a-z0-9\.]+”中的“[a-z0-9]”代表所有的英文字母和数字,“\.”代表句点(句点本是元字符,前面加斜杠\停止转义,只代表句点本身),“+”号代表任意多个。为便于理解,这个表达式写得比较简单,并不完善,无法匹配所有的网址。re.findall('a(\d+)b','xa23bcc45xx') #a(\d+)b表示只提取ab中间的数字Out:['23'] #只提取23,数字45没有取出上例的“()”很有用,前后的a和b是匹配规则,当匹配时,就取出()中匹配的内容。一、正则表达式re.search函数用于查找字符串中可匹配的子串,找到第一个匹配项即返回,如果没有匹配项就返回None。re.match函数必须从字符串首位置开始匹配。search()和match()都仅匹配一次,findall()则匹配所有符合规则的子串。s='Pythonisaprogramminglanguage'r=re.search('is',s)r #r的类型是re.MatchOut:<re.Matchobject;span=(7,9),match='is'>r.start(),r.end(),r.group() #匹配的起始、结束位置、匹配的字符串Out:(7,9,'is')re.match('is',s)

#将返回空None,因为'is'不在s的首部re.match('Python',s)

#匹配成功Out:<re.Matchobject;span=(0,6),match='Python'>一、正则表达式re.split()提供了灵活的分割形式,帮助我们分离字符串。s

=

'Python;is,a,\\language' #内含多种形式的分隔符;,\\s.split()

#字符串自身的split()无法完全正确分割Out:['Python;','is,','a',',','\\','language']re.split(r'\W+',s)

#利用正则表达式分割,\W非单词字符Out:['Python','is','a','language'] #将单词完美切分出来上述代码说明字符串自身的split()分解的结果不够理想,单词末尾还有标点符号,利用re.split()可以得到更完美的单词分解列表。二、

分词分词是将句子分解为单个词汇,以便计算机做后续的处理。英文中词与词是用空格分隔的,英文分词只需借助字符串分解函数split()即可。考虑到标点符号的存在,如要得到一个相对干净的词语列表,可使用re.split()函数做分解,或先用re.sub()函数将所有标点符号替换为空格,再使用split()做分词。txt='Python;Ilovepython.'txt=txt.lower() #全部转为小写txt=re.sub('\W+','',txt) #将非单词字符(\W)都用空格替换,相当于去除标点符号print(txt)lst=txt.split() #默认以空格为分隔符分解字符串print(lst)Out:pythonilovepython['python','i','love','python']二、

分词python平台下我们常使用第三方库jieba做中文分词,在命令行上执行如下命令安装jieba库。pipinstalljiebaimportjiebas='欢迎报考广东金融学院的相关专业!'print('原句子:',s)lst=jieba.lcut(s)print(lst) #更新词库之前的分词结果print('**************更新词库后**************')jieba.add_word('广东金融学院') #临时添加新词"广东金融学院"print(jieba.lcut(s)) #更新词库之后的分词结果Out:原句子:欢迎报考广东金融学院的相关专业!['欢迎','报考','广东','金融','学院','的','相关','专业','!']**************更新词库后**************['欢迎','报考','广东金融学院','的','相关','专业','!']二、

分词jieba库的更多信息可访问链接/fxsjy/jieba。jieba.load_userdict("data/mydict.txt") #加载自定义词典s='淘金坑小区有一个工信出版集团的办事处'print(jieba.lcut(s)) #有了自定义词典,专有名词可正确分词 如果用户有很多专有名词,可通过添加自定义词典的方式解决。用记事本创建一个文本文件mydict.txt,每一行输入一个自定义词,如右图所示,将文件保存在应用程序所在的目录中,保存时编码一定要选为UTF-8格式。Out:['淘金坑','小区','有','一个','工信出版集团','的','办事处']三、绘制词云图fromwordcloudimportWordCloud #导入词云库s='''Withtheimprovingofsemiconductort

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论