Python数据可视化-第7章-绘制3D图表和统计地图

环境

开发工具

VSCode

库的版本

numpy==1.26.4
matplotlib==3.10.1
ipympl==0.9.7

教材

本书为《Python数据可视化》一书的配套内容,本章为第7章 绘制3D图表和统计地图
本章首先介绍了使用mplot3d工具包绘制3D图表,然后介绍了使用animation模块制作动画,最后介绍了使用basemap工具包绘制统计地图。通过对本章的学习,希望读者能够掌握这些工具包和动画模块的基本用法。

在这里插入图片描述

参考

第7章-绘制3D图表和统计地图

7.1 使用mplot3d绘制3D图表

7.1.1 mplot3d概述

matplotlib不仅专注于二维图表的绘制,也具有绘制3D图表、统计地图的功能,并将这些功能分别封装到工具包mpl_toolkits.mplot3d、mpl_toolkits.basemap中,另外可以结合animation模块给图表添加动画效果。
mplot3d是matplotlib中专门绘制3D图表的工具包,它提供了一个重要的类Axes3D,该类继承自Axes类,使用Axes3D类可以构建一个三维坐标系的绘图区域。

通过以下两种方式可以创建Axes3D类的对象。
第一种:Axes3D()方法。
第二种:add_subplot()方法。

Axes3D()方法
Axes3D()是构造方法,它直接用于构建一个Axes3D类的对象。

Axes3D(fig, rect=None, *args, azim=-60, elev=30, zscale=None, 
sharez=None, proj_type='persp', **kwargs)

fig:表示绘图区域所属的画布
rect:表示绘图区域的位置,它的值是一个元组(left, bottom, width, height),元组中的前两个元素表示绘图区域左侧、底部到画布左侧、底部的距离与画布宽度、高度的比例,后两个元素表示绘图区域的宽度和高度与画布宽度、高度的比例。
azim :表示方位角,默认值是-60度。
elev:表示仰角,默认值是30度。
proj_type:表示投影类型,该参数支持两种取值’persp’(透视图)和 ‘ortho’(正交视图),默认值为’persp’。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
plt.show()

add_subplot()方法

在调用add_subplot()方法添加绘图区域时为该方法传入projection=‘3d’,即指定坐标系的类型为三维坐标系,并返回一个Axes3D类的对象。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
print(type(ax))
plt.show()

输出如下:
在这里插入图片描述

官方推荐使用add_subplot()方法创建Axes3D类的对象。
Axes3D类中提供了一些用于设置标题和坐标轴的方法,关于这些方法及说明具体如下表所示。
在这里插入图片描述

7.1.2 绘制常见的3D图表

常见的3D图表包括3D线框图、3D曲面图、3D柱形图、3D散点图等。 Axes3D类中提供了一些绘制3D图表的方法,关于这些方法及其说明如下表所示。
在这里插入图片描述

绘制3D线框图 plot_wireframe()方法

Axes3D类的对象使用plot_wireframe()方法绘制3D线框图。

plot_wireframe(self, X, Y, Z, *args, **kwargs)

X,Y,Z:表示x、y、z轴的数据。
rcount,ccount:表示每个轴方向上使用的最大样本量,默认为50。若输入的样本量更大,则会采用降采样的方式减少样本的数量;若输入的样本量为0,则不会对相应轴方向的数据进行采样。
rstride,cstride:表示采样的密度。若仅使用参数rstride或cstride中任意一个,则另一个参数默认为1。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 获取测试数据
X, Y, Z = axes3d.get_test_data(0.05)
# 绘制 3D线框图
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)
plt.show()

输出如下:
在这里插入图片描述

绘制3D曲面图-plot_surface()方法

Axes3D类的对象使用plot_surface()方法绘制3D曲面图。

plot_surface(self, X, Y, Z, *args, norm=None, vmin=None, vmax=None, 
lightsource=None, **kwargs)

X,Y,Z:表示x、y、z轴的数据。
rcount,ccount:表示每个坐标轴方向上使用的最大样本量,默认为50。
rstride,cstride:表示采样的密度。
color:表示曲面的颜色。
cmap:表示曲面的颜色映射表。
shade:表示是否对曲面进行着色。注意,若使用cmap参数,则不可以使用shade参数。
linewidth :表示线宽。
antialiased:表示是否抗锯齿。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
x1 = np.arange(-5, 5, 0.25)
y1 = np.arange(-5, 5, 0.25)
print(x1.shape,"\n",x1)
print(y1.shape,"\n",y1)
print("---------")
x1, y1 = np.meshgrid(x1, y1)
print(x1.shape,"\n",x1)
print(y1.shape,"\n",y1)
print("---------")
r1 = np.sqrt(x1** 2 + y1 ** 2)
z1 = np.sin(r1)
print(r1.shape,"\n",r1)
print(z1.shape,"\n",z1)
print("---------")
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制曲面图
ax.plot_surface(x1, y1, z1, cmap=cm.coolwarm, linewidth=0, antialiased=False) 
# 设置 z 轴刻度的范围、位置、格式
ax.set_zlim(-1.01, 1.01)
plt.show()

输出如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.1.3 实例1:三维空间的星星

本实例要求根据一组测试数据,绘制包含若干个五角星的3D散点图。
在这里插入图片描述

# 01_stars_in_3d
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 生成测试数据
x = np.random.randint(0, 40, 5)
y = np.random.randint(0, 40, 5)
z = np.random.randint(0, 40, 5)
# 创建三维坐标系的绘图区域, 并在该区域中绘制3D散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for xx, yy, zz in zip(x, y, z):print(xx, "  ",yy, "  ",zz)color = 'y'if 10 < zz < 20:color = '#C71585'elif zz >= 20:color = '#008B8B'ax.scatter(xx, yy, zz+3, c=color, marker='*', s=160, linewidth=1, edgecolor='black')ax.text(xx, yy, zz, f'({xx}, {yy}, {zz})', fontsize=10, ha='center', va='bottom')
ax.set_xlabel('x轴')
ax.set_ylabel('y轴')
ax.set_zlabel('z轴')
ax.set_title('3D散点图', fontproperties='simhei', fontsize=14)
plt.tight_layout()
plt.show()

输出如下:

38 11 22
0 9 10
20 3 29
15 31 16
29 2 23
在这里插入图片描述

7.2 使用animation制作动图

7.2.1 animation概述

matplotlib在1.1版本的标准库中加入了动画模块——animation,使用该模块的Animation类可以实现一些基本的动画效果。Animation类是一个动画基类。
在这里插入图片描述

FuncAnimation类

FuncAnimation是基于函数的动画类,它通过重复地调用同一函数来制作动画。

FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, 
save_count=None, *, cache_frame_data=True, **kwargs)

fig:表示动画所在的画布。
func:表示每帧动画调用的函数,该函数会被matplotlib库自动调用,并在被调用时将frames中迭代的下一个值传递给它的第一个参数。
frames:表示动画的长度(一次动画包含的帧数),该参数的值是一个可迭代对象。
init_func:表示用于开始绘制帧的函数,它会在第一帧动画之前调用一次。若未设置该参数,则程序将使用frames 中第一项的绘图结果。
fargs:表示传递给func函数的其它参数。
interval:表示更新动画的频率,以毫秒为单位,默认为200。
blit:表示是否更新所有的点,默认为False。

在这里插入图片描述
在这里插入图片描述

# 以qt5为图形界面后端
# %matplotlib 可以使用的后端有:
# inline:将图形嵌入到Jupyter Notebook中
# notebook:将图形嵌入到Jupyter Notebook中
# qt5:在单独的窗口中显示图形
# wx:在单独的窗口中显示图形
# tk:在单独的窗口中显示图形
# osx:在单独的窗口中显示图形
# pdf:将图形保存为PDF文件
# svg:将图形保存为SVG文件
# ps:将图形保存为PS文件
# agg:将图形保存为AGG文件
# svgz:将图形保存为SVGZ文件# %matplotlib widget
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation    # 导入动画类
x = np.arange(0, 2 *np.pi, 0.01)
fig, ax = plt.subplots()
line, = ax.plot(x, np.sin(x))
# 定义每帧动画调用的函数 
def animate(i):line.set_ydata(np.sin(x + i / 10.0))if(i%10==0):# ax.text(1+i%2, 0, i)print(i)passreturn line
# 定义初始化帧的函数
def init():line.set_ydata(np.sin(x))return line
ani = FuncAnimation(fig=fig, func=animate, frames=100, init_func=init, interval=20, blit=False)
plt.show()
ArtistAnimation类

ArtistAnimation是基于一组Artist对象的动画类,它通过每帧绘制一个或一组Artist对象制作动画。

ArtistAnimation(fig, artists, interval, repeat_delay, repeat, 
blit, *args, **kwargs)

fig:表示动画所在的画布。
artists:表示一组Artist 对象的列表。
interval:表示更新动画的频率,以毫秒为单位,默认为200。
repeat_delay:表示再次播放动画之前延迟的时长。
repeat:表示是否重复播放动画。

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
x = np.arange(0, 2 * np.pi, 0.01)
fig, ax = plt.subplots()
arr = []
for i in range(5):line = ax.plot(x, np.sin(x + i))arr.append(line)# 根据arr存储的一组图形创建动画
ani = ArtistAnimation(fig=fig, artists=arr, repeat=True)
plt.show()

大家希望将动画存储为视频文件,可以先安装ffmpeg或mencoder,之后使用Animation类的save()方法将每一帧动画存储为视频文件。

7.2.2 实例2:三维空间闪烁的星星

本实例要求在7.1.3绘制的3D散点图中添加动画,实现五角星由红色到白色最的闪烁效果 。

在这里插入图片描述

# 02_twinkling_stars_in_3d
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.animation import FuncAnimation
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 生成测试数据
xx = np.array([13, 5, 25, 13, 9, 19, 3, 39, 13, 27])
yy = np.array([4, 38, 16, 26, 7, 19, 28, 10, 17, 18])
zz = np.array([7, 19, 6, 12, 25, 19, 23, 25, 10, 15])
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制初始的3D散点图
star = ax.scatter(xx, yy, zz, c='#C71585', marker='*', s=160, linewidth=1, edgecolor='black')
# 每帧动画调用的函数
def animate(i):if i % 2:color = '#C71585'else:color = 'white'next_star = ax.scatter(xx, yy, zz, c=color, marker='*', s = 160, linewidth=1, edgecolor='black')return next_star
def init():return star
ani = FuncAnimation(fig=fig, func=animate, frames=None, init_func =init, interval=1000, blit=False)
ax.set_xlabel('x轴')
ax.set_ylabel('y轴')
ax.set_zlabel('z轴')
ax.set_title('3D散点图', fontproperties='simhei', fontsize=14)
plt.tight_layout()
plt.show()

7.3 使用basemap绘制统计地图

7.3.1 basemap概述

统计地图是以地图为底本,用各种几何图形、实物形象或不同线纹、颜色等表明指标的大小及其分布状况的图形,它是统计图形与地图的结合,既可以突出说明某些现象在地域上的分布,也可以对某些现象进行不同地区间的比较,还可以表明现象所处的地理位置及与其他自然条件的关系等。
basemap是matplotlib中用于绘制地图背景的工具包,它一般情况下不会参与绘图操作,而是将给定的地理坐标转换到地图投影上,之后将数据交给matplotlib进行绘图。

按照basemap

pip install basemap

到入basemap

from mpl_toolkits.basemap import Basemap

basemap工具包中提供了一个重要的类Basemap, 表示基础地图背景,创建Basemap类的对象时可以指定地图投影的类型和要处理的地球区域等一些内容。

Basemap(llcrnrlon=None, llcrnrlat=None, urcrnrlon=None, urcrnrlat=None, llcrnrx=None,, ax=None)

lon_0,lat_0:表示所需地图投影区域中心的经度或纬度。
llcrnrlon,llcrnrlat:表示地图投影区域左下角的经度或纬度。
urcrnrlon,urcrnrlat:表示地图投影区域右上角的经度或纬度。
width,height:表示所需地图投影区域的宽度和高度。
rsphere:表示投影中使用的球体的半径,默认值为6370997米。
resolution:表示包括海岸线、湖泊等的分辨率,可以取值为’c’(粗略,默认值)、’l’(低)、’i’(中级)、’h’(高)、’f’(完整)或None。
area_thresh:表示不会绘制海岸线或湖泊的阈值。
anchor:表示地图置于绘图区域的方式,默认为C,表示地图居中。
projection:表示地图投影的类型,默认值为cyl(等距圆柱投影)。
projection参数的常用取值及说明如下所示。
在这里插入图片描述

确定地图背景的投影区域之后,我们还需要对待处理的区域进行完善,比如在该区域中绘制河岸线、河流和地区或国家边界等。Basemap类中提供了一些绘制地图背景的方法。
在这里插入图片描述
拥有地图背景之后便可以使用matplotlib在地图上根据数据绘制图形。为方便用户操作,Basemap类中提供了一些在地图上绘制数据的方法(这些方法其实简单地转发到Axes实例方法,且进行了一些额外的处理和参数检查) 。
在这里插入图片描述

7.3.2 实例3:美国部分城镇人口分布

本实例要求根据下表的数据(存储于2014_us_cities.csv文件中),获取前500条数据,将获取的lat和lon两列的地理坐标转换到地图投影中,将pop列的数据绘制成气泡并显示到地图上。
在这里插入图片描述

# 03_twinkling_stars_in_3d
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print(os.getcwd())
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 创建 Basemap 对象
map = Basemap(projection='stere', lat_0=90, lon_0=-105, llcrnrlat=23.41, urcrnrlat=45.44, llcrnrlon=-118.67, urcrnrlon=-64.52, rsphere=6371200., resolution='l', area_thresh=10000)
map.drawmapboundary()     # 绘制地图投影周围边界
map.drawstates()          # 绘制州界
map.drawcoastlines()      # 绘制海岸线
map.drawcountries()       # 绘制国家边界
# 绘制纬线
parallels = np.arange(0., 90, 10.)
map.drawparallels(parallels, labels=[1, 0, 0, 0], fontsize=10)
# 绘制经线
meridians = np.arange(-110., -60., 10.)
map.drawmeridians(meridians, labels=[0, 0, 0, 1], fontsize=10)posi = pd.read_csv("./素材/2014_us_cities.csv")
# 从3228组城市数据中选择500 组数据
lat = np.array(posi["lat"][0:500])               # 获取纬度值
lon = np.array(posi["lon"][0:500])               # 获取经度值
pop = np.array(posi["pop"][0:500], dtype=float)  # 获取人口数
# 气泡图的气泡大小
size = (pop / np.max(pop)) * 1000 
x, y = map(lon, lat)
map.scatter(x, y, s=size)
plt.title('2014年美国部分城镇的人口分布情况')
plt.show()

输出如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从零开始学习JVM | 第二篇】HotSpot虚拟机对象探秘

对象的创建 1.类加载检查 虚拟机遇到一条new的指令&#xff0c;首先去检查这个指令的参数能否在常量池中定位到这个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有&#xff0c;那必须先执行类的加载过程。 2.分配内存 在类…

Oracle 表空间高水位收缩全攻略

1. 概述 本文档是针对某个特定用户表空间收缩的文档&#xff0c;实际操作要结合生产库具体情况。主要包括以下几个流程&#xff1a; 收集当前数据库相关信息降低数据库表高水位线Resize 收缩数据文件 具体细节详见以下章节。 2. 时间规划 操作类型预估时间实际时间数据库信…

Pytest多环境切换实战:测试框架配置的最佳实践!

你是否也遇到过这种情况&#xff1a;本地测试通过&#xff0c;一到测试环境就翻车&#xff1f;环境变量错乱、接口地址混乱、数据源配置丢失……这些「环境切换」问题简直像定时炸弹&#xff0c;随时引爆你的测试流程&#xff01; 测试人员每天都跟不同的环境打交道&#xff0…

蓝桥杯赛前题

开始每个人能量为3 答题了&#xff0c;答题者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…

VSCode优雅的使用debug

原始用法&#xff1a;(这里不使用) 配置launch.json&#xff0c;里面传入参数然后debug&#xff0c;这里我们通常需要传入的参数比较多&#xff0c;而且经常修改参数&#xff0c;直接去修改launch.json会比较麻烦&#xff0c;所以使用sh脚本比较方便。 {// Use IntelliSense to…

oracle常见问题处理集锦

oracle常见问题处理集锦 oracle常见问题处理集锦ORA-03001:未实施的功能ORA:28000 the count is locked oracle常见问题处理集锦 ORA-03001:未实施的功能 问题 ORA-03001:未实施的功能 在datagrip中修改表名称&#xff0c;使用的语法是&#xff1a; rename old_name to new_n…

项目日志配置模板示例

1.新增application.properties配置 logging.configclasspath:logback-spring.xml spring.profiles.activedev 将项目部署到服务器时需要将dev修改为test后再进行打包部署 2.新增logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <…

2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果

# 问题一&#xff1a;随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二&#xff1a;LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…

C语言实现TcpDump

一、 在 C 语言中实现 TCP 抓包功能&#xff0c;通常可以使用 libpcap 库。libpcap 是一个广泛使用的网络抓包库&#xff0c;它提供了捕获网络数据包的接口。 libpcap 是一个广泛使用的 C 语言库&#xff0c;用于捕获和过滤网络数据包。它提供了一个通用接口&#xff0c;用于访…

Spark-Core编程

sortByKey算子&#xff1a;对(K, V)型RDD按key排序&#xff0c;K需实现Ordered接口&#xff0c;可指定升序或降序及分区数。 join算子&#xff1a;连接两个(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;类似SQL左外连接&#xff0c;返…

阅读MySQL实战45讲第9天

目录 一、你的 SQL 语句为什么变“慢” 二、什么情况会引发数据库的 flush 过程&#xff1f; 三、分析上面四种场景对性能的影响 四、InnoDB 刷脏页的控制策略 五、原作者小结&#xff1a; 引言&#xff1a; 一条 SQL 语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时…

cin,cin.get(),getchar(),getline(),cin.get line()异同点

文章目录 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等价于cin.operator>>()&#xff0c;即调用成员函数operator>>()进行读取数据。 &#xff08;2&#xff09;当cin>>从缓冲区中读取数据时&…

VMware虚拟机Ubuntu磁盘扩容

VMware中操作&#xff1a; 选择要扩容的虚拟机&#xff0c;点击编辑虚拟机设置 打开后点击磁盘——>点击扩展&#xff08;注意&#xff1a;如果想要扩容的话需要删除快照&#xff09; 调整到你想要的容量 点击上图的扩展——>确定 然后我们进到虚拟机里面 首先&#…

卷积神经网络(CNN)可视化网站汇总

深度学习 文章目录 深度学习前言CNN ExplainerDeep Learning PlaygroundConvNetJSUnderstanding CNN with Interactive Visualizations3Blue1Brown Neural Networks YouTube PlaylistDistill.pubTensorFlow CNN Visualization (TensorBoard)NN-SVGOpenAI Microscope 前言 汇总…

实习技能记录【3】-----Git操作

1. Git是什么 Git 是一个分布式版本控制系统 (Distributed Version Control System, DVCS)。 它的核心目标是跟踪文件的变化&#xff0c;让你能够随时记录、回溯、协作和管理你的项目。 2. 介绍 2.1 Git 工作区、暂存区、本地仓库介绍 区域名称英文名说明相关命令工作区Wor…

蓝桥杯单片机刷题——按键设置当前采集距离为距离参数

设计要求 驱动超声波传感器&#xff0c;启动距离测量功能,并将其结果显示到数码管上。 按键“S5”定义为参数按键&#xff0c;按下S5按键&#xff0c;设备自动将当前采集的距离数据作为距离参数&#xff1b; 若测量的距离数据超过距离参数&#xff0c;指示灯L1点亮&#xff…

KV Cache大模型推理加速功能

KV Cache KV Cache是大模型标配的推理加速功能&#xff0c;也是推理过程中&#xff0c;显存资源巨大开销的元凶之一。在模型推理时&#xff0c;KV Cache在显存占用量可达30%以上。 目前大部分针对KV Cache的优化工作&#xff0c;主要集中在工程上。比如著名的VLLM&#xff0c…

Windows 图形显示驱动开发-WDDM 2.0功能_上下文监视

功能概述 上下文监视机制是GPU与CPU协同计算的核心同步技术&#xff0c;通过受监视围栏&#xff08;Monitored Fence&#xff09;实现跨硬件单元的高效协调。其核心目标是解决以下场景的同步需求&#xff1a; GPU引擎间同步&#xff1a;例如在多渲染管线中&#xff0c;后处理…

基于YOLOv8的机场跑道异物检测识别系统:提升航空安全的新一代解决方案(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​​​​​​​ ​​ 1. 机场跑道异物检测领域概述 机场跑道异物(Foreign Object Debris, FOD)是指存在于机场跑道、滑行道等关…

网络协议学习

最近在适配ESP32的网络驱动&#xff0c;借此机会先学习一下网络通信协议。 以太网帧、IP包及TCP与UDP的报文格式一文读懂网络报问中的检验和&#xff08;checksum&#xff09;—— 原理举例代码 提问腾讯元宝提示词&#xff1a; TCP窗口是干什么的拥塞窗口是什么的