第8章 Python数据可视化
8.1 爬虫与大数据
网络爬虫(Web Spider)又称之为网络机器人、网络蜘蛛,是一种通过既定规则,能够自动提取网页信息的程序。
在大数据架构中,数据收集与数据存储占据了极为重要的地位。
大数据的核心基础
爬虫技术在这两大核心技术层次中占有很大的比例。
任意打开一个网页(如 https://www.jd.com/ ),鼠标右键单击,从弹出的快捷菜单中选择“检查”,即可查看到该网页结构的相应代码
无论我们通过浏览器打开网站、访问网页,还是通过脚本对URL网址进行访问,本质上都是对HTTP服务器的请求
浏览器上所呈现的、控制台所显示的都是HTTP服务器对我们请求的响应。
网页请求和响应的过程
Request(请求):每一个用户打开的网页都必须在最开始由用户向服务器发送访问的请求。
Response(响应):服务器在接收到用户的请求后,会验证请求的有效性,然后向用户发送相应的内容。客户端接收到服务器的相应内容后,再将此内容展示出来,以供用户浏览。
- 使用爬虫来获取网页数据的时候,一般要经过以下几步:
- 发送请求
- 获取相应内容
- 解析内容
- 保存数据
1、urllib模块
urllib是URL和lib两个单词共同构成的,URL就是网页的地址,lib是library(库)的缩写。
URL的一般格式为(带方括号[]的为可选项):protocol://hostname[port]/path/[; parameters][?query]#fragment。
– https://www.baidu.com/?tn=62095104_33_oem_dg
2、Requests库
Requests 是用Python语言编写,基于urllib
采用 Apache2 Licensed 开源协议的 HTTP 库
它比 urllib 更加方便,可以节约开发者大量的工作,完全满足 HTTP 测试需求。
使用GET方式抓取数据,代码如下:
import requests
url="http://www.baidu.com"
strhtml=requests.get(url)
print(strhtml.text)
3、正则表达式
正则表达式又称为规则表达式,是对字符串进行操作的一种逻辑公式
用事先定义好的一些特定的字符及这些特定字符的组合,组成一个规则字符串,用来检索、替换那些符合某项规则的文本。
构造正则表达式的方法和创建数学表达式的方法相同,用多种元字符与运算符较小的表达式结合一起来创建更大的表达式。
常见的正则表达式的规则说明
正则表达式 | 说明 |
---|---|
\d | “\d”代表一个数字 |
\D | “\D”代表一个非数字 |
* | “*”代表任意的字符 |
[] | “[]”内的字符只能取其一 |
{} | “{}”指定的字符的个数 |
+ | “+”表示前一个字符至少出现一次 |
- | “-”表示一个范围 |
? | “?”表示前一个字符出现0次或者1次 |
. | “.”表示匹配除换行符(\n)以外的任意字符 |
\w | “\w”匹配字母或数字或下划线或汉字0-9、a-z、A-Z、_(下划线)、汉字和其他国家的语言符号 |
\W | 匹配非字母或数字或下划线或汉字,跟\w正好相反 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
例如,声明“电话号码”,读取的数据类型由“*-**”组成,(0553-2010100)
密码,前三位字母,后面6位数字
– [a-zA-Z]{3} \d{6}
re 模块的一般使用步骤如下:
- 使用 compile 函数将正则表达式的字符串形式编译为一个 Pattern 对象
- 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果(findall, match, search)
- 使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作。
4、BeautifulSoup
- 从HTML或XML文件中提取数据的Python库
- BeautifulSoup4
pip install beautifulsoup4
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python标准库 | BeautifulSoup(markup, "html.parser") | •Python的内置标准库 •执行速度适中 •文档容错能力强 | •Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差 |
lxml HTML 解析器 | BeautifulSoup(markup, "lxml") | •速度快 •文档容错能力强 | •需要安装C语言库 |
lxml XML 解析器 | BeautifulSoup(markup, ["lxml-xml"]) BeautifulSoup(markup, "xml") | •速度快 •唯一支持XML的解析器 | •需要安装C语言库 |
html5lib | BeautifulSoup(markup, "html5lib") | •最好的容错性 •以浏览器的方式解析文档 •生成HTML5格式的文档 | •速度慢 •不依赖外部扩展 |
Select方法
– 通过标签名查找 soup.select('title’)
– 通过类名查找soup.select('.sister’)
– 通过 id 名查找soup.select('#link1’)
– 组合查找soup.select('p #link1’)
– 属性查找soup.select('p a[href="http://example.com/elsie"]’)
– 直接子标签查找soup.select("head > title")
实例
抓取酷狗音乐TOP500的歌曲名单
def get_info(url):
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
wb_data = requests.get(url,headers)
soup = bs(wb_data.text,'lxml')
ranks = soup.select('span.pc_temp_num') #[1,2,3,4,.....,5]
titles = soup.select('div.pc_temp_songlist > ul > li > a') #[ssss-aaa,dddd-2222,....]
times = soup.select('span.pc_temp_tips_r > span') #[3:41,3:11,.....]
for rank,title,time in zip(ranks,titles,times):
data = {
'rank':rank.get_text().strip(),
'singer':title.get_text().split('-')[0],
'song':title.get_text().split('-')[1],
'time':time.get_text().strip()
}
print(data)
if __name__ == '__main__':
urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(0,24)]
for url in urls:
get_info(url)
time.sleep(1)
- 实例
- 抓取网页中图片并保存在本地文件夹中
from urllib import response as resp
from urllib import request as req
from urllib import parse
import requests
from bs4 import BeautifulSoup as bs
import time,re,os
def Picture_Download(url_img_path, img_title):
file_name = img_title.replace('/', ' ').strip()
try:
result = requests.get(url_img_path.strip())
except:
print(url_img_path, ' Download failed')
else:
if result.status_code == 200:
time.sleep(2)
File = open("images/"+file_name, 'wb')
File.write(result.content)
File.close()
def Img_Url(url):
result = requests.get(url)
result.encoding = 'UTF-8'
compile = re.compile(r'<img src="(.*?)"')
all = compile.findall(result.text)
for item in all:
item1 = item.split("../")
if(len(item1)==1):
item1 = item[1:len(item)]
else:
item1 =item1[-1]
path= os.path.join("https://www.ahnu.edu.cn",item1)
path=path.replace("\\","/").strip()
Picture_Download(path, item1)
if __name__ == '__main__':
Img_Url("https://www.ahnu.edu.cn/info/1123/46450.htm")
8.2 本节小结
(1)网络爬虫(Web Spider)又称之为网络机器人、网络蜘蛛,是一种通过既定规则,能够自动提取网页信息的程序。网络爬虫在信息搜索和数据挖掘过程中扮演着重要的角色。
(2)基础爬虫框架主要包括五大模块,分别为爬虫调度器、URL管理器、HTML下载器、HTML解析器和数据存储器。
(3)使用 Python编写爬虫代码,需要用到Python专门的urllib模块和Requests库。
8.3 Python可视化库简介
- 使用Python中的扩展库,可以较为轻松的实现数据可视化
- 一般来讲,Python可视化的实现以numpy库和matplotlib库为基础
- 除此以外,还有一些其他的可视化库,如pandas库、seaborn库、Bokeh库以及pyqtgraph库等。
1、matplotlib可视化库
matplotlib库是Python下著名的绘图库,也是Python可视化库的基础库, matplotlib库的功能十分强大。为了方便快速绘图,matplotlib通过pyplot模块提供了一套和Matlab类似的绘图API,将众多绘图对象所构成的复杂结构隐藏在这套API内部。
因此,只需要调用pyplot模块所提供的函数就可以实现快速绘图以及设置图表的各种细节。
2、Numpy库
numpy库是Python做数据处理的底层库,是高性能科学计算和数据分析的基础,比如著名的Python机器学习库SKlearn就需要numPy的支持。掌握numPy的基础数据处理能力是利用Python做数据运算及机器学习的基础。
同时,在数据可视化中也时常需要用到numpy中的数组存储以及矩阵运算等功能,因此了解numpy库对开发数据可视化十分有用
3、pandas库
pandas库是Python下著名的数据分析库,主要功能是进行大量的数据处理,同时也可以绘制高效的完成绘图的工作。
与 matplotlib库相比,pandas库绘图方式更加简洁。
4、seaborn库
seaborn是基于matplotlib的Python可视化库。
提供了一个高级界面来绘制有吸引力的统计图形,可以使得数据可视化更加的方便,美观。
5、Bokeh库
Bokeh库是一款针对现代Web浏览器呈现功能的交互式可视化库。
通过Python以快速简单的方式为超大型数据集提供高性能交互的多功能图形。
6、pyqtgraph库
在Python中除了上述的几个可视化库以外,还有一些可视化库,例如pyqtgraph库。
pyqtgraph库是一种建立在PyQt4/PySide和numpy库基础之上的纯Python图形GUI库,在数学、科学和工程领域都有着广泛的应用
该库完全用python编写,但内部由于使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架。因此,它在大数据量的数字处理和快速显示方面有着巨大的优势。
7、Python可视化库的安装与使用
在Windows7下安装Python可视化库,常用pip命令来实现,如输入命令pip install matplotlib来安装matplotlib库。安装完成后,可在Windows命令行中输入Python,并在进入Python界面后输入以下命令:
import matplotlib import pandas import seaborn import bokeh import pyqtgraph import numpy
8.4 可视化基础numpy库简介
1.numpy库简介
numpy库主要用于数据分析,在进行数据可视化时,常常需要使用到numpy库中的计算功能。一般来讲,numpy库具有以下特征:
– numpy库中最核心的部分是ndarray 对象。它封装了同构数据类型的n维数组,它的功能将通过演示代码的形式呈现。
– 在数组中所有元素的类型必须一致,且在内存中占有相同的大小。
– 数组元素可以使用索引来描述,索引序号从0开始。
– numpy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在numpy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量。
2.numpy库的使用
1) numpy库数组的创建
– 在numpy库中创建数组可以使用如下语法:
– numpy.array
– 该语句表示通过引入numpy库创建了一个ndarray对象。
【例8-1】创建数组对象,代码如下。
import numpy as np
a = np.array([1,2,3])
print (a)
2)numpy数组参数
在创建数组时,可以加入如下参数:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
【例8-2】创建一个多维数组对象,代码如下
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print (a)
【例8-3】显示多维数组的数据类型,代码如下。
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]],dtype=complex)
print (a)
3)ndarray对象的基本属性
- 在创建了一个数组以后,可以查看ndarray对象的基本属性
【例8-4】显示多维数组的维度,代码如下
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print (a.shape)
【例8-5】显示数组中每个元素的字节大小,代码如下。
import numpy as np
a = np.array([1,2,3,4,5,6,7,8,9], dtype = np.int8)
print (a.itemsize)
4)ndarray对象的切片和索引
ndarray对象的内容可以通过索引或切片来访问和修改,ndarray对象一般可由arange()函数创建,该函数用于创建数组,实现代码如下:
a=np.arange()
如果仅仅提取数组对象的一部分,则可以使用slice函数来构造,例如:
s=slice()
【例8-6】ndarray对象的切片,代码如下。
import numpy as np
a = np.arange(10)
s = slice(1,8,2)
print (a[s])
5)ndarray对象的计算模块、线性代数模块、三角函数和随机函数模块
numpy 包含用于数组内元素或数组间求和、求积以及进行差分的模块,如表8-4所示。numpy 还包含numpy.linalg模块,提供线性代数所需的所有功能,此模块中的一些重要功能如表8-5所示。在numpy库中有三角函数模块,如表8-6所示。
此外,在numpy库中还包含计算随机函数的模块
【例8-7】计算两个数组的点积,对于一维数组,它是向量的内积,对于二维数组,其等效于矩阵乘法。代码如下。
import numpy.matlib
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[10,20],[30,40]])
np.dot(a,b)
print (np.dot(a,b))
– 其中matlib表示numpy中的矩阵库。该段程序定义了两个数组a和b,并计算这两个数组的点积。其中点积计算公式为:
– [[110+230, 120+240],[310+430, 320+440]]
【例8-8】根据给定维度随机生成[0,1)之间的数据,包含0,不包含1,代码如下。
import numpy as np
a = np.random.rand(5,2)
print(a)
8.5 基于matplotlib的数据可视化
1.matplotlib.pyplot函数库简介
matplotlib.pyplot是一个命令型函数集合,它可以让人们像使用MATLAB一样使用matplotlib。
pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布、在画布中创建一个绘图区、在绘图区上画几条线、给图像添加文字说明等。
matplotlib.pyplot中常见函数包含有plt.figure、plt.subplot以及plt.axes。
1)plt.figure ( )
使用plt.figure()函数创建一个全局绘图区域,其中可包含如下参数:
- num:设置图像编号
- figsize:设置图像的宽度和高度,单位为英寸
- facecolor:设置图像背景颜色
- dpi:设置绘图对象的分辨率
- edgecolor:设置图像边框颜色
在创建了图像区域之后,再用函数plt.show()显示。如显示绘图区域代码如下:
plt.figure(figsize=(6,4))
plt.show()
- 该代码创建了一个空白区域,大小为6*4。
2)plt.subplot()
subplot()用于在全局绘图区域中创建自绘图区域,其中可包含如下参数:
– nrows:subplot的行数
– ncols:subplot的列数
– sharex:x轴刻度
– sharey:y轴刻度
使用subplot可以规划figure划分为n个子图,但每条subplot命令只会创建一个子图 。
【例8-9】用subplot划分子区域,代码如下。
import matplotlib.pyplot as plt
plt.subplot(442)
plt.show()
【例8-10】用subplot划分子区域并显示所有子图,代码如下。
import matplotlib.pyplot as plt
fig=plt.figure()
fig1=fig.add_subplot(3,3,1)
fig2=fig.add_subplot(3,3,2)
fig3=fig.add_subplot(3,3,3)
fig4=fig.add_subplot(3,3,4)
fig5=fig.add_subplot(3,3,5)
fig6=fig.add_subplot(3,3,6)
fig7=fig.add_subplot(3,3,7)
fig8=fig.add_subplot(3,3,8)
fig9=fig.add_subplot(3,3,9)
plt.show()
3)plt.axes()
plt.axes(rect , axisbg=‘w’)
– 创建一个坐标系风格的子绘图区域。默认创建一个subplot(111) 坐标系,参数rect=[left,bottom,width,height]中4个变量的范围都是[0,1],表示坐标系与全局绘图区域的关系。代码如下:
import matplotlib.pyplot as plt
plt.axes([0.1,0.1,0.7,0.3],facecolor='y')
plt.show()
4)plt.subplots_adjust()
plt.subplots_adjust()用于调整子绘图区域的布局。常见语法如下
– plt.subplots_adjust(left=,bottom=,right=,top=, hspace=)
– left: 画布中子图左边离y轴距离
– bottom: 画布中子图下边离x轴距离
– right: 画布中子图右边离y轴距离
– top: 画布中子图上边离x轴距离
– hspace:子图之间的距离
– 例如:plt.subplots_adjust(left=0.2,bottom=0.1,right=0.8,top=0.8, hspace=0.5)
2.matplotlib.pyplot相关函数简介
- 在matplotlib.pyplot 库中有plt子库,该子库提供了7个用于读取和显示的函数, 17个用于绘制基础图表的函数,3个区域填充函数,9个坐标轴设置函数以及11个标签与文本设置函数
3.numpy和matplotlib绘图综合应用
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10) # 取值依次为0-9的等差数列
y = np.sin(x)
z = np.cos(x)
plt.plot(x, y, marker="*", linewidth=3, linestyle="--", color="red")
#marker设置数据点样式,linewidth设置线宽,linestyle设置线型样式,color设置颜色
plt.plot(x, z)
plt.title("matplotlib")
plt.xlabel("x")
plt.ylabel("y")
plt.legend(["Y","Z"], loc="upper right")# 设置图例
plt.grid(True)
plt.show()
1)绘制线性图形
- 使用matplotlib库可以绘制各种图形,其中最基本的是线性图形,主要由线条组成。
【例8-12】用matplotlib库绘制线性图形,代码如下
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=20)#导入宋体字体文件
dataX = [1,2,3,4]
dataY = [2,4,4,2]
plt.plot(dataX,dataY)
plt.title("绘制直线",FontProperties=font_set);
plt.xlabel("x轴",FontProperties=font_set);
plt.ylabel("y轴",FontProperties=font_set);
plt.show()
2)绘制柱状图形
- 柱状图也叫作条形图,是一种以长方形的长度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的数值
【例8-13】用matplotlib库绘制柱状图形,代码如下。
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=15)#导入宋体字体文件
x = [0,1,2,3,4,5]
y = [1,2,3,2,4,3]
plt.bar(x,y)#竖的条形图
plt.title("柱状图",FontProperties=font_set); #图标题
plt.xlabel("x轴",FontProperties=font_set);
plt.ylabel("y轴",FontProperties=font_set);
plt.show()
- 在绘制柱状图时,也可以使用numpy来实现
【例8-14】用matplotlib库和numpy库绘制随机出现的绘制柱状图形,代码如下
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import numpy as np
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=15)
#导入宋体字体文件
x = np.arange(10)
y = np.random.randint(0,20,10)
plt.bar(x, y)
plt.show()
3) 绘制直方图
- 直方图又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据类型,纵轴表示分布情况。
【例8-15】用matplotlib库绘制直方图形,代码如下。
import matplotlib.pyplot as plt
import numpy as np
mean, sigma = 0, 1
x = mean + sigma * np.random.randn(10000)
plt.hist(x,50,histtype='bar',facecolor='red',alpha=0.75)
plt.show()
4) 绘制散点图
- 散点图在回归分析中使用较多,它将序列显示为一组点。值由点在图表中的位置表示,类别由图表中的不同标记表示,因此散点图通常用于比较跨类别的聚合数据。
【例8-16】用matplotlib库绘制散点图形,代码如下。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(100)
y = np.random.rand(100)
plt.scatter(x,y)
plt.show()
5) 绘制极坐标图
- 极坐标图是指在平面内由极坐标系描述的曲线方程图。极坐标是指在平面内由极点、极轴和极径组成的坐标系。极坐标图用于对多维数组进行直接的对比,多用在企业的可视化数据模型的对比与分析中。
【例8-17】用matplotlib库绘制极坐标图形,代码如下。
import matplotlib.pyplot as plt
import numpy as np
theta=np.arange(0,2*np.pi,0.02)
ax1 = plt.subplot(121, projection='polar')
ax1.plot(theta,theta/6,'--',lw=2)
plt.show()
6)绘制饼图
- 饼图用于表示不同分类的占比情况,通过弧度大小来对比各种分类,饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小
【例8-18】用matplotlib库绘制饼图图形,代码如下。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #设置字体
plt.title("饼图");#设置标题
labels = '计算机系','机械系','管理系','社科系'
sizes = [45,30,15,10] #设置每部分大小
explode = (0,0.0,0,0) #设置每部分凹凸
counterclock = False#设置顺时针方向
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=False,startangle=90) #设置饼图的起始位置,startangle=90表示开始角度为90度
plt.show()
8.6 基于pandas的数据可视化
1、pandas绘图介绍
在Python中有很多图形化库,例如之前讲述的matplotlib库。不过虽然matplotlib库可以绘制精美的图形,但是它需要安装大量的组件,书写大量的代码,并且绘图过程也比较复杂。
而在pandas中则可以高效的完成绘图的工作,因此本节将讲述使用pandas来绘制图形。
2、pandas绘图原理
pandas使用一维的数据结构Series和二维的数据结构DataFrame来表示数据,因此与numpy相比,pandas可以存储混合的数据结构。同时pandas使用NaN来表示缺失的数据,而不用像numpy一样要手工处理缺失的数据,因而制作一张完整的图表,matplotlib需要大段代码,而pandas只需几条语句即可实现。
在Python3中的pandas库或绘图函数导入语句如下:
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
import matplotlib.pyplot as plt
值得注意的是:在pandas库有两个最基本的数据类型,分别是Series和DataFrame。其中Series数据类型表示一维数组,与numpy中的一维array类似,并且二者与Python基本的数据结构List也很相近。
而DataFrame数据类型则代表二维的表格型数据结构,也可以将DataFrame理解为Series的容器。
3、pandas绘图实例
1)pandas绘制线性图**
在pandas中依靠Series和DataFrame中的一个生成各类图表的plot方法可以十分轻松的绘制线性图。
a)使用Series绘制线性图
【例8-19】在pandas中使用Series绘制线性图,代码如下
from pandas import DataFrame,Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()
plt.show()
b)使用DataFrame绘制线性图
【例8-20】在pandas中使用DataFrame绘制线性图,代码如下。
from pandas import DataFrame,Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
columns=['A', 'B', 'C', 'D'],
index=np.arange(0, 100, 10))
df.plot()
plt.show()
4.pandas绘制柱状图
1)使用Series绘制柱状图
在pandas中绘制柱状图与绘制线性图的方法类似,只需在生成线性图的代码中加上bar(垂直柱状图)或barh(水平柱状图)即可实现。
【例8-21】在pandas中绘制柱状图,代码如下。
from pandas import DataFrame,Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 1)
df = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
df.plot.bar(ax=axes[0], color='r', alpha=0.7) # 垂直柱状图
df.plot.barh(ax=axes[1], color='r', alpha=0.7) # 水平柱状图
plt.show()
2)使用DataFrame绘制柱状图
【例8-22】在pandas中使用DataFrame绘制柱状图,代码如下。
from pandas import DataFrame,Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(4, 4),
index=['one', 'two', 'three', 'four'],
columns=pd.Index(['A', 'B', 'C', 'D'], name='bar'))
df.plot.bar()
plt.show()
3)pandas绘制直方图
在pandas中只需通过DataFrame的hist方法,即可生成直方图。
【例8-23】在pandas中绘制直方图,代码如下。
from pandas import DataFrame,Series
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from numpy.random import randn
df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),}, columns=['a', 'b'])
df.plot.hist(bins=20)
plt.show()
8.7 基于seaborn的数据可视化
1、seaborn绘图介绍
1) seaborn绘图简介
seaborn是斯坦福大学开发的一个非常好用的可视化包,也是基于matplotlib的python数据可视化库。与matplotlib相比,seaborn提供更高层次的API封装,使用起来更加方便快捷。
因此,从开发者的角度讲,seaborn是matplotlib的扩充。但是值得注意的是: 由于 seaborn是以matplotlib为基础,因此在使用seaborn前,还是应先学习matplotlib的相关知识。
2) seaborn导入
在Python3中的seaborn绘图库或函数导入语句如下:
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
- 要想使用Python实现seaborn数据可视化,须分别导入numpy库、pandas库、scipy库、matplotlib库以及seaborn库,其中seaborn可简写为sns。
2、seaborn绘图实例
1) seaborn设置绘图风格
【例8-24】在seaborn中设置绘图风格,代码如下。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("darkgrid")
plt.plot(np.arange(10))
plt.show()
2)seaborn绘制直方图
【例8-25】在seaborn中绘制直方图
在seaborn中绘制最简单直方图的函数是distplot(),该函数默认绘制直方图并拟合内核密度估计,代码如下。
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
x = np.random.normal(size=100)
sns.distplot(x, kde=True, bins=20, rug=True)
plt.show()
3)seaborn绘制核密度图
【例8-26】在seaborn中绘制核密度估计图,该图主要是估计连续密度分布,代码如下:
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
x = np.random.normal(size=100)
sns.kdeplot(x)
sns.kdeplot(x, bw=1, label="bw: 1")
sns.kdeplot(x, bw=2, label="bw: 2")
plt.show()
4) seaborn绘制散点图
【例8-27】在seaborn中绘制散点图,代码如下。
import numpy as np
import pandas as pd
from scipy import stats, integrate
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(color_codes=True)
np.random.seed(sum(map(ord, "distributions")))
mean, cov = [0, 1], [(1, 3.5), (3.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=["x", "y"])
with sns.axes_style("ticks"):
sns.jointplot(x="x", y="y", data=df)
plt.show()
8.8 基于Bokeh的数据可视化
1.Bokeh绘图简介
Bokeh 是一个Python交互式可视化库,用于在现代Web浏览器上进行展示。它的目标是以D3.js风格提供优雅简洁的图形展示,并与大数据或流数据进行高效交互
在实现上, Bokeh捆绑了多种语言(如Python、R、lua和Julia)。这些捆绑的语言产生了一个JSON文件,这个文件作为BokehJS(一个Javascript库)的一个输入,会将数据展现到Web浏览器上。
Bokeh有以下特点:
- Bokeh允许用户通过简单的指令就可以快速创建复杂的统计图。
- Bokeh可以输出到各种媒体中,如HTML、Notebook文档和服务器,如在Python中可输出为HTML的网页形式。
- 用户可以将Bokeh可视化嵌入flask和django程序中。
2.Bokeh导入
- 在Python3中的Bokeh绘图库或函数导入语句如下:
from bokeh.plotting import figure, output_file, show
- 其中import figure, output_file, show语句的含义是先从 bokeh.plotting 中导入 figure 函数,output_file函数和show函数,用以创建和显示图表。函数含义如下:
- figure:创建图形。
- output_file:将图形输出为网页。
- show:显示该图形。
3、Bokeh绘图实例
1).Bokeh绘制补丁图
Bokeh中最基本的图形也叫做补丁图,它是指在Bokeh中绘制多个点,然后将点依次连接形成的图形,如直线或封闭图形等。
a)Bokeh绘制直线
【例8-28】在Bokeh中绘制直线,代码如下。
from bokeh.plotting import figure, output_file, show
output_file("patch.html")
p = figure(plot_width=400, plot_height=400)
p.patch([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], alpha=0.5, line_width=2)
show(p)
b)Bokeh绘制封闭图形
【例8-29】在Bokeh中绘制封闭图形,代码如下。
from bokeh.plotting import figure, output_file, show
output_file("patch.html")
p = figure(plot_width=400, plot_height=400)
p.patch([1, 2, 3, 4, 5], [6, 8, 5, 3, 4], alpha=0.5, line_width=2)
show(p)
4、Bokeh绘制散点图
1)绘制圆形散点图
【例8-30】在Bokeh中绘制圆形散点图,代码如下。
from bokeh.plotting import figure, output_file, show
output_file("circle.html")
p = figure(plot_width=400, plot_height=400)
p.circle([1, 2, 3, 4, 5], [3, 4, 5, 6, 7], size=20, color="red", alpha=0.5)
show(p)
2)绘制正方形散点图
【例8-31】在Bokeh中绘制正方形散点图,代码如下。
from bokeh.plotting import figure, output_file, show
output_file("square.html")
p = figure(plot_width=400, plot_height=400)
p.square([1, 2, 3, 4, 5], [7, 8, 5, 3, 7], size=30, color="red", alpha=0.5)
show(p)
5、Bokeh绘制曲线图
【例8-32】在Bokeh中绘制正弦函数曲线图,代码如下
from bokeh.plotting import figure, , output_file,show
import numpy as np
output_file("sinx.html")
x=np.linspace(-np.pi,np.pi,100)
y=np.sin(x)
p=figure(plot_width=400,plot_height=400)
p.line(x,y)
show(p)
8.9 基于pyqtgraph的数据可视化
1、pyqtgraph绘图介绍
1)pyqtgraph绘图简介
pyqtgraph是纯Python图形GUI库,它是基于PyQT4和numpy的绘图库,其中PyQT4是一个跨平台框架,使用C ++编写,可以运行在所有的主流操作系统上。
其中包括Unix、Windows、Mac。在PyQT4中包含许多工具和API,被广泛应用于许多行业,并涵盖了众多平台
尽管pyqtgraph完全用python编写,但内部由于使用了高速计算的numpy信号处理库以及Qt的GraphicsView框架
因此,它在大数据量的数字处理和快速显示方面有着巨大的优势,比较适合于需要快速绘图更新、视频或实时交互性的操作场合。
在Python3中的pyqtgraph绘图库或函数导入语句如下:
import pyqtgraph as pg
import numpy as np
1)使用默认方法绘制pyqtgraph折线图
【例8-33】在pyqtgraph中绘制折线图,代码如下。
import pyqtgraph as pg
pg.plot([2,5,4,1,3])
2)使用自定义方式来绘制pyqtgraph折线图
【例8-34】在pyqtgraph中使用自定义方式来绘制折线图,代码如下。
import pyqtgraph as pg
pg.setConfigOption('background', 'w')
pg.setConfigOption('foreground', 'r')
pg.plot([1,4,2,3,5])
3) 使用函数创建图形
由于pyqtgraph是Python中的图形GUI库,因此在编程时还可以根据实际情况调用函数mkQApp()来创建一个应用程序实例,并使用app.exec_()函数运行该实例。
【例8-35】在pyqtgraph中调用函数mkQApp()来绘制折线图,代码如下。
import pyqtgraph as pg
import numpy as np
app=pg.mkQApp()
x=np.random.random(10)
pg.plot(x)
app.exec_()
2、pyqtgraph绘制曲线图
【例8-36】在pyqtgraph中绘制曲线图,代码如下。
import pyqtgraph as pg
import numpy as np
app=pg.mkQApp()
x=np.linspace(0,1*np.pi,100)
y=np.sin(x)
pg.plot(x,y)
app.exec_()
3、pyqtgraph绘制随机散点形状图
【例8-37】在pyqtgraph中绘制随机散点形状图,代码如下。
import pyqtgraph as pg
import numpy as np
x = np.random.normal(size=100)
y = np.random.normal(size=100)
pg.plot(x, y, pen=None, symbol='o')
4、pyqtgraph内置绘图库
在pyqtgraph中除了可以自行绘制图形外,也可以使用其内置的绘图库来实现图形的展示。
8.10 本章小结
numpy库主要用于数据分析,在进行数据可视化时,常常需要使用到numpy库中的计算功能
matplotlib.pyplot是一个命令型函数集合,它可以让人们像使用MATLAB一样使用matplotlib。
pandas可以高效的完成绘图的工作,在pandas中主要依靠Series和DataFrame中的一个生成各类图表的plot方法来绘制图形。
seaborn是斯坦福大学出的一个非常好用的可视化包,也是基于matplotlib的python数据可视化库。与matplotlib相比,seaborn提供更高层次的API封装,使用起来更加方便快捷。
Bokeh 是一个Python交互式可视化库,用于在现代Web浏览器上进行展示。它的目标是以D3.js风格提供优雅简洁的图形展示,并与大数据或流数据进行高效交互。
pyqtgraph是纯Python图形GUI库,它是基于PyQT4和numpy的绘图库,在大数据量的数字处理和快速显示方面有着巨大的优势,比较适合于需要快速绘图更新、视频或实时交互性的操作场合。