Matplotlib 完全指南:从入门到精通

news2025/5/13 6:26:01

前言

Matplotlib 是 Python 中最基础、最强大的数据可视化库之一。无论你是数据分析师、数据科学家还是研究人员,掌握 Matplotlib 都是必不可少的技能。本文将带你从零开始学习 Matplotlib,帮助你掌握各种图表的绘制方法和高级技巧。
在这里插入图片描述

目录

  1. Matplotlib 简介
  2. 安装与基础配置
  3. 基础绘图
  4. 常用图表类型
  5. 图表样式与美化
  6. 多子图布局
  7. 高级技巧
  8. 实战案例
  9. 常见问题与解决方案
  10. 总结与资源

Matplotlib 简介

Matplotlib 是一个用于创建静态、动态和交互式图表的 Python 库。它由 John D. Hunter 在 2003 年开发,灵感来自于 MATLAB 的绘图功能。

主要特点

  • 功能全面:支持多种图表类型,从简单的线图到复杂的 3D 图表
  • 高度可定制:几乎所有图表元素都可以自定义
  • 跨平台:支持多种输出格式(PNG、PDF、SVG 等)
  • 与其他库的良好集成:特别是 NumPy 和 Pandas
  • 活跃的社区:丰富的文档和示例

安装与基础配置

安装

# 使用 pip 安装
pip install matplotlib

# 使用 conda 安装
conda install matplotlib

基础导入

import matplotlib.pyplot as plt
import numpy as np

# 设置中文显示(解决中文乱码问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号

Jupyter Notebook 配置

# 在 Jupyter Notebook 中显示图片
%matplotlib inline

# 使用高清显示
%config InlineBackend.figure_format = 'retina'

基础绘图

第一个图表

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 创建图表
plt.figure(figsize=(8, 6))
plt.plot(x, y)
plt.title('正弦函数图')
plt.xlabel('x 轴')
plt.ylabel('y 轴')
plt.grid(True)
plt.show()

图表的基本组成

一个完整的 Matplotlib 图表包含以下主要组件:

  • Figure(画布):整个图表的容器
  • Axes(坐标系):实际的绘图区域
  • Axis(坐标轴):x 轴和 y 轴
  • Artist(图表元素):所有可见的元素(线条、文本、标记等)
# 面向对象的绘图方式
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y)
ax.set_title('正弦函数图')
ax.set_xlabel('x 轴')
ax.set_ylabel('y 轴')
ax.grid(True)
plt.show()

常用图表类型

1. 线图(Line Plot)

# 多条线图
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

plt.figure(figsize=(10, 6))
plt.plot(x, y1, label='sin(x)', color='blue', linestyle='-', linewidth=2)
plt.plot(x, y2, label='cos(x)', color='red', linestyle='--', linewidth=2)
plt.title('三角函数图')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

2. 散点图(Scatter Plot)

# 创建随机数据
np.random.seed(42)
x = np.random.randn(100)
y = 2 * x + 1 + np.random.randn(100) * 0.5

plt.figure(figsize=(8, 6))
plt.scatter(x, y, c=x, cmap='viridis', alpha=0.6, s=50)
plt.colorbar(label='x值')
plt.title('散点图示例')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

3. 柱状图(Bar Chart)

# 柱状图
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]

plt.figure(figsize=(8, 6))
bars = plt.bar(categories, values, color='skyblue', edgecolor='navy', alpha=0.7)

# 在柱子上添加数值
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height,
             f'{height}', ha='center', va='bottom')

plt.title('柱状图示例')
plt.xlabel('类别')
plt.ylabel('数值')
plt.grid(True, axis='y', alpha=0.3)
plt.show()

4. 直方图(Histogram)

# 生成正态分布数据
data = np.random.normal(100, 15, 1000)

plt.figure(figsize=(10, 6))
n, bins, patches = plt.hist(data, bins=30, density=True, alpha=0.7, 
                           color='green', edgecolor='black')

# 添加正态分布曲线
mu, sigma = np.mean(data), np.std(data)
x = np.linspace(data.min(), data.max(), 100)
plt.plot(x, 1/(sigma * np.sqrt(2 * np.pi)) * 
         np.exp(-0.5 * ((x - mu) / sigma) ** 2),
         'r-', linewidth=2, label='正态分布曲线')

plt.title('直方图与正态分布')
plt.xlabel('数值')
plt.ylabel('频率密度')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

5. 饼图(Pie Chart)

# 饼图数据
sizes = [30, 25, 20, 15, 10]
labels = ['A', 'B', 'C', 'D', 'E']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#ff99cc']
explode = (0.05, 0, 0, 0, 0)  # 突出显示第一块

plt.figure(figsize=(8, 8))
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
        shadow=True, startangle=90)
plt.title('饼图示例')
plt.axis('equal')
plt.show()

6. 箱线图(Box Plot)

# 创建多组数据
data = [np.random.normal(0, std, 100) for std in range(1, 5)]

plt.figure(figsize=(8, 6))
bp = plt.boxplot(data, patch_artist=True, labels=['A', 'B', 'C', 'D'])

# 自定义箱线图颜色
colors = ['lightblue', 'lightgreen', 'lightpink', 'lightyellow']
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)

plt.title('箱线图示例')
plt.xlabel('组别')
plt.ylabel('数值')
plt.grid(True, alpha=0.3)
plt.show()

图表样式与美化

1. 使用内置样式

# 查看可用样式
print(plt.style.available)

# 使用样式
plt.style.use('seaborn')
# 或者使用临时样式
with plt.style.context('ggplot'):
    plt.plot(x, y)
    plt.show()

2. 自定义颜色和样式

# 自定义颜色映射
from matplotlib import cm

x = np.linspace(0, 2*np.pi, 100)
fig, ax = plt.subplots(figsize=(10, 6))

# 使用不同的颜色和样式
for i in range(5):
    y = np.sin(x + i*0.5)
    color = cm.viridis(i/4)  # 使用颜色映射
    ax.plot(x, y, color=color, linewidth=2, 
            label=f'sin(x + {i*0.5:.1f})')

ax.set_title('使用颜色映射的多条曲线')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()

3. 添加注释和标记

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

fig, ax = plt.subplots(figsize=(10, 6))
ax.plot(x, y, 'b-', linewidth=2)

# 标记最大值点
max_idx = np.argmax(y)
ax.plot(x[max_idx], y[max_idx], 'ro', markersize=10)

# 添加注释
ax.annotate(f'最大值: {y[max_idx]:.2f}', 
            xy=(x[max_idx], y[max_idx]), 
            xytext=(x[max_idx]+1, y[max_idx]+0.1),
            arrowprops=dict(arrowstyle='->', color='red'),
            fontsize=12)

# 添加文本
ax.text(5, -0.5, '正弦函数', fontsize=16, ha='center',
        bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))

ax.set_title('带注释的正弦函数图')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True, alpha=0.3)
plt.show()

多子图布局

1. 使用 subplot

# 创建 2x2 的子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 数据
x = np.linspace(0, 2*np.pi, 100)

# 子图1:正弦函数
axes[0, 0].plot(x, np.sin(x), 'b-')
axes[0, 0].set_title('正弦函数')

# 子图2:余弦函数
axes[0, 1].plot(x, np.cos(x), 'r-')
axes[0, 1].set_title('余弦函数')

# 子图3:正切函数
axes[1, 0].plot(x, np.tan(x), 'g-')
axes[1, 0].set_ylim(-5, 5)
axes[1, 0].set_title('正切函数')

# 子图4:组合
axes[1, 1].plot(x, np.sin(x), 'b-', label='sin(x)')
axes[1, 1].plot(x, np.cos(x), 'r-', label='cos(x)')
axes[1, 1].set_title('组合图')
axes[1, 1].legend()

# 调整子图间距
plt.tight_layout()
plt.show()

2. 使用 GridSpec

from matplotlib.gridspec import GridSpec

fig = plt.figure(figsize=(12, 8))
gs = GridSpec(3, 3, figure=fig)

# 创建不同大小的子图
ax1 = fig.add_subplot(gs[0, :])
ax2 = fig.add_subplot(gs[1, :2])
ax3 = fig.add_subplot(gs[1:, 2])
ax4 = fig.add_subplot(gs[2, 0])
ax5 = fig.add_subplot(gs[2, 1])

# 在每个子图中绘制
x = np.linspace(0, 10, 100)
ax1.plot(x, np.sin(x))
ax1.set_title('主图')

ax2.bar(['A', 'B', 'C'], [3, 7, 5])
ax2.set_title('柱状图')

ax3.scatter(np.random.randn(50), np.random.randn(50))
ax3.set_title('散点图')

ax4.pie([30, 70], labels=['A', 'B'])
ax4.set_title('饼图')

ax5.hist(np.random.normal(0, 1, 100))
ax5.set_title('直方图')

plt.tight_layout()
plt.show()

高级技巧

1. 双坐标轴

# 创建具有两个 y 轴的图表
fig, ax1 = plt.subplots(figsize=(10, 6))

x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.exp(x/10)

# 第一个 y 轴
color = 'tab:red'
ax1.set_xlabel('x')
ax1.set_ylabel('sin(x)', color=color)
ax1.plot(x, y1, color=color)
ax1.tick_params(axis='y', labelcolor=color)

# 第二个 y 轴
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('exp(x/10)', color=color)
ax2.plot(x, y2, color=color)
ax2.tick_params(axis='y', labelcolor=color)

plt.title('双 Y 轴图表')
fig.tight_layout()
plt.show()

2. 3D 图表

from mpl_toolkits.mplot3d import Axes3D

# 创建 3D 图表
fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(111, projection='3d')

# 创建数据
x = np.linspace(-5, 5, 50)
y = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制 3D 表面
surf = ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.8)

# 添加轮廓线
contours = ax.contour(X, Y, Z, zdir='z', offset=-2, cmap='viridis')

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('3D 表面图')

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

3. 动画

from matplotlib.animation import FuncAnimation

# 创建动画
fig, ax = plt.subplots(figsize=(8, 6))
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1.5, 1.5)

x = np.linspace(0, 2*np.pi, 1000)
line, = ax.plot([], [], 'b-')

def init():
    line.set_data([], [])
    return line,

def animate(frame):
    y = np.sin(x + frame/10)
    line.set_data(x, y)
    return line,

# 创建动画(这里只展示代码,实际运行需要保存或在支持的环境中显示)
anim = FuncAnimation(fig, animate, init_func=init, 
                    frames=100, interval=50, blit=True)

# 保存动画
# anim.save('sine_wave.gif', writer='pillow')
plt.show()

实战案例

案例 1:股票价格分析图

# 模拟股票数据
dates = pd.date_range('2023-01-01', periods=100)
stock_price = 100 + np.cumsum(np.random.randn(100) * 2)
volume = np.random.randint(1000000, 5000000, 100)

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

# 价格图
ax1.plot(dates, stock_price, 'b-', linewidth=2)
ax1.fill_between(dates, stock_price, alpha=0.3)
ax1.set_ylabel('价格 (元)')
ax1.set_title('股票价格走势图')
ax1.grid(True, alpha=0.3)

# 成交量图
ax2.bar(dates, volume, color='gray', alpha=0.7)
ax2.set_ylabel('成交量')
ax2.set_xlabel('日期')
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

案例 2:数据分析仪表盘

# 创建仪表盘布局
fig = plt.figure(figsize=(15, 10))
gs = GridSpec(3, 3, figure=fig, hspace=0.3, wspace=0.3)

# 数据准备
np.random.seed(42)
categories = ['产品A', '产品B', '产品C', '产品D', '产品E']
sales = np.random.randint(50, 200, 5)
months = ['1月', '2月', '3月', '4月', '5月', '6月']
monthly_sales = np.random.randint(100, 500, (6, 5))

# 1. 总销售额饼图
ax1 = fig.add_subplot(gs[0, :2])
ax1.pie(sales, labels=categories, autopct='%1.1f%%', startangle=90)
ax1.set_title('产品销售占比')

# 2. 月度销售趋势
ax2 = fig.add_subplot(gs[0, 2])
for i, product in enumerate(categories):
  ax2.plot(months, monthly_sales[:, i], marker='o', label=product)
  ax2.set_title('月度销售趋势')
  ax2.legend(fontsize=8)
  ax2.grid(True, alpha=0.3)

  # 3. 销售额柱状图
  ax3 = fig.add_subplot(gs[1, :])
  x = np.arange(len(categories))
  width = 0.15
  for i, month in enumerate(months[:4]):
    ax3.bar(x + i*width, monthly_sales[i], width, label=month)
    ax3.set_xlabel('产品')
    ax3.set_ylabel('销售额')
    ax3.set_title('各产品月度销售对比')
    ax3.set_xticks(x + width * 1.5)
    ax3.set_xticklabels(categories)
    ax3.legend()
    ax3.grid(True, axis='y', alpha=0.3)

    # 4. 销售额热力图
    ax4 = fig.add_subplot(gs[2, :2])
    im = ax4.imshow(monthly_sales, cmap='YlOrRd', aspect='auto')
    ax4.set_xticks(np.arange(len(categories)))
    ax4.set_yticks(np.arange(len(months)))
    ax4.set_xticklabels(categories)
    ax4.set_yticklabels(months)
    ax4.set_title('销售额热力图')

    # 在热力图上显示数值
    for i in range(len(months)):
      for j in range(len(categories)):
        text = ax4.text(j, i, monthly_sales[i, j],
                        ha="center", va="center", color="black")

        # 5. KPI 指标
        ax5 = fig.add_subplot(gs[2, 2])
        ax5.text(0.5, 0.7, '总销售额', ha='center', va='center', fontsize=14)
        ax5.text(0.5, 0.5, f'{np.sum(monthly_sales):,}', ha='center', va='center', 
                 fontsize=24, fontweight='bold', color='red')
        ax5.text(0.5, 0.3, '同比增长 +23.5%', ha='center', va='center', 
                 fontsize=12, color='green')
        ax5.set_xlim(0, 1)
        ax5.set_ylim(0, 1)
        ax5.axis('off')

        plt.suptitle('销售数据分析仪表盘', fontsize=16)
        plt.show()

常见问题与解决方案

1. 中文显示问题

# 解决方案1:设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows
# plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  # macOS
plt.rcParams['axes.unicode_minus'] = False

# 解决方案2:使用 FontProperties
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='path/to/font.ttf')
plt.title('中文标题', fontproperties=font)

2. 图表大小和分辨率

# 设置图表大小
plt.figure(figsize=(12, 8))

# 设置 DPI(分辨率)
plt.figure(dpi=150)

# 保存高分辨率图片
plt.savefig('figure.png', dpi=300, bbox_inches='tight')

3. 图例位置调整

# 自动调整位置
plt.legend(loc='best')

# 指定位置
plt.legend(loc='upper right')

# 放在图表外部
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

4. 坐标轴范围和刻度

# 设置坐标轴范围
plt.xlim(0, 10)
plt.ylim(-1, 1)

# 设置刻度
plt.xticks(np.arange(0, 11, 2))
plt.yticks([-1, -0.5, 0, 0.5, 1])

# 旋转刻度标签
plt.xticks(rotation=45)

总结与资源

学习要点回顾

  1. 基础概念:理解 Figure、Axes、Axis 等核心概念
  2. 绘图方式:掌握函数式和面向对象两种绘图方式
  3. 图表类型:熟练使用各种常见图表类型
  4. 样式美化:学会自定义图表样式和颜色
  5. 布局技巧:掌握多子图和复杂布局
  6. 高级功能:了解 3D 绘图、动画等高级特性

推荐资源

  1. 官方文档:matplotlib.org
  2. 示例库:Matplotlib Gallery
  3. 教程:
    • Matplotlib Tutorial
    • Python Data Science Handbook
  4. 相关库:
    • Seaborn:基于 Matplotlib 的统计图表库
    • Plotly:交互式图表库
    • Bokeh:Web 交互式可视化

最佳实践

  1. 选择合适的图表类型:根据数据特点和展示目的选择
  2. 保持简洁:避免过度装饰,突出数据本身
  3. 使用有意义的标签:确保轴标签、标题清晰明了
  4. 选择合适的颜色:考虑色盲用户,使用对比度高的配色
  5. 添加必要的说明:使用图例、注释等帮助理解

结语

Matplotlib 是 Python 数据可视化的基石,掌握它将为你的数据分析工作提供强大支持。通过本文的学习,相信你已经对 Matplotlib 有了全面的了解。记住,最好的学习方式是实践,多动手尝试不同的图表和参数,逐步提升你的可视化技能。

Happy plotting! 🎨📊

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

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

相关文章

如何有效追踪需求的实现情况

有效追踪需求实现情况,需要清晰的需求定义、高效的需求跟踪工具、持续的沟通反馈机制,其中高效的需求跟踪工具尤为关键。 使用需求跟踪工具能确保需求实现进度可视化、提高团队协作效率,并帮助识别和管理潜在风险。例如,使用专业的…

自动驾驶技术栈——DoIP通信协议

一、DoIP协议简介 DoIP,英文全称是Diagnostic communication over Internet Protocol,是一种基于因特网的诊断通信协议。 DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信,常用于汽车行业的远程诊断、远…

C++ 与 Go、Rust、C#:基于实践场景的语言特性对比

目录 ​编辑 一、语法特性对比 1.1 变量声明与数据类型 1.2 函数与控制流 1.3 面向对象特性 二、性能表现对比​编辑 2.1 基准测试数据 在计算密集型任务(如 10⁷ 次加法运算)中: 在内存分配测试(10⁵ 次对象创建&#xf…

如何更改默认字体:ONLYOFFICE 协作空间、桌面编辑器、文档测试示例

在处理办公文件时,字体对提升用户体验至关重要。本文将逐步指导您如何在 ONLYOFFICE 协作空间、桌面应用及文档测试示例中自定义默认字体,以满足个性化需求,更好地掌控文档样式。 关于 ONLYOFFICE ONLYOFFICE 是一个国际开源项目&#xff0c…

设计模式之工厂模式(二):实际案例

设计模式之工厂模式(一) 在阅读Qt网络部分源码时候,发现在某处运用了工厂模式,而且编程技巧也用的好,于是就想分享出来,供大家参考,理解的不对的地方请多多指点。 以下是我整理出来的类图: 关键说明&#x…

基于VeRL源码深度拆解字节Seed的DAPO

1. 背景与现状:从PPO到GRPO的技术演进 1.1 PPO算法的基础与局限 Proximal Policy Optimization(PPO)作为当前强化学习领域的主流算法,通过重要性采样比率剪裁机制将策略更新限制在先前策略的近端区域内,构建了稳定的…

zst-2001 历年真题 软件工程

软件工程 - 第1题 b 软件工程 - 第2题 c 软件工程 - 第3题 c 软件工程 - 第4题 b 软件工程 - 第5题 b 软件工程 - 第6题 0.未完成:未执行未得到目标。1.已执行:输入-输出实现支持2.已管理:过程制度化,项目遵…

基于WSL用MSVC编译ffmpeg7.1

在windows平台编译FFmpeg,网上的大部分资料都是推荐用msys2mingw进行编译。在win10平台,我们可以采用另一种方式,即wslmsvc 实现window平台的ffmpeg编译。 下面将以vs2022ubuntu22.04 为例,介绍此方法 0、前期准备 安装vs2022 &…

java命令行打包class为jar并运行

1.创建无包名类: 2.添加依赖jackson 3.引用依赖包 4.命令编译class文件 生成命令: javac -d out -classpath lib/jackson-core-2.13.3.jar:lib/jackson-annotations-2.13.3.jar:lib/jackson-databind-2.13.3.jar src/UdpServer.java 编译生成class文件如下 <

vue注册用户使用v-model实现数据双向绑定

定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…

Nacos源码—8.Nacos升级gRPC分析六

大纲 7.服务端对服务实例进行健康检查 8.服务下线如何注销注册表和客户端等信息 9.事件驱动架构源码分析 一.处理ClientChangedEvent事件 也就是同步数据到集群节点&#xff1a; public class DistroClientDataProcessor extends SmartSubscriber implements DistroDataSt…

SpringBoot 自动装配原理 自定义一个 starter

目录 1、pom.xml 文件1.1、parent 模块1.1.1、资源文件1.1.1.1、resources 标签说明1.1.1.2、从 Maven 视角&#xff1a;资源处理全流程​ 1.1.2、插件 1.2、dependencies 模块 2、启动器3、主程序3.1、SpringBootApplication 注解3.2、SpringBootConfiguration 注解3.2.1、Con…

【C++进阶篇】多态

深入探索C多态&#xff1a;静态与动态绑定的奥秘 一. 多态1.1 定义1.2 多态定义及实现1.2.1 多态构成条件1.2.1.1 实现多态两个必要条件1.2.1.2 虚函数1.2.1.3 虚函数的重写/覆盖1.2.1.4 协变1.2.1.5 析构函数重写1.2.1.6 override和final关键字1.2.1.7 重载/重写/隐藏的对⽐ 1…

《AI大模型应知应会100篇》第60篇:Pinecone 与 Milvus,向量数据库在大模型应用中的作用

第60篇&#xff1a;Pinecone与Milvus&#xff0c;向量数据库在大模型应用中的作用 摘要 本文将系统比较Pinecone与Milvus两大主流向量数据库的技术特点、性能表现和应用场景&#xff0c;提供详细的接入代码和最佳实践&#xff0c;帮助开发者为大模型应用选择并优化向量存储解…

Java学习手册:客户端负载均衡

一、客户端负载均衡的概念 客户端负载均衡是指在客户端应用程序中&#xff0c;根据一定的算法和策略&#xff0c;将请求分发到多个服务实例上。与服务端负载均衡不同&#xff0c;客户端负载均衡不需要通过专门的负载均衡设备或服务&#xff0c;而是直接在客户端进行请求的分发…

Docker私有仓库实战:官方registry镜像实战应用

抱歉抱歉&#xff0c;离职后反而更忙了&#xff0c;拖了好久&#xff0c;从4月拖到现在&#xff0c;在学习企业级方案Harbor之前&#xff0c;我们先学习下官方方案registry&#xff0c;话不多说&#xff0c;详情见下文。 注意&#xff1a;下文省略了基本认证 TLS加密&#xff…

Redis+Caffeine构建高性能二级缓存

大家好&#xff0c;我是摘星。今天为大家带来的是RedisCaffeine构建高性能二级缓存&#xff0c;废话不多说直接开始~ 目录 二级缓存架构的技术背景 1. 基础缓存架构 2. 架构演进动因 3. 二级缓存解决方案 为什么选择本地缓存&#xff1f; 1. 极速访问 2. 减少网络IO 3…

【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 上篇文章&#xff1a;以太网、MAC地址、MTU与ARP协议 下篇文章&#xff1a;五种IO模型与阻…

Python训练打卡Day21

常见的降维算法&#xff1a; # 先运行预处理阶段的代码 import pandas as pd import pandas as pd #用于数据处理和分析&#xff0c;可处理表格数据。 import numpy as np #用于数值计算&#xff0c;提供了高效的数组操作。 import matplotlib.pyplot as plt #用于绘…

node .js 启动基于express框架的后端服务报错解决

问题&#xff1a; node .js 用npm start 启动基于express框架的后端服务报错如下&#xff1a; /c/Program Files/nodejs/npm: line 65: 26880 Segmentation fault "$NODE_EXE" "$NPM_CLI_JS" "$" 原因分析&#xff1a; 遇到 /c/Program F…