爬虫项目基础知识详解
文章目录
- Python爬虫项目基础知识
- 一、爬虫与数据分析
- 1.1 Python中的requests库
- Requests 库的安装
- Requests 库的 get() 方法
- 爬取网页的通用代码框架
- HTTP 协议及 Requests 库方法
- Requests 库主要方法解析
- 1.2 python中的json库
- 1.3 xpath学习之python中lxml库
- html了解
- html结构
- html标签
- html属性
- 1.4xpath
- xpath定义
- xpath常见使用方法
- xpath的谓语结构
- 1.5 表格操作openpyxl
- 演示代码
- 创建工作簿
- 操作数据
- 一个单元格
- 多个单元格
- 仅值
- 数据存储
- 保存到文件
- 另存为流
- 从文件加载
- 1.5 python中的时间库time
- 二、可视化
- 2.1 matplotlib模块学习
- 2.2.1 折线图
- a. 设置画布大小:
- b. 自定义x轴、y轴刻度
- c. x轴显示中文
- d. 轴标签和标题
- e. 添加网格线
- f. 同一图中同时绘制多条折线
- g. 同时绘制两个图
- h. 绘制数学函数图像
- i. 设置字体大小
- 2.2.2 散点图绘制
- 2.2.3 柱状图
- a. 多组柱状图
- b. 垂直水平方向的柱状图
- 2.2.4 直方图
- 2.2.5 饼图
- 2.2 seaborn模块学习
- 2.2.1 relplot()函数
- 散点型
- 折线型
- 2.2.2 分类型绘图
- 条形图
- 2.2.3 泰坦尼克号案例学习
- 2.2.4 箱体型绘图
- 2.2.5 分布型绘图
- 四变量两两关系分布图
- 2.2.3 泰坦尼克号案例学习
- 2.2.4 箱体型绘图
- 2.2.5 分布型绘图
- 四变量两两关系分布图
- 2.3 pyecharts模块学习
Python爬虫项目基础知识
仅供参考,合法爬取
一、爬虫与数据分析
1.1 Python中的requests库
Requests 库的安装
Win 平台:“以管理员身份运行” cmd,执行 pip install requests,等待安装
Requests 库的安装小测
Requests 库的 get() 方法
response n. 响应;反应;回答
Response 对象包含服务器返回的所有信息,也包含请求的 Request 信息
r = requests.get( url , params=None , **kwargs )
//---url:拟获取页面的 url 链接
//---params:url 中的额外参数,字典或字节流格式,可选
//---**kwargs:12 个控制访问的参数
[补充]:参考 get 方法的文档可以看出 get 方法使用了 request 方法进行封装,也就是说 request 库一共提供 7 常用方法,除了第一个 request 方法外,其它的 6 个方法都是通过调用 request 方法实现的。其实也可以这样认为 requests 库其实只有一个方法,就是 request 方法,但是为了让大家编写程序更方便,提供了额外 6 个方法。
Requests 库的 2 个重要对象
Response 对象的属性:
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态, 200表示连接成功, 404表示失败 |
r.text | HTTP响应内容的字符串形式,即, url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
r.status_code:只要不是200其实都是连接失败的 !!!!
在使用 get 方法获取网上资源的基本流程:
理解 Response 的编码:
- r.encoding:编码方式是从 http 的 heder 中的 charset 字段获得的,如果 header 中不存在 charset,则默认认为编码为 ISO-8859-1,这样的编码不能解析中文。r.text 根据 r.encoding 显示网页内容
- r.apparent_encoding:根据 http 的内容部分,而不是头部分,去分析内容中出现文本可能的编码形式。即根据网页内容分析出的编码方式, 可以看作是 r.encoding 的备选
为什么将 r.apparent_encoding 解析出来的编码方式赋给 r.encoding 后,网页中的中文就可以分析出来,难道 r.text 是以 r.encoding 的方式进行编码的吗?为什么头部分析出来的编码方式会与内容解析出来的不同?
答:r.text 是以 r.encoding 的方式进行编码
爬取网页的通用代码框架
在介绍爬取网页的通用代码框架之前,我们需要理解 Requests 库的异常
r.raise_for_status():在方法内部判断 r.status_code 是否等于 200,不需要增加额外的 if 语句,该语句便于利用 try-except 进行异常处理,如果状态码不是200,产生异常 requests.HTTPError。
import requests
def getHTMLText(url):try:r = requests.get(url)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:# print(r.status_code)return "产生异常!"
if __name__=="__main__":url = "http://www.baidu.com"print(getHTMLText(url))
HTTP 协议及 Requests 库方法
HTTP,HyperText Transfer Protocol,超文本传输协议。是一个基于 “请求与响应” 模式的、无状态的应用层协议。无状态指的是第一次请求与第二次请求之间并没有相关的关联。HTTP 协议采用 URL 作为定位网络资源的标识。
URL 格式如下:http://host[:port][path]
host:合法的 Internet 主机域名或 IP 地址
port:端口号,缺省端口为 80
path:请求资源的路径
HTTP 实例:http://www.bit.edu.cn
http://220,181,111,188/duty
文件的路径一样,只不过这个文件不在电脑里,在 internet 上,那每一个 URL,对应了 internet 上的一个数据资源。
HTTP 协议对资源的操作
理解 PATCH 和 PUT 的区别
假设 URL 位置有一组数据 UserInfo,包括 UserID、UserName 等20个字段
需求:用户修改了 UserName,其他不变。
采用 PATCH,仅向 URL 提交 UserName 的局部更新请求。
采用 PUT,必须将所有 20 个字段一并提交到 URL,未提交字段被删除。
PATCH 的最主要好处:节省网络带宽(当 URL 对应的资源是很庞大资源的时候)
HTTP 协议与 Requests 库
Requests 库的 head() 方法
- r.headers : 以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回 None
Requests 库主要方法解析
Requests 库的 7 个主要方法:
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交PUT请求的方法,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
requests.request(method, url, **kwargs)
- method:请求方式,对应get/put/post等七种
r = requests. request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPTIONS', url, **kwargs)
- OPTIONS:向服务器获取一些服务器跟客户端能够打交道的参数,并不与获取资源直接相关。
- url:拟获取页面的url链接
- **kwargs:控制访问的参数,共 13 个
- params:字典或字节序列,作为参数增加到ur1中
- data:字典、字节序列或文件对象,作为Request的内容
- json:JSON格式的数据,作为Request的内容
- headers:字典,HTTP定制头
- cookies:字典或CookieJar,Request中的cookie
- auth:元组,支持HTTP认证功能
- files:字典类型,传输文件
- timeout:设定超时时间,秒为单位
- proxies:字典类型,设定访问代理服务器,可以增加登录认证
- redirects:True/False,默认为 True,重定向开关
- stream:True/False,默认为 True,获取内容立即下载开关
- verify:True/False,默认为 True,认证 SSL 证书开关
- cert:本地 SSL 证书路径
使用示例:
kv = {'cn': '导演', 'pcn': '娱乐明星'}
r = requests.request('GET', 'http://tieba.baidu.com/f/index/forumpark', params=kv)
r.encoding = r.apparent_encoding
print(r.url)
这两种方法是等价的:
r = requests.request("get", "http://www.baidu.com")
r = requests.get("http://www.baidu.com")
fs = {'file':open('data.x1s','rb')}
r = requests.request('pOST','http://python123.io/ws',files=fs)
pxs = { 'http':'http://xxx:xxx''https':'https://xxxx:xxx' }
r = requests.request('GET','http://www.baidu.com',proxies=pxs)
http 协议中,向某一个 url 提交资源的功能在服务器上是严格受控的,因为这存在很大的安全问题。
网络爬虫的尺寸:
小规模,数据量小 | 中规模,数据规模较大 | 大规模,搜索引擎 |
---|---|---|
爬取速度不敏感 | 爬取速度敏感 | 爬取速度关键 |
Requests 库 | Scrapy 库 | 定制开发 |
爬取网页、玩转网页 | 爬取网站、爬取系列网站 | 爬取全网 |
1.2 python中的json库
- json数据是一种只包含双引号的字符串格式,任何对象经过json序列化后单引号也会转成双引号。
import jsondic={'name':'xiaohu'}
print(json.dumps(dic)) #{"name": "xiaohu"}i=8
print(json.dumps(i)) # 8
print(type(json.dumps(i))) #<class 'str'>s='hello'
print(json.dumps(s)) #"hello"
print(type(json.dumps(s))) #<class 'str'>l=[12,34]
print(json.dumps(l)) #[11, 22]
-
JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:
JSON类型 Python类型 {} dict [] list “string” str 数字 int 或者float true/false True/False null None -
dumps()和loads()函数
f=open('序列化对象','w')
f.write(j) #-------------------打开、写入两步等价于json.dump(dic,f)
f.close()
#-----------------------------反序列化<br>
import json
f=open('序列化对象')
data=json.loads(f.read()) # 打开、读两步等价于data=json.load(f)
- 无论数据是怎样创建的,只要满足json格式,就可以json.loads出来,不一定非要dumps的数据才能loads
- json.dumps()中的ensure_ascii=False
在使用json.dumps时要注意一个问题
输出的会是
‘中国’ 中的ascii 字符码,而不是真正的中文。
这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:
python数据格式切换json的方法
json.dumps(data) python ---->json 数据格式转换
json.dump(data, filename) python ---->json 将转换后的数据保存到filename文件中
json.loads(data) json —>python 数据格式转换
json.load(data, filename) json —>python 将转换后的数据保存到filename文件中
1.3 xpath学习之python中lxml库
html了解
超文本标记语言,是用来描述网页的一种语言。主要用于控制数据的显示和外观。HTML文档一定意义上可以被称为网页。但反过来说网页不仅仅是HTML,网页本质有三部分构成:负责内容结构的HTML,负责表现的CSS,以及负责行为的javascript。本文主要分享的是最核心的内容结构部分。
html结构
完整的HTML文件至少包括标签、标签、
从上图可以看出,一个完整的html文档主要包含三部分:DTD文档头,head头部信息和body正文信息。其中DTD文档头用来告诉浏览器执行标准是什么(比如html4或是html5),head头部信息用来说明浏览器的编码方式和文档头名称,body顾名思义就是浏览器的正文部分。
html标签
作为开始和结束的标记,由尖括号包围的关键词,比如 ,标签对中的第一个标签是开始标签,第二个标签是结束标签。html中常见标签如下:
其中, “< ul >< li >”是一种嵌套顺序,无序列表,成对出现;li的父元素必须是ul或者ol,不同之处在于ol是一种有序列列表,而ul是无序列表;
html属性
属性是用来修饰标签的,放在开始标签里里面,html中常见四大属性:
属性 | 说明 |
---|---|
class | 规定元素的类名,大多数时候用于指定样式表中的类 |
id | 唯一标识一个元素的属性,在html里面必须是唯一的 |
href | 指定超链接目标的url |
src | 指定图像的url |
1.4xpath
xpath定义
是一种路径查询语言,简单的说就是利用一个路径表达式从html文档中找到我们需要的数据位置,进而将其写入到本地或者数据库中。(可以将xpath类比为sql结构化查询语言)
xpath常见使用方法
符号 | 功能 |
---|---|
// | 表示在整个文本中查找,是一种相对路径 |
/ | 表示则表示从根节点开始查找,是一种绝对路径 |
text() | 找出文本值 |
@ | 找出标签对应的属性值,比如@href就是找出对应的href链接 |
. | 表示当前节点 |
… | 表示当前节点的父节点 |
当然xpath除了上述常见用法外,还存两种比较特殊的用法:以相同的字符开头;标签套标签。
用法1:以相同的字符开头:starts-with(@属性部分,属性字符相同部分
用法2:标签套标签:string(.)
#以相同的字符开头
#比如我们想同时提取到下列html中三条文本内容的话,就需要使用starts-with方法
html1 = """
<!DOCTYPE html>
<html><head lang='en'><meta charest='utf-8'><title></title></head><body><div id="test-1">需要的内容1</div><div id="test-2">需要的内容2</div><div id="testfault">需要的内容3</div></body>
</html>
"""#爬取代码
from lxml import etree
selector = etree.HTML(html1)
content = selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:print each
还有一种是标签套标签形式,参考如下例子
html2 = """
<!DOCTYPE html>
<html><head lang='en'><meta charest='utf-8'><title></title></head><body><div id="test3">我左青龙,<span id='tiger'>右白虎<ul>上朱雀,<li>下玄武,</li></ul></span>龙头在胸口</div></body>
</html>
"""
#如果我们想爬取的内容是html文档中的所有文本的话,需要使用string方法进行提取
selector2 = etree.HTML(html2)
content2 = selector2.xpath('//div[@id="test3"]')[0] #列表,只有一个元素
info = content2.xpath('string(.)')
content3 = info.replace('\n','').replace(' ','')
print content3
xpath的谓语结构
所谓"谓语条件",就是对路径表达式的附加条件。所有的条件,都写在方括号"[]"中,表示对节点进行进一步的筛选。例如:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore><book><title lang="eng">Harry Potter</title><price>29.99</price></book><book><title lang="eng">Learning XML</title><price>39.95</price></book><book><title lang="eng">Harry Potter</title><price>29.99</price></book><book><title lang="eng">Learning XML</title><price>39.95</price></book><book><title lang="eng">Harry Potter</title><price>29.99</price></book><book><title lang="eng">Learning XML</title><price>39.95</price></book>
</bookstore>
下面从几个简单的例子让大家体会一下
- /bookstore/book[1] :表示选择bookstore的第一个book子元素。
- /bookstore/book[last()] :表示选择bookstore的最后一个book子元素。
- /bookstore/book[last()-1] :表示选择bookstore的倒数第二个book子元素。
- /bookstore/book[position()❤️] :表示选择bookstore的前两个book子元素。
- //title[@lang] :表示选择所有具有lang属性的title节点。
- //title[@lang=‘eng’] :表示选择所有lang属性的值等于"eng"的title节点。
<tr><td valign="top"><input type="radio" name="payment" value="1" checked="" iscod="0"></td><td valign="top"><strong>数加科技</strong></td>
</tr>
//strong[text()="数加科技"]/../../td[1]/input
函数 | 说明 | 举例 |
---|---|---|
contains | 选取属性或者文本包含某些字符 | //div[contains(@id, ‘data’)] 选取 id 属性包含 data 的 div 元素 //div[contains(string(), ‘支付宝’)] 选取内部文本包含“支付宝”的 div 元素 |
starts-with | 选取属性或者文本以某些字符开头 | //div[starts-with(@id, ‘data’)] 选取 id 属性以 data 开头的 div 元素 //div[starts-with(string(), ‘银联’)] 选取内部文本以“银联”开头的 div 元素 |
ends-with | 选取属性或者文本以某些字符开头 | //div[ends-with(@id, ‘require’)] 选取 id 属性以 require 结尾的 div 元素 //div[ends-with(string(), ‘支付’)] 选取内部文本以“支付”结尾的 div 元素 |
1.5 表格操作openpyxl
用于读取和写入 Excel 2010 xlsx/xlsm/xltx/xltm 文件。通过 pip install openpyxl
命令下载 openpyxl 库。
演示代码
通过下面的演示代码,可以快速创建一个名为 sample.xlsx 的表格文件:
from openpyxl import Workbook
import datetime# 创建一个工作簿
wb = Workbook()
# 获取活动工作表
ws = wb.active
# 数据可以直接分配到单元格
ws['A1'] = 42
# 行也可以追加
ws.append([1, 2, 3])
# Python类型将自动转换
ws['A2'] = datetime.datetime.now()
# 保存文件
wb.save("sample.xlsx")
创建工作簿
不需要提前在文件系统上创建文件,直接就可以使用 openpyxl
开始创建表格。先导入 Workbook
类,再使用 Workbook.active
方法获取一个工作表:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
默认情况下 Workbook.active(value)
方法中的 value
为 0,即使用此方法获得第一个工作表,我们可以修改此值。也可以使用 Workbook.create_sheet()
方法创建新的工作表:
# 在末尾插入(默认)
ws1 = wb.create_sheet("Mysheet")
# 插入第一个位置
ws2 = wb.create_sheet("Mysheet", 0)
# 倒数第二个位置插入
ws3 = wb.create_sheet("Mysheet", -1)
我们可以随时通过 Worksheet.title
属性更改工作表名称:
ws.title = "New Title"
给工作表命名后,就可以将其作为工作簿的键值,以指向对应的工作表,并可以使用 Workbook.sheetname
属性查看工作簿中所有工作表的名称,亦可以遍历工作表:
ws3 = wb["New Title"]print(wb.sheetnames) # ['Sheet2', 'New Title', 'Sheet1']for sheet in wb:print(sheet.title)
我们可以复制某个工作簿,创建一个副本。该行为仅复制单元格(值、样式、超链接、注释)和某些工作表属性(尺寸、格式、属性),如果工作簿以 read-only 或 write-only 只读模式打开,则不能复制工作表:
source = wb.active
target = wb.copy_worksheet(source)
操作数据
单元格可以直接作为工作表中的键值进行访问,例如返回 A4 处的单元格,如果不存在则创建一个单元格,可以直接分配值:
c = ws['A4']
ws['A4'] = 4
一个单元格
通过 Worksheet.cell()
方法可以使用 行 和 列 定位要访问的单元格:
d = ws.cell(row=4, column=2, value=10)
多个单元格
我们可以通过切片访问单元格范围,行或列的范围可以用类似方法获得:
cell_range = ws['A1':'C2']
colC = ws['C']
col_range = ws['C:D']
row10 = ws[10]
row_range = ws[5:10]
也可以使用 Worksheet.iter_rows()
或 Worksheet.iter_cols()
方法获取行、列,但是由于性能原因,这两个方法在 只读 模式下不可用:
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):for cell in row:print(cell)
# <Cell Sheet1.A1>
# <Cell Sheet1.B1>
# <Cell Sheet1.C1>
# <Cell Sheet1.A2>
# <Cell Sheet1.B2>
# <Cell Sheet1.C2>
for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):for cell in col:print(cell)
# <Cell Sheet1.A1>
# <Cell Sheet1.A2>
# <Cell Sheet1.B1>
# <Cell Sheet1.B2>
# <Cell Sheet1.C1>
# <Cell Sheet1.C2>
如果需要遍历所有行或列,则可以使用 Worksheet.rows
或 Worksheet.columns
属性,但是同样在 只读 模式下不可用:
ws = wb.active
ws['C9'] = 'hello world'
tuple(ws.rows)
# ((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
# (<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
# (<Cell Sheet.A3>, <Cell Sheet.B3>, <Cell Sheet.C3>),
# (<Cell Sheet.A4>, <Cell Sheet.B4>, <Cell Sheet.C4>),
# (<Cell Sheet.A5>, <Cell Sheet.B5>, <Cell Sheet.C5>),
# (<Cell Sheet.A6>, <Cell Sheet.B6>, <Cell Sheet.C6>),
# (<Cell Sheet.A7>, <Cell Sheet.B7>, <Cell Sheet.C7>),
# (<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
# (<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
tuple(ws.columns)
# ((<Cell Sheet.A1>,
# <Cell Sheet.A2>,
# <Cell Sheet.A3>,
# <Cell Sheet.A4>,
# <Cell Sheet.A5>,
# <Cell Sheet.A6>,
# ...
# <Cell Sheet.C9>))
仅值
如果只需要工作表中的值,则可以使用 Worksheet.columns
属性,这会遍历工作表中的所有行,但仅返回单元格的值:
for row in ws.values:for value in row:print(value)
通过 Worksheet.iter_rows()
并 Worksheet.iter_cols()
可以获取 values_only
参数,只返回单元格的值:
for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):print(row)
# (None, None, None)
# (None, None, None)
如果我们只需要工作表的 最大行数 和 最大列数,可以使用 max_row
和 max_column
属性获取,例如一个4行15列的工作表:
print(ws.max_row) # 4
print(ws.max_column) # 15
数据存储
有了 Cell
就可以为其分配一个值:
c.value = 'hello, world'
print(c.value) # 'hello, world'
d.value = 3.14
print(d.value) # 3.14
保存到文件
保存工作簿的最简单、安全的方法是使用对象的 Workbook.save()
方法:
wb = Workbook()
wb.save('balances.xlsx')
如果文件已经存在,此操作将覆盖现有文件,不会抛出异常或警告。
另存为流
如果要将文件保存到流中,例如在使用Web应用程序(Pyramid、Flask、Django)时,只需使用 NamedTemporaryFile()
方法即可:
from tempfile import NamedTemporaryFile
from openpyxl import Workbook
wb = Workbook()
with NamedTemporaryFile() as tmp:wb.save(tmp.name)tmp.seek(0)stream = tmp.read()
我们也可以指定属性 template=True
,将工作簿另存为模板:
wb = load_workbook('document.xlsx')
wb.template = True
wb.save('document_template.xltx')
或将 template
属性设置为 False
(默认),以另存为文档:
wb = load_workbook('document_template.xltx')
wb.template = False
wb.save('document.xlsx', as_template=False)
从文件加载
可以通过 openpyxl.load_workbook()
打开现有的工作簿:
from openpyxl import load_workbook
wb2 = load_workbook('test.xlsx')
print(wb2.sheetnames) # ['Sheet2', 'New Title', 'Sheet1']
1.5 python中的时间库time
import time
store_date = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(time.time())))
print("今天是 beijingriqi_%s,%s" % (store_date, 'asda'))
[output]:
今天是 beijingriqi_2022-04-17 23:30:43,asda
二、可视化
2.1 matplotlib模块学习
快速安装
pip install matplotlib
2.2.1 折线图
import matplotlib.pyplot as plt
import randomx=range(10) # 定义x轴的数据 列表的数据类型
y=[random.uniform(15,35) for i in x] # 定义y轴的数据 # 列表的数据类型plt.plot(x, y) # 绘制图像
plt.savefig('a1.png') # 保存图像 在当前目录保存名为test.png的图片,必须在show方法前否则图片就是空白
# plt.show() # 展示图像
a. 设置画布大小:
我们使用
plt.figure()
函数来设置画布大小,其参数如下:
- figsize : 设置画布的大小,单位英寸 长,宽
- dpi : 设置清晰度
import matplotlib.pyplot as plt
import randomx=range(10) # 定义x轴的数据
y=[random.uniform(15,35) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.plot(x, y) # 绘制图像
plt.show() # 展示图像
b. 自定义x轴、y轴刻度
xticks
,yticks
使用自定义刻度的函数,它有两个参数:
- ticks:要显示x轴的刻度
- labels:给对应的x刻度设置一个标签,并且覆盖之前的刻度,与传入ticks的列表长度要相等。
x轴每隔2两个数显示
import matplotlib.pyplot as plt
import randomx=range(10) # 定义x轴的数据
y=[random.uniform(15,35) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.xticks(x[::1]) # 定义显示的x轴步长为1plt.plot(x, y) # 绘制图像
plt.show() # 展示图像
c. x轴显示中文
matplotlib默认字体是不支持中文的需要更改,有多种方法,现在只提供一种
import matplotlib.pyplot as plt
import randomx=range(10) # 定义x轴的数据
y=[random.uniform(15,35) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.xticks(x[::2],["1月","2月","3月","4月","5月"]) # 第二个参数可以指定显示字符串,不过传入xticks的这两个参数长度要相等plt.plot(x, y) # 绘制图像
plt.show() # 展示图像
修改matplotlib默认字体,使它支持显示中文
方法一:
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签x=range(10) # 定义x轴的数据
y=[random.uniform(15,35) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.xticks(x[::2],["1月","2月","3月","4月","5月"]) # 第二个参数可以指定显示字符串,不过传入xticks的这两个参数长度要相等plt.plot(x, y) # 绘制图像
plt.show() # 展示图像
方法二:
修改全局字体样式,需要使用 matplotlib 模块的 rcParamsfrom matplotlib import rcParamsrcParams['font.family'] = 'SimHei' # 黑体
常用字体
宋体:SimSun
黑体:SimHei
微软雅黑:Microsoft YaHei
微软正黑体:Microsoft JhengHei
新宋体:NSimSun
新细明体:PMingLiU
细明体:MingLiU
标楷体:DFKai-SB
仿宋:FangSong
楷体:KaiTi
隶书:LiSu
幼圆:YouYuan
华文细黑:STXihei
华文楷体:STKaiti
华文宋体:STSong
华文中宋:STZhongsong
华文仿宋:STFangsong
方正舒体:FZShuTi
方正姚体:FZYaoti
华文彩云:STCaiyun
华文琥珀:STHupo
华文隶书:STLiti
华文行楷:STXingkai
华文新魏:STXinwei
d. 轴标签和标题
xlabel
、ylabel
使用修改x,y轴标签
title
可修改标题
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签x=range(10) # 定义x轴的数据
y=[random.uniform(15,35) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.xticks(x[::2],["1月","2月","3月","4月","5月"]) # 第二个参数可以指定显示字符串,不过传入xticks的这两个参数长度要相等plt.xlabel("时间变化") # 修改标签
plt.ylabel("温度变化")plt.title("我是标题") # 修改标题plt.plot(x, y) # 绘制图像
plt.show() # 展示图像
e. 添加网格线
grid
方法来设置图表中的网格线
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签x=range(60) # 定义x轴的数据
y=[random.uniform(15,18) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.plot(x, y) # 绘制图像plt.xticks(x[::5],["{}分钟".format(i) for i in x][::5]) # 第二个参数可以指定显示字符串,不过传入xticks的这两个参数长度要相等
plt.yticks(range(0,40,5)) # 自定义y轴刻度
plt.xlabel("时间变化") # 修改标签
plt.ylabel("温度变化")plt.title("我是标题") # 修改标题# 增加网格显示,0.5表示透明度为50%
plt.grid(linestyle="--",alpha=0.5)plt.show() # 展示图像
f. 同一图中同时绘制多条折线
只是数据多准备一份罢了,基本什么区别
例外再添加上图例legend
,可读性更好
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签x=range(60) # 定义x轴的数据
y_1=[random.uniform(15,18) for i in x] # 定义y轴的数据
y_2=[random.uniform(1,3) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.plot(x, y_1,label="上海") # 绘制图像
plt.plot(x, y_2,label="北京") # 绘制图像plt.xticks(x[::5],["{}分钟".format(i) for i in x][::5]) # 第二个参数可以指定显示字符串,不过传入xticks的这两个参数长度要相等
plt.yticks(range(0,40,5)) # 自定义y轴刻度plt.xlabel("时间变化") # 修改标签
plt.ylabel("温度变化")plt.title("我是标题") # 修改标题# 增加网格显示,0.5表示透明度为50%
plt.grid(linestyle="--",alpha=0.5)plt.legend() #绘制图例plt.show() # 展示图像
g. 同时绘制两个图
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号# x,y轴的数据
x=range(60)
y_shanghai=[random.uniform(15,18) for i in x]
# 另一个城市
y_beijing=[random.uniform(1,3) for i in x]'''
fig 表示的是要绘制的一个画布,
ax 表示的是在fig这个画布的对象上,具体要绘制的对象子图。
'''
fig, ax = plt.subplots(1,2,figsize=(20,8),dpi=80) # 把画布分成一行两列ax[0].plot(x,y_shanghai,'b--',label='上海')
ax[1].plot(x,y_beijing,'r',label='北京')# 图例,必须在plot后面 简单显示图例
ax[0].legend()
ax[1].legend()
# 修改x y刻度
x_label=["11点{}分".format(i) for i in range(60)]
ax[0].set_xticks(x[::5],x_label[::5])
ax[0].set_yticks(range(0,40,5))ax[1].set_xticks(x[::5],x_label[::5])
ax[1].set_yticks(range(0,40,5))
# 增加网格显示
ax[0].grid(linestyle="--",alpha=0.5)ax[1].grid(linestyle="--",alpha=0.5)# 添加描述信息
ax[0].set_xlabel('时间变化')
ax[0].set_ylabel('温度变化')
ax[0].set_title('上海城市11点到12点每分钟的温度变化状况1')ax[1].set_xlabel('时间变化')
ax[1].set_ylabel('温度变化')
ax[1].set_title('北京城市11点到12点每分钟的温度变化状况2')
plt.show()
h. 绘制数学函数图像
import matplotlib.pyplot as plt
import numpy as np; x=np.linspace(-10,10,1000000)
y=x**2plt.figure(figsize=(8,8),dpi=80)
plt.grid(linestyle='--',alpha=0.5)
plt.plot(x,x**2)
plt.show()
i. 设置字体大小
在前面的例子中感觉显示的字体太小了,看的不舒服,现在来设置一下。
通过plt.rcParams['font.size']=18
来指定字体的大小
import matplotlib.pyplot as plt
import randomplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['font.size']=18 # 设置字体大小
x=range(60) # 定义x轴的数据
y=[random.uniform(15,18) for i in x] # 定义y轴的数据plt.figure(figsize=(20,8),dpi=80) # 设置画布大小与清晰度plt.plot(x, y) # 绘制图像plt.xticks(x[::5],["{}分钟".format(i) for i in x][::5]) # 第二个参数可以指定显示字符串,不过传入xticks的这两个参数长度要相等
plt.yticks(range(0,40,5)) # 自定义y轴刻度
plt.xlabel("时间变化") # 修改标签
plt.ylabel("温度变化")plt.title("我是标题") # 修改标题# 增加网格显示,0.5表示透明度为50%
plt.grid(linestyle="--",alpha=0.5)plt.show() # 展示图像
2.2.2 散点图绘制
主要使用
scatter
方法来绘制散点图,参数如下:
参数说明:
- x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
- s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
- c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
- marker:点的样式,默认小圆圈 ‘o’。
- cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
- norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
- vmin,vmax::亮度设置,在 norm 参数存在时会忽略。
- alpha::透明度设置,0-1 之间,默认 None,即不透明。
- linewidths::标记点的长度。
- edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None。
- plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
- **kwargs::其他参数。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.size'] = 18
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
sizes = np.array([20,50,100,200,500,1000,60,90])
plt.figure(figsize=(8,8),dpi=80)
plt.scatter(x,y,s=sizes) # 绘制散点图
plt.show()# 注意:散点图的数据是一维矩阵 并非是列表数据类型
2.2.3 柱状图
主要使用
bar()
方法来绘制柱形图。
bar() 方法语法格式如下:
- x:浮点型数组,柱形图的 x 轴数据。
- height:浮点型数组,柱形图的高度。
- width:浮点型数组,柱形图的宽度。
- bottom:浮点型数组,底座的 y 坐标,默认 0。
- align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。
- **kwargs::其他参数。
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴', '降魔传','追捕','七十七天','密战','狂兽','其它']
tickets = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
x = range(len(movie_names))plt.figure(figsize=(20,8),dpi=80)
plt.bar(x,tickets,color=['b','g','r','c','m','y','k'])
plt.xticks(x,movie_names)
plt.title('电影票房收入对比')
plt.grid(linestyle='--',alpha=0.5)
plt.show()
a. 多组柱状图
import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']
first_day = [10587.6,10062.5,1275.7]
first_weekend=[36224.9,34479.6,11830]plt.figure(figsize=(20,8),dpi=80)x=range(len(movie_name))
plt.bar(x,first_day,width=0.2,label='首日票房') # 绘制第一组柱状图
plt.bar([i+0.2 for i in x],first_weekend,width=0.2,label='首周票房') # 绘制第二组柱状图plt.legend() # 绘制图例plt.xticks([i+0.1 for i in x],movie_name) # 修改x轴刻度plt.show()
b. 垂直水平方向的柱状图
垂直方向的柱状图可以使用
barh()
方法来设置:
import matplotlib.pyplot as pltx = ["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"]
y = [12, 22, 6, 18]
plt.figure(figsize=(20,8),dpi=80)
plt.barh(x,y)
plt.show()
2.2.4 直方图
使用
hist()
方法来绘制直方图
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号import matplotlib.pyplot as plt# 电影时长分布状况
time = [131, 98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115, 99, 136, 126, 134, 95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117, 86, 95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123, 86, 101, 99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140, 83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144, 83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137, 92,121, 112, 146, 97, 137, 105, 98, 117, 112, 81, 97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112, 83, 94, 146, 133, 101,131, 116, 111, 84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
plt.figure(figsize=(20,8),dpi=80)distince = 2 # 每组的间距
plt.hist(time,(max(time)-min(time))//distince)
plt.xticks(range(min(time),max(time)+2,distince))plt.grid(linestyle='--',alpha=0.5)
plt.xlabel('电影时长大小')
plt.ylabel('电影的数据量')
plt.title("电影时长分布")
plt.show()
2.2.5 饼图
使用 pyplot 中的
pie()
方法来绘制饼图。
参数说明:
- x:浮点型数组,表示每个扇形的面积。
- explode:数组,表示各个扇形之间的间隔,默认值为0。
- labels:列表,各个扇形的标签,默认值为 None。
- colors:数组,表示各个扇形的颜色,默认值为 None。
- autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
- labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
- pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
- shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
- radius::设置饼图的半径,默认为 1。
- startangle::起始绘制饼图的角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
- counterclock:布尔值,设置指针方向,默认为 True,即逆时针,False 为顺时针。
- wedgeprops :字典类型,默认值 None。参数字典传递给 wedge 对象用来画一个饼图。例如:wedgeprops={‘linewidth’:5} 设置 wedge 线宽为5。
- textprops :字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
- center :浮点类型的列表,默认值:(0,0)。用于设置图标中心位置。
frame :布尔类型,默认值:False。如果是 True,绘制带有表的轴框架。
rotatelabels :布尔类型,默认为 False。如果为 True,旋转每个 label 到指定的角度。
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']
place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]
plt.figure(figsize=(20,8),dpi=80)
plt.pie(place_count,labels=movie_name,autopct='%1.2f%%')
plt.legend()
plt.axis('equal') # 确保饼图能化成一个圆
plt.show()
2.2 seaborn模块学习
下载模块
pip install seaborn
引入模块
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
读取数据
tips = pd.read_csv('tips.csv')
tips.head()
2.2.1 relplot()函数
seaborn.relplot()
这个函数功能非常强大,可以用来表示多个变量之间的关联关系。默认情况下是绘制散点图,也可以绘制线性图,具体绘制什么图形是通过kind参数来决定的。实际上以下两个函数就是relplot的特例:
散点类型:scatterplot -> relplot(kind=“scatter”)
线性类型:lineplot -> relplot(kind=“line”)
参数:x, y vectors or keys in data指定x轴和y轴上位置的变量hue vector or key in data将生成具有不同颜色的元素的分组变量。可以是按类别的(categorical),也可以是数字的,不过在后一种情况下,颜色映射的行为会有所不同。size vector or key in data将生成不同大小元素的分组变量。可以是按类别的(categorical),也可以是数字的,在后一种情况下,大小映射的行为会有所不同。style vector or key in data将生成具有不同样式的元素的分组变量。可以具有数字数据类型,但将始终被视为按类别的(categorical)。data pandas.DataFrame, numpy.ndarray, mapping, or sequence输入数据结构。要么是可以分配给命名变量的向量的长形式集合,要么是将进行内部整形的宽形式数据集。row, col vectors or keys in data定义要在不同面上绘制的子集的变量。col_wrap int以该宽度“包裹”列变量,使列面跨越多行。与行方面不兼容。row_order, col_order lists of strings按顺序组织网格中的行和/或列,否则将从数据对象推断顺序。palette string, list, dict, or matplotlib.colors.Colormap映射色调时选择要使用的颜色的方法。字符串值传递给color_palete()。List或dict值表示按类别的映射,而colormap对象表示数字映射。hue_order vector of strings指定色调语义分类级别的处理和打印顺序。hue_norm tuple or matplotlib.colors.Normalize以数据单位设置归一化范围的一对值,或将从数据单位映射到[0,1]区间的对象。用法意味着数字映射。sizes list, dict, or tuple确定使用大小时如何选择大小的对象。它始终可以是大小值列表或大小变量到大小的dict映射级别。当大小为数字时,它也可以是一个元组,指定要使用的最小和最大大小,以便在此范围内规范化其他值。size_order list指定大小变量级别的出现顺序,否则将根据数据确定。大小变量为数字时不相关。size_norm tuple or Normalize object当尺寸变量为数字时,以数据单位进行归一化,以缩放打印对象。style_order list指定样式变量级别的外观顺序,否则将根据数据确定。当样式变量为数字时不相关。dashes boolean, list, or dictionary用于确定如何为样式变量的不同级别绘制线。设置为True将使用默认的破折号代码,或者可以将破折号代码列表或样式变量的字典映射级别传递给破折号代码。设置为False将对所有子集使用实线。破折号在matplotlib中指定:一个(段、间隙)长度的元组,或一个用于绘制实线的空字符串。markers boolean, list, or dictionary确定如何为样式变量的不同级别绘制标记。设置为True将使用默认标记,或者可以将标记列表或将样式变量的字典映射级别传递给标记。设置为False将绘制无标记线。标记在matplotlib中指定。legend “auto”, “brief”, “full”, or False如何绘制图例。如果“简短”,数字色调和大小变量将用均匀分布的值样本表示。如果“已满”,每组将在图例中获得一个条目。如果为“自动”,则根据级别数在简短表示或完整表示之间进行选择。如果为False,则不添加图例数据,也不绘制图例。kind stringKind of plot to draw(这是一种要绘制的图), corresponding to a seaborn relational plot. Options are {scatter and line}.height scalar每个面的高度(英寸)aspect scalar每个面的纵横比,因此纵横比*高度(aspect*height)表示每个面的宽度facet_kws dict要传递到FacetGrid的其他关键字参数的字典.units vector or key in data识别采样单位的分组变量。使用时,将为每个单元绘制一条具有适当语义的单独线,但不会添加图例条目。当不需要精确身份时,用于显示实验重复的分布。kwargs key, value pairings其他关键字参数传递给底层plotting函数。Returns
散点型
需求1:分析每周每天花销总额与小费的关系
sns.relplot(x='total_bill',y='tip',data=tips).savefig('pngs/a1.png')
可以发现:消费越高,小费越高;小费集中在1-5之间
需求2:按天分析每天花销总额与小费的关系(分类 hue=‘day’)
sns.relplot(x='total_bill',y='tip',data=data,hue='day').savefig('pngs/a1.png')
可以发现:星期六花销最高,对应的小费也越高
需求3:按午餐和晚餐分类并按天分析每天花销总额与小费的关系(col= ‘time’)
sns.relplot(x='total_bill',y='tip',data = data,hue='day',col='time').savefig('pngs/a1.png')
需求4:按性别分析午餐和晚餐,哪个性别付的小费最多(row=‘sex’)
sns.relplot(x='total_bill',y='tip',data = data,hue='day',col='time',row='sex').savefig('pngs/a1.png')
折线型
案例1:
sns.relplot(x='total_bill',y='tip',data=data,kind='line').savefig('pngs/a1.png')
案例2:
sns.relplot(x='total_bill',y='tip',data=data,kind='line',hue='day').savefig('pngs/a1.png')
案例3:
sns.relplot(x='total_bill',y='tip',data=data,kind='line',hue='day',col='time').savefig('pngs/a1.png')
案例4:
sns.relplot(x='total_bill',y='tip',data=data,kind='line',hue='day',col='time',row='sex').savefig('pngs/a1.png')
案例5:
sns.relplot(x="timepoint", y="signal", data=fmri, kind="line", errorbar=('ci', 60), hue="region", col="event",style="region").savefig('pngs/a1.png')
案例6:
sns.relplot(x="timepoint",y="signal",data=fmri,kind="line",errorbar=('ci', 60),hue="region",col="event").savefig('pngs/a1.png')
案例七:
sns.relplot(x="timepoint",y="signal",data=fmri,kind="line",errorbar=None,hue="region",col="event",style="region").savefig('pngs/a1.png')
2.2.2 分类型绘图
分类统计图,则是根据分类,统计每个分类下的数据的个数或者比例。有以下几种方式:
条形图:barplot() (with kind=“bar”)
柱状图:countplot() (with kind=“count”)
点线图:pointplot() (with kind=“point”)
条形图
seaborn中的条形图具有统计功能,可以统计出比例,平均数,也可以按照你想要的统计函数来统计。
sns.catplot(x='day',y='total_bill',data = data).savefig('pngs/a1.png')
sns.catplot(x='day',y='total_bill',data = data,hue='time').savefig('pngs/a1.png')
sns.catplot(x='day',y='total_bill',data = data,hue='time',row = 'sex').savefig('pngs/a1.png')
sns.catplot(x='day',y='total_bill',data = data,kind='bar').savefig('pngs/a1.png')
sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum).savefig('pngs/a1.png')
sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum,hue='time').savefig('pngs/a1.png')
sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum,hue='time',row='sex').savefig('pngs/a1.png')
2.2.3 泰坦尼克号案例学习
需求1:分析男女获救比例
data1 = pd.read_csv('titanic.csv')
sns.catplot(x='sex',y='survived',data=data1,kind='bar').savefig('pngs/a1.png')
需求2:按舱位分析,男女获救比例
sns.catplot(x='sex',y='survived',data=data1,kind='bar',hue='class').savefig('pngs/a1.png')
可以发现:女性获救比例高于男性,说明人类在灾难面前,往往考虑更多的弱势群体。三等舱获救比例高于一二等舱,说明阶层越高获得的特权就越高
2.2.4 箱体型绘图
sns.boxplot(x='day',y='tip',data=data)
可以发现:以星期天为例,小费平均值为3,最高值将近7,最低值低于1,全天无异常值。
2.2.5 分布型绘图
sns.distplot(),bins柱子分布个数
需求1:泰坦尼克号,所有乘客年龄分布状况
sns.distplot(data1['age'],bins=20)
需求2:二变量分布图
sns.jointplot(x='total_bill',y='tip',data=data,kind='hex')
'''
参数如下:
height图形大小设置
ratio主图和副图之间的比例
space 副图与主图之间的距离
'''sns.jointplot(x='total_bill',y='tip',data=data,kind='hex',gridsize=15,height=10,ratio=3,space=0,marginal_kws={"rug":True,"kde":True},color="red")
四变量两两关系分布图
sns.pairplot(data)
g(‘pngs/a1.png’)
[外链图片转存中...(img-klt2HOrv-1733294501869)]```python
sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum,hue='time',row='sex').savefig('pngs/a1.png')
[外链图片转存中…(img-B5raV7HW-1733294501869)]
2.2.3 泰坦尼克号案例学习
需求1:分析男女获救比例
data1 = pd.read_csv('titanic.csv')
sns.catplot(x='sex',y='survived',data=data1,kind='bar').savefig('pngs/a1.png')
[外链图片转存中…(img-suebEPMu-1733294501869)]
需求2:按舱位分析,男女获救比例
sns.catplot(x='sex',y='survived',data=data1,kind='bar',hue='class').savefig('pngs/a1.png')
[外链图片转存中…(img-7EWEpfpl-1733294501869)]
可以发现:女性获救比例高于男性,说明人类在灾难面前,往往考虑更多的弱势群体。三等舱获救比例高于一二等舱,说明阶层越高获得的特权就越高
2.2.4 箱体型绘图
sns.boxplot(x='day',y='tip',data=data)
[外链图片转存中…(img-3m00zP2D-1733294501869)]
可以发现:以星期天为例,小费平均值为3,最高值将近7,最低值低于1,全天无异常值。
2.2.5 分布型绘图
sns.distplot(),bins柱子分布个数
需求1:泰坦尼克号,所有乘客年龄分布状况
sns.distplot(data1['age'],bins=20)
[外链图片转存中…(img-i3zi7EvU-1733294501869)]
需求2:二变量分布图
[外链图片转存中…(img-Zuyxo6sI-1733294501869)]
sns.jointplot(x='total_bill',y='tip',data=data,kind='hex')
[外链图片转存中…(img-LmPMQMTl-1733294501869)]
'''
参数如下:
height图形大小设置
ratio主图和副图之间的比例
space 副图与主图之间的距离
'''sns.jointplot(x='total_bill',y='tip',data=data,kind='hex',gridsize=15,height=10,ratio=3,space=0,marginal_kws={"rug":True,"kde":True},color="red")
[外链图片转存中…(img-L7pROiv7-1733294501869)]
四变量两两关系分布图
sns.pairplot(data)
[外链图片转存中…(img-ezmckPla-1733294501870)]
2.3 pyecharts模块学习
相关文章:

爬虫项目基础知识详解
文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…...
uniapp 微信小程序webview 和 h5数据通信
项目是uniapp编写,因为是先开发了h5和app,小程序是突然要用的,做兼容开发已经来不及,由于微信小程序webview载入h5 因为通信必须要特殊限制(网页向小程序 postMessage 时,会在以下特定时机触发并收到消息&a…...

SSM01-MyBatis框架(一文学会MyBatis)
Mybatis框架 一、Mybatis框架简介 1.1 传统JDBC的缺陷 (1)数据库连接创建、释放频繁会造成系统资源浪费 【MyBatis通过在核心配置文件中配置数据路连接池解决此问题】 (2) SQL语句在代码中硬编码(PreparedStatement向占位符传…...

【PlantUML系列】状态图(六)
一、状态图的组成部分 状态:对象在其生命周期内可能处于的条件或情形,使用 state "State Name" as Statename 表示。初始状态:表示对象生命周期的开始,使用 [*] 表示。最终状态:表示对象生命周期的结束&…...
JS中重排和重绘的区别是什么?
在JavaScript中,当DOM(文档对象模型)发生变化时,浏览器需要重新计算和更新渲染树,这个过程通常涉及到重排(reflow)和重绘(repaint)。了解这两者之间的区别对于优化页面性…...

工业—使用Flink处理Kafka中的数据_ProduceRecord2
使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“...
C 库中的断言与 FreeRTOS 中的 trace 宏
在 C 编程领域,断言和 FreeRTOS 中的 trace 宏都有着独特而重要的作用。 一、断言(assert) 断言在一般的 C 库中是一个非常有用的工具,它以函数的形式存在。其核心作用在于对程序中的逻辑条件进行检查,确保特定的表达…...

JAVAWeb中的Servlet学习
一 Servlet简介 1.1动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运行之前就写好的资源.例如:html css js img ,音频文件和视频文件 动态资源 需要在程序运行时通过代码运行生成的资源,在程序运行之前无法确定的数据,运行时动态生成,例如Servle…...

docker安装ddns-go(外网连接局域网)
docker先下载镜像,目前最新版是v6.7.6 也可以csdn资源下载 再导入dockers https://download.csdn.net/download/u014756339/90096748 docker load -i ddns-go.tar 启动 docker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/…...
时间复杂度度详解
时间复杂度是衡量算法性能的重要指标,用来描述算法随着输入规模 n 增大,运行时间的增长趋势。以下是时间复杂度的核心概念与常见分类的详细讲解。 1. 时间复杂度的定义 时间复杂度反映了算法执行的 基本操作数量 与输入规模 n 的关系。它通常使用大 O表示法来表示,即: 其中…...
如何处理和优化大文件上传和下载
如何处理和优化大文件上传和下载 简单来说 文件过大会导致内存溢出,上传和下载过慢会影响用户体验,不合理的设计可能引发安全问题,还有网络问题,数据完整性,服务器压力等 文件过大,内存溢出,…...
QT 线程锁
在 Qt 中,线程锁是用来同步多线程访问共享资源的机制,防止数据竞争和线程安全问题。Qt 提供了几种线程锁和同步工具,主要包括以下几种: 1. QMutex 功能:QMutex 是 Qt 中最常用的互斥锁(mutex)…...

光猫开DMZ教程
本教程以移动光猫未例,具体操作以实际光猫为准 1、登录移动光猫管理后台 打开浏览器,在浏览器地址栏输入移动光猫登录管理地址192.168.1.1或者tplogin.cn 按“回车键”打开登录页面,然后输入路由器管理密码登录。 移动光猫登录页面 超级密…...
分区之间的一种度量方法-覆盖度量(Covering Metric)
分区之间的一种度量方法——覆盖度量(Covering Metric),用于量化一个分区如何被另一个分区覆盖或近似。以下是逐步详细解释: 1. 背景与符号说明 分区的概念: 分区是将一个集合(这里是 { 1 , … , n } \{…...

cocos creator接入字节跳动抖音小游戏JSAPI敏感词检测(进行文字输入,但输入敏感词后没有替换为*号)
今天更新了某个抖音小游戏的版本,增加了部分剧情,半天过后一条短信审核未通过,emmm…抖音总是能给开发者惊喜…打开电脑看看这次又整什么幺蛾子… 首先是一脸懵逼,后端早已接入了官方的内容安全检测能力了(https://de…...

13.Java IO 流(文件流、字符流、字符处理流、字节处理流、对象处理流、标准流、转换流、打印流、Properties 配置文件、其他流)
一、文件引入 1、文件的概念 文件是保存数据的地方(例如,文档,图片,音视频等) 2、文件流 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流&…...
掌握 DOM 操作:让你的网页动起来
文章目录 前言一、什么是 DOM?二、DOM 树的结构三、使用 JavaScript 操作 DOM总结前言 在现代 Web 开发中,动态交互几乎是每个网站的标配。而这种交互的实现,离不开 DOM(Document Object Model) 的操作。本次课程深入讲解了 DOM 的基础知识以及如何使用 JavaScript 操作 …...
JVM整理部分面试题
1.如何主动触发垃圾回收? 在Java中,垃圾回收是自动进行的,由Java虚拟机(JVM)负责管理。但是,有时候我们可能希望手动触发垃圾回收以释放一些无用的对象。这可以通过调用System.gc()方法来实现 手动触发垃…...
ubuntu20 使用 pyspacemouse获取 spacemouse wireless 输入
1. 设置设备权限 (1) 默认情况下,普通用户可能没有权限访问 HID 设备,可以通过设置 udev 规则解决: cd /etc/udev/rules.d sudo touch 99-spacemouse.rules sudo gedit 99-spacemouse.rules在新建的99-spacemouse.rules中添加以下内容 SUB…...

windows下Qt5自动编译配置QtMqtt环境(11)
文章目录 [toc]1、概述2、准备1.1 下载源码1.2 配置环境1.3 解释原理 3、编译4、验证5、参考6、视频 更多精彩内容👉内容导航 👈👉Qt网络编程 👈 1、概述 Qt默认是不包含mqtt库的,如果需要使用到mqtt库就只能自己编译配…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...