当前位置: 首页 > news >正文

爬虫项目基础知识详解

文章目录

  • 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 库的安装小测

image-20240118171338025

Requests 库的 get() 方法

image-20240118171354536

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 个重要对象

image-20240118171405196

Response 对象的属性

属性说明
r.status_codeHTTP请求的返回状态, 200表示连接成功, 404表示失败
r.textHTTP响应内容的字符串形式,即, url对应的页面内容
r.encoding从HTTP header中猜测的响应内容编码方式
r.apparent_encoding从内容中分析出的响应内容编码方式(备选编码方式)
r.contentHTTP响应内容的二进制形式

r.status_code:只要不是200其实都是连接失败的 !!!!

image-20240118171414007

在使用 get 方法获取网上资源的基本流程:

image-20240118171420242

理解 Response 的编码:

  • r.encoding:编码方式是从 http 的 heder 中的 charset 字段获得的,如果 header 中不存在 charset,则默认认为编码为 ISO-8859-1,这样的编码不能解析中文。r.text 根据 r.encoding 显示网页内容
  • r.apparent_encoding:根据 http 的内容部分,而不是头部分,去分析内容中出现文本可能的编码形式。即根据网页内容分析出的编码方式, 可以看作是 r.encoding 的备选

image-20240118171429462

image-20240118171439275

为什么将 r.apparent_encoding 解析出来的编码方式赋给 r.encoding 后,网页中的中文就可以分析出来,难道 r.text 是以 r.encoding 的方式进行编码的吗?为什么头部分析出来的编码方式会与内容解析出来的不同?
答:r.text 是以 r.encoding 的方式进行编码

爬取网页的通用代码框架

在介绍爬取网页的通用代码框架之前,我们需要理解 Requests 库的异常

image-20240118171447618

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 协议对资源的操作

image-20240118171454085

理解 PATCH 和 PUT 的区别
假设 URL 位置有一组数据 UserInfo,包括 UserID、UserName 等20个字段
需求:用户修改了 UserName,其他不变。
采用 PATCH,仅向 URL 提交 UserName 的局部更新请求。
采用 PUT,必须将所有 20 个字段一并提交到 URL,未提交字段被删除。
PATCH 的最主要好处:节省网络带宽(当 URL 对应的资源是很庞大资源的时候)

image-20240118171500682

HTTP 协议与 Requests 库

image-20240118171508561

Requests 库的 head() 方法

image-20240118171518220

  • 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/falseTrue/False
    nullNone
  • 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时要注意一个问题

image-20240118171535061

输出的会是
‘中国’ 中的ascii 字符码,而不是真正的中文。

这是因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:

image-20240118171544569

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文件至少包括标签、标签、标签和标签,并且这些标签都是成对出现的,开头标签为<>,结束标签为</>,在这两个标签之间添加内容。通过这些标签中的相关属性可以设置页面的背景色、背景图像等。<br/> 例如,我们打开豆瓣首页,摁下键盘上的F12键,打开浏览器自带**“开发者工具”**,可以看到一个完整的html文档结构,如下图

image-20240118171552633

从上图可以看出,一个完整的html文档主要包含三部分:DTD文档头,head头部信息和body正文信息。其中DTD文档头用来告诉浏览器执行标准是什么(比如html4或是html5),head头部信息用来说明浏览器的编码方式和文档头名称,body顾名思义就是浏览器的正文部分。

html标签

作为开始和结束的标记,由尖括号包围的关键词,比如 ,标签对中的第一个标签是开始标签,第二个标签是结束标签。html中常见标签如下:

image-20240118171601142

其中, “< 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")

image-20240118171613207

创建工作簿

不需要提前在文件系统上创建文件,直接就可以使用 openpyxl 开始创建表格。先导入 Workbook 类,再使用 Workbook.active 方法获取一个工作表:

from openpyxl import Workbook
wb = Workbook()
ws = wb.active

默认情况下 Workbook.active(value) 方法中的 value0,即使用此方法获得第一个工作表,我们可以修改此值。也可以使用 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-onlywrite-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.rowsWorksheet.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_rowmax_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应用程序(PyramidFlaskDjango)时,只需使用 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() # 展示图像

image-20240118171629356

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() # 展示图像

image-20240118171637095

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() # 展示图像

image-20240118171644583

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() # 展示图像

image-20240118171652537

修改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. 轴标签和标题

xlabelylabel使用修改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() # 展示图像

image-20240118171701090

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() # 展示图像

image-20240118171710232

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() # 展示图像

image-20240118171718829

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

image-20240118171725665

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

image-20240118171741397

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() # 展示图像

image-20240118171753445

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()# 注意:散点图的数据是一维矩阵 并非是列表数据类型

image-20240118171805569

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

image-20240118171821841

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

image-20240118171829046

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

image-20240118171836316

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

image-20240118171844291

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

image-20240118171851989

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

image-20240118171900251

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')

image-20240118171909263

可以发现:消费越高,小费越高;小费集中在1-5之间

需求2:按天分析每天花销总额与小费的关系(分类 hue=‘day’)

sns.relplot(x='total_bill',y='tip',data=data,hue='day').savefig('pngs/a1.png')

image-20240118171916183

可以发现:星期六花销最高,对应的小费也越高

需求3:按午餐和晚餐分类并按天分析每天花销总额与小费的关系(col= ‘time’)

sns.relplot(x='total_bill',y='tip',data = data,hue='day',col='time').savefig('pngs/a1.png')

image-20240118171923001

需求4:按性别分析午餐和晚餐,哪个性别付的小费最多(row=‘sex’)

sns.relplot(x='total_bill',y='tip',data = data,hue='day',col='time',row='sex').savefig('pngs/a1.png')

image-20240118171935877

折线型

案例1:

sns.relplot(x='total_bill',y='tip',data=data,kind='line').savefig('pngs/a1.png')

image-20240118171944124

案例2:

sns.relplot(x='total_bill',y='tip',data=data,kind='line',hue='day').savefig('pngs/a1.png')

image-20240118171950370

案例3:

sns.relplot(x='total_bill',y='tip',data=data,kind='line',hue='day',col='time').savefig('pngs/a1.png')

image-20240118171957272

案例4:

sns.relplot(x='total_bill',y='tip',data=data,kind='line',hue='day',col='time',row='sex').savefig('pngs/a1.png')

image-20240118172013711

案例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')

image-20240118172020864

案例七:

sns.relplot(x="timepoint",y="signal",data=fmri,kind="line",errorbar=None,hue="region",col="event",style="region").savefig('pngs/a1.png')

image-20240118172030195

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')

image-20240118172037852

sns.catplot(x='day',y='total_bill',data = data,hue='time').savefig('pngs/a1.png')

image-20240118172044322

sns.catplot(x='day',y='total_bill',data = data,hue='time',row = 'sex').savefig('pngs/a1.png')

image-20240118172054172

sns.catplot(x='day',y='total_bill',data = data,kind='bar').savefig('pngs/a1.png')

image-20240118172102638

sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum).savefig('pngs/a1.png')

image-20240118172110152

sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum,hue='time').savefig('pngs/a1.png')

image-20240118172118200

sns.catplot(x='day',y='total_bill',data = data,kind='bar',estimator = sum,hue='time',row='sex').savefig('pngs/a1.png')

image-20240118172128621

2.2.3 泰坦尼克号案例学习

需求1:分析男女获救比例

data1 = pd.read_csv('titanic.csv')
sns.catplot(x='sex',y='survived',data=data1,kind='bar').savefig('pngs/a1.png')

image-20240118172137365

需求2:按舱位分析,男女获救比例

sns.catplot(x='sex',y='survived',data=data1,kind='bar',hue='class').savefig('pngs/a1.png')

image-20240118172145105

可以发现:女性获救比例高于男性,说明人类在灾难面前,往往考虑更多的弱势群体。三等舱获救比例高于一二等舱,说明阶层越高获得的特权就越高

2.2.4 箱体型绘图
sns.boxplot(x='day',y='tip',data=data)

image-20240118172153299

可以发现:以星期天为例,小费平均值为3,最高值将近7,最低值低于1,全天无异常值。

2.2.5 分布型绘图

sns.distplot(),bins柱子分布个数

需求1:泰坦尼克号,所有乘客年龄分布状况

sns.distplot(data1['age'],bins=20)

image-20240118172201301

需求2:二变量分布图

sns.jointplot(x='total_bill',y='tip',data=data,kind='hex')

image-20240118172235455

'''
参数如下:
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")

image-20240118172243222

四变量两两关系分布图
sns.pairplot(data)

image-20240118172258576

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…...

【Leetcode Top 100 - 扩展】876. 链表的中间结点

问题背景 给你单链表的头结点 h e a d head head&#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 数据约束 链表的结点数范围是 [ 1 , 100 ] [1, 100] [1,100] 1 ≤ N o d e . v a l ≤ 100 1 \le Node.val \le 100 1≤…...

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之&#xff1a;内存与垃圾回收篇&#xff08;一&#xff09; ##本篇内容概述&#xff1a; 1、JVM结构 2、类加载子系统 3、运行时数据区之&#xff1a;PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系&#xff0c;它只是与特…...

经典蓝牙(BT/EDR)蓝牙配对与连接

经典蓝牙的连接过程包括跳频&#xff0c;扫描&#xff0c;配置交换等过程。对ACL链路以及sco的连接过程也做详细的分析。 1. 为什么不配对便无法建立连接&#xff1f; 任何无线通信技术都存在被监听和破解的可能&#xff0c;蓝牙SIG为了保证蓝牙通信的安全性&#xff0c;采用…...

用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)

L1 和 L2 正则化&#xff08;L1 and L2 Regularization&#xff09; 引言1. Forward Pass2. Backward pass到此为止的全部代码&#xff1a; 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值&#xff08;称为惩…...

特殊的数学性质

一个数模9的结果等于它的每一位数相加和模9...

最长递增子序列&什么是继承性?C++中如何实现继承?继承的好处和注意事项有哪些?

最长递增子序列 方法一&#xff1a;暴力二维dp&#xff0c;初始状态&#xff1a;每个元素至少和自己构成一个上升序列&#xff0c;大小为1&#xff0c;状态转移&#xff1a;找到前面结尾数字小于当前数组元素的最长序列&#xff0c;当前位置的长度就是lenpre1. class Solutio…...

汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices

在Qt/QML工程的架构中,架构很重要,虽然本身它有分层,比如QML调用资源文件(图片等)显示GUI界面,后面的CPP文件实现界面逻辑,但是这个分类还有点粗。在实际开发中,界面逻辑也就是基于类cpp的实现,也开始使用各种面向对象的设计模式,实现更加优秀的开发架构,这点尤其在…...

面试题整理(二)

芯冰乐知识星球入口:芯冰乐...

编码及其代码

编码 形成文字所需bit点------有相应代号&#xff08;编码---有好多种8/16/24/32&#xff09;都已提前形成好&#xff0c;放哪哪就会形成那个文字 同一个文字在不同编码存的码不一样 用一种编码存的话&#xff0c;如果用另一种编码解析就会出现乱码 Windows默认编码为ANSI …...

python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容

废话不多说&#xff0c;直接开始 本文以无界作为本文测试案例&#xff0c;抓取shadow-root&#xff08;open&#xff09;下的内容 shadow Dom in selenium&#xff1a; 首先先讲一下shadow Dom in selenium 版本的区别&#xff0c;链接指向这里 在Selenium 4版本 以及 chrom…...

AutoClass加载预训练实例

AutoClass 由于 Transformer 架构种类繁多&#xff0c;AtuoClass可以创建一个你想要的做模型架构。作为 &#x1f917; Transformer 核心理念的一部分&#xff0c;使库易于使用、简单且灵活&#xff0c;可以AutoClass从给定的检查点自动推断和加载正确的架构。该from_pretrain…...

在 CentOS 上安装 NFS 服务器

文章目录 1. 在 CentOS 上安装 NFS 服务器1.1 安装 NFS 服务器软件包1.2 配置 NFS 共享目录1.3 配置 NFS 导出文件1.4 启动并启用 NFS 服务1.5 导出共享目录1.6 配置防火墙1.7 检查 NFS 状态 2. 在 CentOS 上安装 NFS 客户端2.1 安装 NFS 客户端软件包2.2 挂载 NFS 共享2.3 配置…...

utf8mb4_unicode_ci、utf8mb4_general_ci、utf8mb4_0900_ai_ci; Mysql 排序字符集的优缺点和选择

标题内容 Mysql的排序字符集真让人头疼&#xff0c;如果两个表的排序字符集不一致&#xff0c;还会导致在进行字段比较的时候直接报错。下面分析几个常用的字符集的优劣和选择。 utf8mb4_unicode_ci 特点 Unicode 标准兼容性高&#xff1a;它是基于 Unicode 标准的排序规则&a…...

星宸SSC8836Q/SSC8836Q-H

SSC8836Q产品是高度集成的多媒体片上系统(SoC)产品&#xff0c;适用于汽车和运动/运动相机等高分辨率智能视频录制和播放应用。 该芯片包括64位双核RISC处理器&#xff0c;先进的图像信号处理器(ISP)&#xff0c;高性能的H.265/H。264/MJPEG视频编解码器&#xff0c;智能处理单…...

rk3576 , android14 , 编译, 卡死,android.bp , ninja

问题&#xff1a;我在 编译 &#xff41;&#xff4e;&#xff44;&#xff52;&#xff4f;&#xff49;&#xff44;&#xff11;&#xff14; 的时候&#xff0c; 卡死再 analysing android.bp 这里 &#xff0c;卡了 3&#xff0c;4 个小时。肯定是有问题的。 如图&…...

3、.Net UI库:MaterialSkin - 开源项目研究文章

MaterialSkin 是一个开源的 WinForms 第三方库&#xff0c;提供了许多仿谷歌设计风格的组件&#xff0c;使得 WinForms 窗体程序更加美观。以下是 MaterialSkin 的一些关键特点和使用方法&#xff1a; 主要特点&#xff1a; 仿谷歌设计风格&#xff1a;MaterialSkin 提供了大量…...

2024年构建PHP应用开发环境

文章目录 前言选择合适的PHP版本安装与配置PHP环境Windows平台Linux平台macOS平台 集成Web服务器数据库连接与管理使用Composer进行依赖管理调试工具的选择代码质量管理部署与持续集成安全性考虑参考资料结语 前言 随着互联网的发展&#xff0c;PHP作为一门成熟的服务器端编程…...

苹果手机iPad投屏到安卓电视,不只有AirPlay一种方法,还可以无线远程投屏!

苹果品牌的设备一般都可以使用airplay功能&#xff0c;将一个屏幕投射到另一个屏幕上。如果是跨品牌或跨系统投屏&#xff0c;airplay就未必能够适应。 提供无线投屏和airplay投屏两种方式的AirDroid Cast已经推出TV版本。苹果手机或iPad可以选择无线&#xff08;远程&#xff…...

什么是内网什么是外网?区别是什么

内网和外网是计算机网络中的两个基本概念&#xff0c;它们在定义、特点和使用场景上有显著的区别。‌虎观代理小二将带大家详细了解内网与外网的定义以及它们之间的主要差异&#xff0c;帮助读者更好地理解和应用这两种网络。 内网&#xff08;局域网&#xff0c;LAN&#xff0…...

基于Springboot+Vue的在线答题闯关系统

基于SpringbootVue的在线答题闯关系统 前言&#xff1a;随着在线教育的快速发展&#xff0c;传统的教育模式逐渐向互联网教育模式转型。在线答题系统作为其中的一个重要组成部分&#xff0c;能够帮助用户通过互动式的学习方式提升知识掌握度。本文基于Spring Boot和Vue.js框架&…...

html css 图片背景透明

html css图标背景透明 css属性&#xff1a; background-color:transparent; mix-blend-mode: multiply; 完整HTML代码&#xff1a; <html><head><title>Test</title></head><body><div id"test" style"background-col…...

Servlet

一 Servlet Servlet (server applet) 是运行在服务端(tomcat)的Java小程序&#xff0c;是sun公司提供一套定义动态资源规范; 从代码层面上来讲Servlet就是一个接口 用来接收、处理客户端请求、响应给浏览器的动态资源。在整个Web应用中&#xff0c;Servlet主要负责接收处理请求…...

MySQL用法---MySQL Workbench创建数据库和表

1. 连接数据库 打开软件&#xff0c;点击左下角卡片&#xff0c;输入设置的数据库密码&#xff0c;勾选单选框 2. 了解主页面的组成部分 3. 创建数据库 先点击工具栏的创建按钮 再输入数据库名称 点击 Apply 创建 4. 创建数据表 展开数据库&#xff0c;在Tables上右键&…...

WordPress Elementor Page Builde 任意文件读取漏洞复现(CVE-2024-9935)

0x01 产品描述: WordPress Elementor Page Builder 是一款 WordPress 插件,它允许用户以可视化方式创建和编辑网页。0x02 漏洞描述: WordPress 的 Elementor Page Builder 插件的 PDF 生成器插件在 1.7.5 之前的所有版本中都容易受到路径遍历的攻击,包括 1.7.5 rtw_pgaepb_…...

静态链接和动态链接的特点

静态链接 链接方式‌&#xff1a;在编译时&#xff0c;所有依赖的库代码被直接打包到生成的可执行文件中。这意味着在程序运行时&#xff0c;不需要再加载任何外部库文件‌。 优点‌&#xff1a; 独立性强‌&#xff1a;生成的可执行文件可以在没有依赖库的系统上直接运行&am…...

内核流对象(Kernel Streaming Objects)

内核流对象(Kernel Streaming Objects)是 Windows 系统中用于处理音频、视频等流媒体数据的重要机制。让我详细解释其作用和主要组件&#xff1a; 1. 主要作用&#xff1a; c // 内核流的核心功能 - 音频/视频数据的实时处理 - 多媒体设备驱动开发 - 硬件与软件之间的数据流传…...

Java 在Json对象字符串中查找和提取特定的数据

1、在处理JSON数据时&#xff0c;需要提出个别字段的值&#xff0c;通过正则表达式提取特定的数据 public static void main(String[] args) {//定义多个JSON对象字符串类型&#xff0c;假设每个对象有a,b,c 字段String strJson "{\"a\":1.23,\"b\"…...

21、结构体成员分布

结构体中的成员并不是紧挨着分布的&#xff0c;内存分布遵循字节对齐的原则。 按照成员定义的顺序&#xff0c;遵循字节对齐的原则存储。 字节对齐的原则&#xff1a; 找成员中占据字节数最大的成员&#xff0c;以它为单位进行空间空配 --- 遇到数组看元素的类型 每一个成员距离…...

【深度学习】四大图像分类网络之ResNet

ResNet网络是在2015年由微软实验室中的何凯明等几位提出&#xff0c;在CVPR 2016发表影响深远的网络模型&#xff0c;由何凯明团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第…...

zookeeper学习

解决什么问题&#xff1f; 首先来分析下业务对象&#xff0c;才能对解决的问题进行归纳和总结。它解决的事分布式应用的问题&#xff0c;那么分布式应用会存在哪里问题是由它的业务特性来决定的&#xff0c;这些问题已是为了解决业务的问题。分布式的业务特征有哪些&#xff1…...

Monkey结合appium模拟操作特定界面

目录 1. 使用 Monkey 操作特定界面&#xff08;通过UI标识来限制&#xff09; 2. 结合 uiautomator 或 appium 定位特定元素 步骤&#xff1a; 3. 使用 Monkey Appium 控制特定界面点击 4. 如何结合 Appium 与 Monkey 5. 限制 Monkey 只点击固定界面上的元素 使用 --pc…...

智能指针【C++11】

文章目录 智能指针std::auto_ptr std::unique_ptrstd::shared_ptrstd::shared_ptr的线程安全问题std::weak_ptr 智能指针 std::auto_ptr 管理权转移 auto_ptr是C98中引入的智能指针&#xff0c;auto_ptr通过管理权转移的方式解决智能指针的拷贝问题&#xff0c;保证一个资源…...

plsql 执行存储过程 SYS_REFCURSOR

关键字&#xff1a;plsql 执行存储过程 SYS_REFCURSOR 在PL/SQL中&#xff0c;SYS_REFCURSOR是一种特殊的数据类型&#xff0c;用于表示引用游标&#xff0c;可以用来返回查询结果或者操作数据库中的结果集。 以下是一个使用SYS_REFCURSOR执行存储过程的例子&#xff1a; CR…...

git修改某次commit(白痴版)

第一步 在bash窗口运行 git rebase --interactive commitId^ 比如要改的commitId是 abcedf git rebase --interactive abcedf^键盘 按 i 或者 ins 进入编辑状态 进入insert 编辑状态 在bash窗口手动把对应commit前面的pick改为e或edit 按 esc 进入退出程序 输入 :wq 保存退出…...

设计模式:19、桥接模式

目录 0、定义 1、桥接模式的四种角色 2、桥接模式的UML类图 3、示例代码 0、定义 将抽象部门与实现部分分离&#xff0c;使它们都可以独立地变化。 1、桥接模式的四种角色 抽象&#xff08;Abstraction&#xff09;&#xff1a;一个抽象类&#xff0c;包含实现者&#xf…...

闭包函数的基础知识

上期文章 1. 函数装饰器 2.闭包 2.1变量作用域 python有3种变量作用域 模块全局作用域:在类或函数外部分配定义的。函数局部作用域:通过参数或者在函数主体中定义的。第3种作用域:闭包中的变量环境 2.2全局变量和局部变量 def fun(a):print(a)print(b)fun(10)10---------…...

python3D圣诞树

import pygame import math from pygame.locals import *# 初始化Pygame pygame.init()# 设置屏幕尺寸和标题 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(3D 圣诞树)# 设置颜色 GREEN (34, 139, 34) BROWN (139,…...

博物馆导览系统方案(一)背景需求分析与核心技术实现

维小帮提供多个场所的室内外导航导览方案&#xff0c;如需获取博物馆导览系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花&#xff01; 一、博物馆导览系统的背景与市场需求 在数字化转型的浪潮中&#xff0c;博物馆作为文化传承和知…...

[代码随想录09]字符串2的总结

前言 处理字符串主要是有思路&#xff0c;同时总结方法。 题目链接 151. 反转字符串中的单词 - 力扣&#xff08;LeetCode&#xff09; 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09; 一、翻转字符串里的单词 这个题目的主要思路&#xff0c;代码采用从后往前遍历字…...

C语言程序设计P5-3【应用函数进行程序设计 | 第三节】——知识要点:函数的嵌套调用和递归调用

知识要点&#xff1a;函数的嵌套调用和递归调用 视频 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 本任务要求用递归法求 n!。 我们知道n!n(n-1)(n-2)……1n(n-1)!递归公式为&#xff1a; 1.上面公式分解为n!n(n-1)!&#xff0c;即将求n!的问题变为…...

【Java】protobuf-maven-plugin主动下载protoc编译proto文件

背景: 我们hadoop的代码里,配置的是3.7.1的protocol buffer,但是编译环境上安装的是2.5.0。 能成功编译,且没有什么兼容性问题。这里非常好奇发生了什么,于是研究了一下protobuf-maven-plugin插件, 发现是他去下载的 在使用protobuf-maven-plugin插件时,我们一般会这么…...

Go学习:变量

目录 1. 变量的命名 2. 变量的声明 3. 变量声明时注意事项 4. 变量的初始化 5. 简单例子 变量主要用来存储数据信息&#xff0c;变量的值可以通过变量名进行访问。 1. 变量的命名 在Go语言中&#xff0c;变量名的命名规则 与其他编程语言一样&#xff0c;都是由字母、数…...

AllegroHand 四指灵巧手:机器人领域的创新力量

Allegro Hand 作为一款高性价比且适应性强的机器人四指灵巧手&#xff0c;凭借其四根手指和十六个独立的电流控制接头&#xff0c;成为机器人复杂抓握、柔性操作以及触觉传感器等研究领域的理想之选。 Allegrohand 四指灵巧手技术特点 机械结构 Allegro Hand的机械结构设计高…...

蓝桥杯准备训练(lesson3 ,c++)

变量与常量 4.1 变量的创建4.2 变量初始化4.3 变量的分类4.4 常量4.4.1 字⾯常量4.4.2 #define定义常量4.4.3 const定义常量4.5 练习练习1&#xff1a;买票练习2&#xff1a;AB问题练习3&#xff1a;鸡兔同笼 4.1 变量的创建 了解清楚了类型&#xff0c;我们使⽤类型做什么呢&…...

Conda + JuiceFS :增强 AI 开发环境共享能力

Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统&#xff0c;因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境&#xff0c;但在环境共享复用方面仍存在一些挑战。比如&#xff0c;在不同机器上复用相…...

小红薯x-s算法最新补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置&#xff0c;本篇文章就直接开始撸代码吧 如果没看过的话可以看&#xff1a;小红薯最新x-s算法分析12-06&#xff08;x-s 56&#xff09;&#xff08;上&#xff09;-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…...

强化ASPICE合规与认可度:关键策略与实践路径

确保ASPICE&#xff08;Automotive SPICE&#xff09;标准的合规性和认可度&#xff0c;是一个涉及多方面努力和持续改进的过程。以下是一些关键步骤和建议&#xff0c;以帮助企业实现这一目标&#xff1a; 一、熟悉ASPICE标准 深入阅读和理解&#xff1a;首先&#xff0c;需要…...

没有合理使用线程池,引发的生产环境BUG

引言 随着多线程和并发处理需求的增加&#xff0c;线程池成为了提升系统性能的重要工具。Java 提供了强大的 ThreadPoolExecutor 类&#xff0c;能够高效地管理线程池&#xff0c;减少线程创建和销毁的开销。然而&#xff0c;当线程池达到其最大容量时&#xff0c;如何优雅地处…...

异步处理与后台任务管理:在 FastAPI 中实现高级特性

异步处理与后台任务管理&#xff1a;在 FastAPI 中实现高级特性 目录 ⚡ 背景任务与异步处理概述&#x1f6e0;️ 使用 BackgroundTasks 执行后台任务&#x1f680; 异步视图函数&#xff1a;使用 async 和 await&#x1f504; 处理并发任务&#xff1a;提升应用性能与响应能…...

抗议者当面痛骂布林肯是“罪犯”,被抬走

...

张宏良:接受和模仿精英阶级的文明是老百姓最大的悲剧

作者:张宏良 发布时间:2025-01-15谎话和脏话最能反映古往今来社会文明的阶级性质,只是让人感到特别可悲的是,不仅统治阶级把谎话看成文明而把脏话看成不文明,从而把容易说脏话的老百姓看作是一个不文明的肮脏群体,甚至就连老百姓自己也把习惯说谎话的精英阶级看作是一个文…...

遵义会议后,毛主席因力阻3万红军被敌40万重兵围歼,曾再失兵权

熟悉军史的人都知道,红军时期,我党我军的创始人毛主席曾三失兵权。用他自己的话说是&ldquo;三次被赶出红军&rdquo; :龙岩城会议&ldquo;选掉&rdquo;了兵权 ,赣南会议&ldquo;取消&rdquo;了兵权,宁都会议&ldquo;撤销&rdquo;了兵权。龙岩城会…...

习近平同斯里兰卡总统迪萨纳亚克会谈

1月15日下午,国家主席习近平在北京人民大会堂同来华进行国事访问的斯里兰卡总统迪萨纳亚克举行会谈。习近平指出,中国和斯里兰卡传统友好。建交68年来,两国关系始终保持健康稳定发展,树立了不同国家友好相处、互利合作的典范。在双方共同努力下,中斯真诚互助、世代友好的战…...

人民日报评论:“文科倒闭潮”能证明“文科无用”吗?

据报道,全球范围似乎形成一股&ldquo;文科倒闭潮&rdquo;。比如,哈佛本科生学院2024年取消了至少30门课程,涉及二十多个系,其中大多是文科专业。美国、英国、韩国等国家的部分高校宣布取消历史、文学、艺术等&ldquo;实用性&rdquo;不强的专业。而在国内高校,…...

自己人坑自己人,快准狠!又一个王星案翻版,救得出来吗?

近日,一位泰国警察陈某,在网上发视频提醒中国人:在泰国有绑架公司,都是中国人,方法就是&mdash;&mdash;他们招聘中国人过来泰国工作。他们会说你到机场的时候,他们也安排团队过来机场接你们,然后他们会用枪用刀控制你,控制你的手机,联系你的家人,问赎金20/30万…...