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

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思,为什么这么写。

按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化,但是呢,也不需要太过精美的图,简单的图简单到包含基本功能、看得懂就行。假如我们不会用python去绘制一些简单的图,我们可能要将数据导入到其他绘图工具(比如Excel等),然后再绘图,这太麻烦了;又假如我们很熟悉Python的各种专门绘图的库,也会用Python做很精美的图表,那当然最好,不过效率自然没有专业的绘图工具(比如Power BI、Tableau、Excel等)高,因为python写代码很费时间和精力,专业的绘图软件往往是拖拽式的,不用写代码,巨方便。我写这篇文章呢,就是保证我们能够用python做简单的可视化图表,但是不会很深入学习,都是常见的图表,所以说我才说“够用”哈。当然了,个人观点,谨慎采纳。

还有就是,本文只讲matplotlib库,不讲别的绘图相关的库,因为matplotlib太实用了。


目录

一、基本概念

1、matplotlib图表元素组成

2、层级结构

3、图表主要元素调整函数说明

4、常见二维图表的绘制函数

5、函数常用参数取值说明

二、常见图表绘制演示

(一)折线图

1.1 单个折线图

1.2 多个折线(在同一张图,且同一纵轴)

1.3 “双纵坐标”折线图

1.4 带数据标记的折线图

 (二)在一个图形(figure)中绘制多张子图

 (三)散点图

3.1 简单的散点图

3.2 带数据标记的散点图

(四)柱状图(竖直型)

4.1 带数据标记的柱状图

4.2 并列柱状图(带数据标记)

4.3 堆积柱状图

(五)饼图

(六)统计直方图

(七)箱线图


一、基本概念

1、matplotlib图表元素组成

图形(figure)、坐标图形(axes)、图名或标题(title)、图例(legend)、主要刻度(major tick)、次要刻度(minor tick)、主要刻度标签(major tick labe l)、次要刻度标签(minor tick label)、Y轴名(Y axis label)、X轴名(X axis label)、边框图(line)、数据标记(markers)、网格(grid)线等。

下图以及部分文本内容取自于《Python数据可视化之美:专业图表绘制指南》。

matplotlib主要包含两类元素

  • 基础类:线(line)、点(maker)、文字(text)、图例(legend)、标题(title)等;
  • 容器类:图形(figure)、坐标图形(axes)、坐标轴(axis)、刻度(tick)

2、层级结构

图形 (figure)→坐标图形(axes)→坐标轴(axis)→刻度(tick)

  • figure对象:整个图形即是一个figure对象,也是一个容器。figure对象至少包含一个子图(也就是axis对象)。它还包含一些特殊对象,比如图名(title)等。
  • axes对象:字面上理解,axes是axis(坐标轴)的复数,但它并不是指坐标轴,而是子图对象。可以这样理解,每一个子图都有X轴和Y轴,axes则用于代表这两个坐标轴所对应的一个子图对象。比如axes[0,0],表示第一个子图,而不是坐标轴,axes[0,1]表示第二个子图。
  • axis对象:axis是数据轴对象,是比figure低一级的容器,主要用于控制数据轴上的刻度位置和显示数值。axis有locator和formatter两个子对象,分别用于 控制刻度位置和显示数值。
  • tick对象:常见的二维直角坐标系(axes)都有两条坐标轴 (axis),横轴(X axis)和纵轴(Y axis)。每个坐标轴都包含两 个元素:刻度(容器类元素),该对象里还包含刻度本身和刻度标 签;标签(基础类元素),该对象包含的是坐标轴标签。

3、图表主要元素调整函数说明

函数核心参数说明功能
subplots()nrows(子图的行数), ncols(子图的列数), figsize(图表大小), dpi(分辨率)、sharex、sharey(子图之间是否共享坐标轴,布尔类型)用于创建一个或多个子图(通过设置nrows、ncols实现),返回值为Figure对象(用于控制整个图形)和包含多个子图的Axes对象(对象用于控制每个子图)
figure()figsize(图表大小)、dpi(分辨率)、facecolor(背景色)、edgecolor设置图表大小、分辨率
title()

str(图名)、fontsize、color

设置标题

xlabel()

ylabel()

xlabel(x轴名称)、ylabel(y轴名称)、rotation(设置标签显示方向,取值为0或1)

设置x、y坐标轴名称

axis()

xlim()

ylim()

xmin、xmax 或 ymin、ymax设置x、y轴的范围

xticks()

yticks()

ticks(刻度数值)、labels(刻度名称)、fontdict设置x、y轴的刻度大小
grid()

b(有无网格线)、which(主/次网格线)、axis(x、y轴网格线,取值主要有‘x’、‘y’、‘both’)、color、linestyle、linewidth、alpha(透明度)

设置x、y轴的主/次网格线
legend()loc(大致位置,比如左上角)、bbox_to_anchor(图例的锚点具体坐标位置)控制图例显示

4、常见二维图表的绘制函数

函数主要参数说明图表类型
plot()x、y、color、linewidth、marker(标记类型)、markersize(标记大小、label(线条标签)、markerfacecolor(标记填充色)折线图、带标记的折线图
scatter()x、y、s(散点图大小)、color、marker(散点类型)、markerfacecolor(标记填充色)散点图、气泡图
bar()

x、y、width、align(柱形位置)、color、edgecolor(柱子边框颜色)

柱状图、堆积柱状图
pie()x、colors(要求颜色列表)、labels(标签)、autopct(百分比文本的格式)、labeldistance(控制标签的位置,默认值为1.1)、pctdistance(控制百分比标签距离饼图中心的距离,默认值0.6)、radius(控制饼图的半径)饼图
hist()x、bins(箱数)、range(设定直方图的x轴的最小值和最大值)、density(是否为频率统计)、align(柱形位置)、label(标签)、color、edgecolor统计直方图
boxplot()x、notch(有无凹槽)、sym(散点类型)、vert(水平或竖直方向,布尔型)、widths、labels(标签)、patch_artist(是否填充箱体颜色)箱型图
text()x、y、s(设置标记值字符串)、ha(水平对齐)、va(垂直对齐)、fontsize给图形生成数据标记

5、函数常用参数取值说明

部分的参数的取值说明:

参数作用取值类型取值
figsize设置图形大小二维数值元组型形如(1,1)、(1,1)等
dip设置图形分辨率数值型
fontsize设置字体大小数值型
linestyle设置线(网格线、折线等)的类型字符串实线(' - ')、虚线(' -- ')、点线(' :  ')、点划线(' -. ')
marker设置数据点的标记样式字符串圆点(o)、方块(s,square)、上三角(^)、菱形(D, diamond)、星状(*)等
alpha设置透明度浮点型取值范围为 0(完全透明)到 1(完全不透明)
xlim、ylim设置 X 、Y 轴范围数值型元组形如 (0, 10)(-5, 5) 等
xticks、yticks标记 X 、Y 轴刻度位置数值型列表形如 [0, 2, 4, 6, 8]
loc设置图例位置字符串'upper right''lower left''best' 等
bbox_to_anchor设置图例的锚点位置数值型元组形如 (1.05, 1)
align控制条形图或箱线图的对齐方式字符串'center'(默认,居中对齐)、'edge'(沿边缘对齐)、None(并排放置)
vert是否将箱线图垂直摆放布尔值True(默认,垂直摆放)、False(水平摆放)
sym指定箱线图中异常点的形状字符串默认为 '+'(加号),也可以是其他标记符号(如 'o''*''r^' 等)
va控制文本的垂直对齐方式字符串'center'(默认,居中对齐)、'top'(顶部对齐)、'bottom'(底部对齐)、'baseline'(基线对齐)
ha控制文本的水平对齐方式字符串'center'(默认,居中对齐)、'left'(左对齐)、'right'(右对齐)
rotation设置标签显示方向(竖直或水平)数值型取值为0或1
autopct自动计算饼图每个扇形的百分比,要设置显示格式字符串

只显示一位小数百分比:'%1.1f%%'

二、常见图表绘制演示

进行可视化前,除了导入必要的库以外,还需要设置中文字体,避免图形中显示中文字体时出现乱码的情况。

import pandas as pd
import matplotlib.pyplot as plt# 设置字体,避免图形中显示中文字体时出现乱码
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 创建示例数据
data = {'Category': ['A', 'B', 'C', 'D', 'E'],'Value1': [10, 20, 35, 50, 100],'Value2': [5, 15, 18, 35, 45],'Value3': [12, 22, 17, 27, 32],'index1': [2, 4, 6, 8, 10]
}
df = pd.DataFrame(data)

:后面所有代码都包含上述代码。 

(一)折线图

1.1 单个折线图

需要注意的是,plt.plot()并不接受x和y作为关键字参数,只接受位置参数,因此,“x=df['index1'], y=df['Value1']”这样写会报错。

# 折线图
plt.plot(df['index1'], df['Value1'], linestyle='-', label='v1')    # 注意要使用位置参数传入x、yplt.title('示例1')
plt.legend()  # 显示图例‘v1’
plt.show()

如果需要调横坐标或纵坐标的刻度范围,可以使用plt.xlim([xmin, xmax])、plt.ylim([ymin, ymax])或plt.axis([xmin, xmax, ymin, ymax]),其中plt.axis()可以一次性修改x、y坐标的刻度范围,演示如下:

# 折线图
plt.plot(df['index1'], df['Value1'], label='v1') # y轴坐标刻度范围改为[0, 200]
plt.ylim([0,200])plt.title('示例1')
plt.legend(loc='upper left')  # 显示图例‘v1’
plt.show()

如果,需要在y轴刻度上显示出75、180、200的点位,并将该点标记为A、B、'200'这三个刻度标签,则可以使用plt.yticks()方法。注意的是,其中的ticks参数的数值只能是y坐标轴的刻度范围内的值(比如示例的y坐标刻度范围是0~200,则ticks参数里的值不能大于200),演示如下:

# 折线图
plt.plot(df['index1'], df['Value1'], label='v1') # y轴坐标刻度范围改为[0, 200]
plt.ylim([0,200])
# 显示y坐标轴的特定点位
plt.yticks(ticks=[77, 100, 200], labels=['A', 'B','200'])plt.title('示例1')
plt.legend(loc='upper left')  # 显示图例‘v1’
plt.show()

1.2 多个折线(在同一张图,且同一纵轴)

plt.plot(df['index1'], df['Value1'], label='v1')  # 绘制 Value1 对应的折线
plt.plot(df['index1'], df['Value2'], label='v2')  # 绘制 Value2 对应的折线plt.title('示例2')
plt.legend(loc='best')  # 显示图例'v1'和'v2'
plt.show()

1.3 “双纵坐标”折线图

有时候两条折线的的纵坐标尺度相差太大,导致另一条在该统一的y轴刻度范围变化幅度不大,甚至显示成了一条直线。可以使用“双纵坐标轴”绘制,演示如下:

# 创建一个含1*1张子图的图形。看不懂这行代码可以先忽略,后面会讲到。
fig, ax1 = plt.subplots(1, 1, figsize=(8,5))    # 设置图形窗口(即容器)的大小为5*8ax1.plot(df['index1'], df['Value1'], label='v1')  # 绘制 Value1 对应的折线# 创建ax1子图第二个纵坐标轴 ax2
ax2 = ax1.twinx()
ax2.plot(df['index1'], df['Value2'], label='v2', color='red')  # 绘制 Value2 对应的折线ax1.set_title('示例2')
ax1.legend(loc='upper left')  # 显示图例'v1'
ax2.legend(loc='upper left', bbox_to_anchor=(0,0.9))  # 显示图例'v2',并设置具体位置,避免与'v1'位置重叠而只显示一个图例
plt.show()

1.4 带数据标记的折线图

演示如下:

# 绘制添加标记线
plt.plot(df['index1'], df['Value1'], linestyle='-', marker='*', label='v1', markersize=10) 
# 绘制不带标记的线
plt.plot(df['index1'], df['Value2'], linestyle='--', marker=None, label='v2')# 添加数据值标记
for i in range(len(df)):plt.text(df['index1'][i], df['Value1'][i], s=str(df['Value1'][i]), ha='center', va='bottom', fontsize=12)   # 显示数据值plt.title('带数据标记的折线图')
plt.legend()  # 显示图例‘v1’
plt.grid(True, axis='both', alpha=0.3)    #显示网格线
plt.show()

 (二)在一个图形(figure)中绘制多张子图

图形(figure)作为一个容器,包含大标题和子图(至少一张)等元素,而其子图又含有子图自己的元素(如子图的标题,子图的横纵坐标,子图的图例等)。下面演示如何在一个图形(figure)中绘制多张子图,来理解这些概念。

# 创建一个含2*2张子图的图形fig。其每张子图(对象)用ax1[0,0],ax1[0,1],...表示。若只有一张图,可以直接用ax1表示子图。
fig, ax1 = plt.subplots(2, 2, figsize=(10,9))    # 设置图形(即容器)的大小为9*10# 设置图形分辨率、可忽略
fig.dpi = 100# 绘制子图1,柱状图
ax1[0,0].bar(df['index1'], df['Value1'], label='v1') 
ax1[0,0].set_title('图1', color='red')
ax1[0,0].legend()
ax1[0,0].set_xlabel('index1')
ax1[0,0].set_ylabel('Value1')# 绘制子图4,折线图
ax1[1,1].plot(df['index1'], df['Value1'], label='v1') 
ax1[1,1].plot(df['index1'], df['Value2'], label='v2') 
ax1[1,1].set_title('图4', color='red')
ax1[1,1].legend()
ax1[1,1].set_xlabel('index1')
ax1[1,1].set_ylabel('y 值')# 图2、图3我就不绘制了。图1、图4做了演示。fig.suptitle('总标题', color='green', fontsize=20)   # 设置总标题
fig.tight_layout()    # 自动调整子图的布局,使得元素之间不会重叠
plt.show()

 (三)散点图

3.1 简单的散点图

plt.scatter(df['index1'], df['Value1'], color='green', label='v1')
plt.scatter(df['index1'], df['Value2'], color='red', label='v2')plt.title('散点图', color='blue')
plt.xlabel('index1')
plt.ylabel('value')
plt.legend()    # 显示图例
plt.show()

3.2 带数据标记的散点图

plt.scatter(df['index1'], df['Value1'], color='green', label='v1', marker='^')
plt.scatter(df['index1'], df['Value2'], color='red', label='v2')# 使用text()添加给‘Value1’标记数值
for i in range(len(df)):plt.text(df['index1'][i], df['Value1'][i], s=str(df['Value1'][i]), ha='center', va='bottom')# 使用text()添加给‘Value2’标记数值
for i in range(len(df)):plt.text(df['index1'][i], df['Value2'][i], s=str(df['Value2'][i]), ha='center', va='bottom')plt.title('带数据标记的散点图', color='blue')
plt.xlabel('index1')
plt.ylabel('value', rotation=1)
plt.legend()    # 显示图例
plt.show()

(四)柱状图(竖直型)

水平柱状图就不做演示了,因为我觉得平时用python进行数据分析时,用竖直型就够了,避免与竖直型的代码搞混淆,真要用到水平柱状图可以用其他工具(比如Excel或其他专业绘图工具)。

4.1 带数据标记的柱状图

plt.bar(df['Category'], df['Value1'], width=0.5, label='v1', color='red')plt.title('简单的柱状图')
plt.xlabel('类别', fontsize=9)
plt.ylabel('value', fontsize=9, rotation=1)
plt.legend(loc='upper left')
plt.show()

4.2 并列柱状图(带数据标记)

也叫分组柱状图。在同一个坐标系中绘制多组数据时,可以通过多次调用 plt.bar() ,并调整每组柱状图的位置,以避免它们重叠。通常,我们会通过偏移每组柱子的位置来实现并排显示。

关键步骤:

  1. 计算柱子的位置(难点):每组类别的 x 轴坐标需要调整,使得三根柱子能够并排显示。

  2. 设置柱子的宽度:确保柱子不会重叠,并留有适当间距。

  3. 绘制多个柱状图:使用 plt.bar() 分别绘制每一组柱子,并调整它们的 x 轴位置。

两组数据示例(带数据标记):

import numpy as np# 定义柱子的宽度
width=0.4# 获取规律的x坐标,用于设置柱子的位置
x = np.arange(len(df))    # 输出[0, 1, 2, 3, 4]# 绘制两组柱状图
bar1 = plt.bar(x-width/2, df['Value1'], width=width, label='v1类', color='orange', edgecolor='black')    # 左移width/2。其中x-width/2为每根柱子底部中心点的横坐标
bar2 = plt.bar(x+width/2, df['Value2'], width=width, label='v2类', color='skyblue', edgecolor='black')    # 右移width/2。其中x+width/2为每根柱子底部中心点的横坐标# 这里有点特别,bar.get_x()获取的是每根柱子底部左下角的横坐标,而不是中心点了。
# 给bar1添加数据标记
for bar in bar1:plt.text(bar.get_x()+bar.get_width()/2, bar.get_height(), s=str(bar.get_height()), ha='center', va='bottom')# 给bar2添加数据标记
for bar in bar2:plt.text(bar.get_x()+bar.get_width()/2, bar.get_height(), s=str(bar.get_height()), ha='center', va='bottom')# 将中心坐标标签由[0, 1, 2, 3, 4]更改为['A', 'B', 'C', 'D', 'E']
plt.xticks(ticks=x, labels=df['Category'])plt.grid(axis='y', linestyle='--', alpha=0.5)   # 显示网格线
plt.title('两组柱状图(带数据标记)', fontsize=13)
plt.ylabel('value值', rotation=1)
plt.xlabel('类别')
plt.legend(loc='upper left')
plt.show()

三组数据(带数据标记),难点也是在于计算柱子的坐标,示例:

import numpy as npplt.figure(figsize=(10, 5))
x = np.arange(len(df))
width = 0.25bar1 = plt.bar(x-width, df['Value1'], width=width, label='v1', color='skyblue', edgecolor='black')    # 左移width
bar2 = plt.bar(x, df['Value2'], width=width, label='v2', color='red', edgecolor='black')    # 不偏移
bar3 = plt.bar(x+width, df['Value3'], width=width, label='v3', color='orange', edgecolor='black')   # 右移widthfor bar in bar1:plt.text(bar.get_x()+width/2, bar.get_height(), s=str(bar.get_height()), va='bottom', ha='center')for bar in bar2:plt.text(bar.get_x()+width/2, bar.get_height(), s=str(bar.get_height()), va='bottom', ha='center')for bar in bar3:plt.text(bar.get_x()+width/2, bar.get_height(), s=str(bar.get_height()), va='bottom', ha='center')# 将中心坐标标签由[0, 1, 2, 3, 4]更改为['A', 'B', 'C', 'D', 'E']
plt.xticks(ticks=x, labels=df['Category'])plt.grid(axis='y', linestyle='--', alpha=0.5)   # 显示网格线
plt.title('三组柱状图(带数据标记)', fontsize=13)
plt.ylabel('value值', rotation=1)
plt.xlabel('类别')
plt.legend(loc='upper left')
plt.show()

4.3 堆积柱状图

堆积直方图的优点:

  1. 适用于比较多个类别在相同区间内的数量或频率。
  2. 通过堆叠显示每个类别的贡献,可以更直观地了解各类别在总数中的占比。

演示如下:

import numpy as npx = np.arange(len(df['Category']))  # x轴位置# 绘制第一类数据
plt.bar(x, df['Value1'], width=0.4, label='Category 1', color='b')# 绘制第二类数据,堆积在第一类数据上(bottom参数表示当前柱子数据堆叠的起始位置,默认为0,即高度为0的位置开始绘制)
plt.bar(x, df['Value2'], width=0.4, bottom=df['Value1'], label='Category 2', color='g')# 绘制第三类数据,堆积在前两类数据上
plt.bar(x, df['Value3'], width=0.4, bottom=df['Value1'] + df['Value2'], label='Category 3', color='r')plt.xlabel('类别')
plt.ylabel('Value')
plt.title('堆积柱状图示例')
plt.xticks(x, labels=df['Category'])  # 设置x轴标签
plt.legend()
plt.show()

(五)饼图

演示如下:

# pie()会自动计算df['Value1']的占比,不用手动计算
plt.pie(df['Value1'], labels=df['Category'], autopct='%0.2f%%', labeldistance=1.05)plt.title('饼图')
plt.show()

(六)统计直方图

统计直方图主要有两种:频率(分布)直方图、概率密度直方图。

两者的区别如下:

特性频率直方图概率密度直方图
定义显示每个区间内数据的频数(数据点的数量)显示每个区间内数据的相对概率密度(每个柱子的总面积为 1)
总面积总面积(所有柱子的高度总和)等于数据点的总数总面积等于 1(归一化后)
计算方式频数 / 区间宽度(没有归一化)(频数 / 总数据量) / 区间宽度,即归一化
用途适合展示数据集的实际分布和频数情况适合展示数据的概率分布,便于进行统计分析和比较不同数据集的分布
典型应用展示单一数据集的实际频数分布用于概率密度估计、正态分布拟合等,需要考虑数据相对概率分布的情况

频率直方图:

import numpy as np# 生成示例数据(1000个正态分布的数据)
data = np.random.randn(1000)# 绘制直方图
plt.hist(data, bins=50, color='red', edgecolor='black', alpha=0.7, label='数据分布')plt.title('频率直方图示例')
plt.xlabel('数据值')
plt.ylabel('频数')plt.legend()
plt.show()

概率密度直方图(只要设置参数 density=True即可):

# 绘制归一化(概率密度)直方图
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7, density=True, label='概率密度')# 添加标题和标签
plt.title('归一化(概率密度)直方图示例')
plt.xlabel('数据值')
plt.ylabel('频数')plt.legend()
plt.show()

(七)箱线图

import matplotlib.pyplot as plt
import numpy as np# 生成示例数据(1000个正态分布的数据)
data = np.random.randn(1000)plt.boxplot(data, patch_artist=True)plt.title('箱型图示例')
plt.ylabel('数据值')
plt.show()

    # 文章如有错误,欢迎大家指正,我们下期文章见。

    相关文章:

    Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

    我先说说文章标题中的“够用版”啥意思,为什么这么写。 按照我个人观点,在使用Python进行数据分析时,我们有时候肯定要结合到图表去进行分析,去直观展现数据的规律和特定,那么我们肯定要做一些简单的可视化&#xff0…...

    麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构

    如果你想拥有你从未拥有过的东西,那么你必须去做你从未做过的事情 之前咱们学习了LNMP架构,但是PHP对于技术来说确实是老掉牙了,PHP的市场占有量越来越少了,我认识一个10年的PHP开发工程师,十年工资从15k到今天的6k&am…...

    Docker集成onlyoffice实现预览功能

    1.拉取镜像 docker pull onlyoffice/documentserver 2. 数据卷挂载 mkdir -p app/onlyoffice/DocumentServer/logs mkdir -p app/onlyoffice/DocumentServer/data mkdir -p app/onlyoffice/DocumentServer/lib mkdir -p app/onlyoffice/DocumentServer/db 3.运行容器 docker ru…...

    Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配

    文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…...

    BladeDISC++:Dynamic Shape AI 编译器下的显存优化技术

    近年来,随着深度学习技术的迅猛发展,越来越多的模型展现出动态特性,这引发了对动态形状深度学习编译器(Dynamic Shape AI Compiler)的广泛关注。本文将介绍阿里云 PAI 团队近期发布的 BladeDISC项目,探讨在动态场景下如何优化深度…...

    FFmpeg常用命令

    文章目录 一、 FFmpeg 音视频的处理流程二、FFmpeg 常用命令2.1、查看本机支持的采集设备2.2、 录制视频2.2.1、原始视频2.2.2、编码的视频 2.3、录制音频:2.3.1、原始音频2.3.2、编码的音频 2.4、录制音视频:2.5、文件格式转换:2.6、提取音频…...

    http请求开启长连接导致请求偶发失败

    问题描述: http长连接的意思是服务器为了调用时减少TCP三次握手开销,会复用之前已经发起的请求,比较适合频繁交互(比如数据推送、流水线操作等)的场景,但是如果超过服务器配置的连接最大空闲时间&#xff0…...

    JUnit单元测试

    单元测试 就是针对最小的功能单元(方法),编写测试代码对其正确性进行测试 JUnit 最流行的java测试框架之一,方柏霓进行单元测试 入门程序 使用Junit,对UserService的方法进行单元测试 1.在pom.xml中,…...

    智慧公安(实景三维公安基层基础平台)建设方案——第4章

    4 建设内容 4.1 标准规范体系 在国家和地方公安基层信息化标准规范的基础上,结合项目实际情况,制定标准规范及管理制度,构建统一的标准规范体系,以便更好地实现公安基层基础信息的高度共享、平台运行的统一协调、业务流程最优化。主要包括以下内容: 1. 业务标准规范 (…...

    LLMs(大型语言模型)的多智能体:Auto-GPT

    LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…...

    《Effective Java》学习笔记——第2部分 对象通用方法最佳实践

    文章目录 第2部分 所有对象通用方法一、前言二、最佳实践内容1. equals()方法2. hashCode()方法3. toString() 方法4. clone() 方法5. finalize() 方法6. compareTo()方法(实现 Comparable 接口) 三、小结 第2部分 所有对象通用方法 一、前言 《Effect…...

    2024年智慧消防一体化安全管控年度回顾与2025年预测

    随着科技的飞速发展,智慧营区一体化安全管控在2024年取得了显著进展,同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大:国家对消防安全的重视程度不断提高,出台了一系列涵盖技术创新、市场应用、人才培…...

    艺术家迟首飞在特殊历史时刻展现中国艺术力量

    艺术家迟首飞在特殊历史时刻展现中国艺术力量 艺术创作的边界正被不断拓展。中国艺术家迟首飞以其纪实视野,将传统与现代元素巧妙融合,展现全球艺坛力量,创作出一系列精彩作品。尤其是《平安兔》《福》与TikTok标志的结合的作品,…...

    探索微服务架构:从单体应用到微服务的转变

    引言 随着互联网业务的日益复杂和用户需求的快速增长,软件开发的架构模式也在不断演进。从最早的单体应用架构到后来的分层架构,再到如今备受关注的微服务架构,每一种架构模式都试图解决软件开发中的不同挑战。尤其是在现代互联网企业中&…...

    MongoDB vs Redis:相似与区别

    前言 在当今的数据库领域,MongoDB 和 Redis 都是备受关注的非关系型数据库(NoSQL),它们各自具有独特的优势和适用场景。本文将深入探讨 MongoDB 和 Redis 的特点,并详细对比它们之间的相似之处和区别,帮助…...

    Jenkins-pipeline语法说明

    一. 简述: Jenkins Pipeline 是一种持续集成和持续交付(CI/CD)工具,它允许用户通过代码定义构建、测试和部署流程。 二. 关于jenkinsfile: 1. Sections部分: Pipeline里的Sections通常包含一个或多个Direc…...

    MySQL(3)运算符、排序与分页

    运算符 一、算术运算符 加减乘除余 举例: SELECT 1001 FROM DUAL; 结果为101,与java中的连接字符串不同。 SELECT 100A FROM DUAL; 结果为100。 也可以理解为,遇到非数值类型时,先转换为数值类型(如2可以转换…...

    Kafka面试题----Kafka消息是采用Pull模式,还是Push模式

    Pull 模式为主 消费者主动拉取:Kafka 中的消费者是基于 Pull 模式来获取消息的。消费者通过向 Kafka 集群发送拉取请求,主动地从 Broker 中获取消息。这种方式使得消费者可以根据自身的消费能力和处理速度来灵活地控制消息的拉取频率和数量,…...

    BLE透传方案,IoT短距无线通信的“中坚力量”

    在物联网(IoT)短距无线通信生态系统中,低功耗蓝牙(BLE)数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输,最高能满足2Mbps的数据传输速率&…...

    借助 .pth 文件完成多个 Python 解释器的合并

    相关搜索 conda 虚拟环境如何使用 ROS 的 Python 模块conda 虚拟环境找不到 catkin_pkg 问题描述 如果你在 Ubuntu 20.04 中装了 conda,那么你的 Ubuntu 会有这些 Python 解释器: /usr/bin/python3:系统的解释器 (版本为 3.8.10&#xff0…...

    今天也是记录小程序进展的一天(破晓时8)

    嗨嗨嗨朋友们,今天又来记录一下小程序的进展啦!真是太激动了,项目又迈出了重要的一步,231啦!感觉每一步的努力都在积累,功能逐渐完善,离最终上线的目标越来越近了。大家一直支持着这个项目&…...

    python高级加密算法AES对信息进行加密和解密

    AES(高级加密标准)是一种广泛使用的对称加密算法,它以字节为单位处理数据,将明文分组加密成密文。AES算法的核心在于一个轮函数,该函数会对数据执行多次变换,包括字节代换、行移位、列混合和轮密钥加。这些…...

    # [Unity]【游戏开发】 脚本生命周期与常见事件方法

    在Unity中,脚本的生命周期是指脚本从创建到销毁的整个过程,以及在此过程中触发的各类事件。掌握脚本生命周期对优化游戏开发过程和避免性能问题至关重要。本文将详细探讨脚本生命周期的关键事件、常见的事件方法,并通过实例说明如何在合适的时机执行脚本逻辑,以确保游戏的流…...

    《探秘鸿蒙Next:非结构化数据处理与模型轻量化的完美适配》

    在鸿蒙Next的人工智能应用场景中,处理非结构化数据并使其适配模型轻量化需求是一项关键且具有挑战性的任务。以下是一些有效的方法和策略。 数据预处理 数据清洗:非结构化数据中往往存在噪声、重复和错误数据。对于文本数据,要去除乱码、特殊…...

    Spring Boot框架下的上海特产销售商城网站开发之旅

    摘要 本项目基于Spring Boot框架开发,旨在创建一个网络上海特产销售商城网站。在黄菊华老师的指导下,该项目不仅涵盖了核心代码讲解和答辩指导,还提供了详尽的开发文档、开题报告、任务书及PPT等毕业设计辅导材料。黄老师是《Vue.js入门与商城…...

    HTML 基础入门:核心标签全解析

    在网页开发的世界里,HTML(超文本标记语言)是基石般的存在。它负责构建网页的基本结构,为用户呈现出丰富多样的内容。今天,就让我们一起深入了解 HTML 中几个极为关键的基础标签,开启网页创作的第一步。 一…...

    Docker基础安装与使用

    Docker 简介 Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序。它通过将应用程序及其依赖项打包到一个轻量级的、可移植的容器中,实现了应用程序的快速部署和跨环境一致性。 Docker 的核心概念 容器(Container)&a…...

    基于Docker的Spark分布式集群

    目录 1. 说明 2. 服务器规划 3. 步骤 3.1 要点 3.2 配置文件 3.2 访问Spark Master 4. 使用测试 5. 参考 1. 说明 以docker容器方式实现apache spark计算集群,能灵活的增减配置与worker数目。 2. 服务器规划 服务器 (1master, 3workers) ip开放端口备注ce…...

    物业管理软件引领智能社区高效服务与管理创新

    内容概要 物业管理软件是在智能社区建设中不可或缺的重要工具。随着城市化进程的加速,社区管理的复杂性也在不断上升,如何提高服务效率和管理水平,已经成为物业公司面临的主要挑战。在这样的背景下,物业管理软件以其强大的功能和…...

    NoETL | 数据虚拟化如何在数据不移动的情况下实现媲美物理移动的实时交付?

    在我们之前的文章中,我们回顾了Denodo在逻辑数据仓库和逻辑数据湖场景中所使用的主要优化技术(具体内容请参阅之前的文章)。 数据架构 | 逻辑数据仓库与物理数据仓库性能对比_物理数仓、逻辑数仓-CSDN博客文章浏览阅读1.5k次,点赞…...

    ovs实现lb负载均衡

    负载均衡定义 负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。常见的实现方式包括: 二层负载均衡‌:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均…...

    2025 OWASP十大智能合约漏洞

    随着去中心化金融(DeFi)和区块链技术的不断发展,智能合约安全的重要性愈发凸显。在此背景下,开放网络应用安全项目(OWASP)发布了备受期待的《2025年智能合约十大漏洞》报告。 这份最新报告反映了不断演变的…...

    在亚马逊云科技上用AI提示词优化功能写出漂亮提示词(下)

    提示工程(Prompt Engineering)对各位小伙伴们来说是再熟悉不过了,提示词工程技术是通过编写指令词,指导开发者们调用AI基础模型(FMs)获得期望的响应。但是经常写提示词的朋友们会知道,为了获取理…...

    智能鞋利用机器学习和深度学习技术进行患者监测和步态分析的演变与挑战

    概述 近年来,创新型 "智能鞋 "层出不穷,将物联网(IoT)和可穿戴设备技术融入 "鞋 "中,成为我们日常生活中不可或缺的一部分。智能鞋可以通过鞋中嵌入的电子元件、传感器、微处理器和其他技术&…...

    Unity编辑拓展显示自定义类型

    配合自定义特性或着header可以添加注解 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; using System.Reflection; using System; using Unity.VisualScripting;#if UNITY_EDITORpublic class EditorRender {public sta…...

    Unity预制体未即时刷新

    有时候在用代码修改预制体某个组件中的属性时,可能原本预制体未及时刷新: 可以使用PrefabUtility.SavePrefabAsset(gameobject)等函数,使得使用代码修改之后马上刷新生效。 一、AssetDatabase.Refresh() 功能: AssetDatabase.Re…...

    SSO VS OAuth2区别

    目录 理解认证与授权 Single Sign On(SSO) ​编辑 OAuth2 OAuth2协议理解 Access Token的秘密 SSO与OAuth2的关系 理解认证与授权 Single Sign On(SSO) 示例图 1、用户通过浏览器访问系统 Protected APP(Goto app) 2、Protected APP 发现没有登录…...

    12_PlayerPrefs存储登录窗口逻辑_回调函数优化Lamd表达式

    创建 登录窗口LoginWnd.cs 绑定 登录窗口LoginWnd.cs 编写 登录窗口LoginWnd.cs using UnityEngine; using UnityEngine.UI; //输入文本 命名空间 //功能 : 登录注册窗口 public class LoginWnd : MonoBehaviour{public InputField iptAcct;public InputField iptPass;public …...

    蒙操作系统(HarmonyOS)

    鸿蒙操作系统(HarmonyOS)是由华为技术有限公司开发的面向未来、面向全场景的分布式操作系统。它旨在为各种不同类型的设备提供统一的操作系统和无缝的智能体验,从智能手机到可穿戴设备,再到智能家居产品等。在鸿蒙的应用生态中&am…...

    PHP同城配送小程序

    🚀 同城极速达——您生活中的极速配送大师 📱 一款专为现代都市快节奏生活量身打造的同城配送小程序,同城极速达,集高效、便捷、智能于一身,依托ThinkPHPGatewayWorkerUniapp的强大架构,巧妙融合用户端、骑…...

    C#语言的学习路线

    C#语言的学习路线 C#作为一种现代编程语言,凭借其简洁的语法、强大的功能和广泛的应用,得到了越来越多开发者的青睐。无论是开发桌面应用、Web应用、游戏,还是云服务,C#都有着广泛的应用场景。本文将为有志于学习C#的读者提供一条…...

    js手写-实现Promise的then方法

    简单引入then 代码 const PROMISE_STATUS_PENDING "pending";const PROMISE_STATUS_FULFILLED "fulfilled";const PROMISE_STATUS_REJECTED "rejected";class MyPromise {constructor(executor) {//status -- 存储promise的状态this.status…...

    分布式系统通信解决方案:Netty Marshalling 全面解析

    分布式系统通信解决方案:Netty Marshalling 全面解析 一、引言 在现代网络编程中,Netty 作为一款高性能、异步事件驱动的网络应用框架,因其强大的功能和灵活的扩展性,备受开发者青睐。Netty 广泛应用于分布式系统、RPC 框架以及…...

    如何轻松实现域名指向服务器

    在互联网时代,域名指向服务器是网站上线的关键步骤。域名是用户访问网站的入口,而服务器则是存储网站数据的地方。将域名正确指向服务器,能让用户顺利访问网站内容。虽然这个过程对新手来说可能有些陌生,但只要掌握正确的方法&…...

    Java Web开发高级——单元测试与集成测试

    测试是软件开发的重要环节,确保代码质量和功能的正确性。在Spring Boot项目中,单元测试和集成测试是常用的两种测试类型: 单元测试:测试单个模块(如类或方法)是否按预期工作。集成测试:测试多个…...

    第九篇: 3.10. 【watchEffect】实现监听,立即执行函数

    官网:立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行该函数。 watch对比watchEffect 都能监听响应式数据的变化,不同的是监听数据变化的方式不同 watch:要明确指出监视的数据 watchEffect&#x…...

    【C++】模板(进阶)

    本篇我们来介绍更多关于C模板的知识。模板初阶移步至:【C】模板(初阶) 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …...

    有了TiDB,是否还需要“散装”大数据组件?

    有了TiDB,是否还需要“散装”大数据组件? 最近和同事们讨论一个问题:在大数据应用日益增多的今天,如果使用了TiDB这样的一体化数据库,还需要使用那些传统的大数据组件(比如Hadoop、Spark等)吗&…...

    OSCP - Proving Grounds - BullyBox

    主要知识点 如果发现有域名,则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件,避免漏掉信息.git dump 具体步骤 执行nmap 扫描,发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…...

    升级《在线写python》小程序的分享功能。昨天忘了...

    小程序是使用uniapp写的,忘了开启分享功能,导致它现在是这样的。 挺不方便的,所以需要开启分享权限, 由于我这个没有其他需要隐藏的私密页面,所以事直接全局开启就行 在App.vue文件里的onShow里开启即可。加入如下代…...