2024年3月

系统功能文档是一种描述软件系统功能和操作方式的文档。它让开发团队、测试人员、项目管理者、客户和最终用户对系统行为有清晰、全面的了解。

通过ChatGPT,我们能让编写系统功能文档的效率提升10倍以上。

用ChatGPT生成系统功能文档

我们以线上商城系统为例,介绍如何使用ChatGPT帮我们完成系统功能文档编写。

向ChatGPT发送如下请求:

# 角色:系统功能文档撰写专家

## 背景:
系统功能文档撰写

## 注意事项:
编写高质量的系统功能文档,是确保项目成功的关键步骤。

## 技能:
- 熟练运用各类文档组织格式。
- 善于从客户视角考虑需求。
- 能够捕捉用户需求,将其转化为明确的功能要求。
- 精通系统功能的业务与技术细节。
- 具备逻辑思维,能够编写合理的实现逻辑和功能细节描述。

## 目标:
- 设计一个规范的系统功能文档框架,确保每个功能需求都得到明确描述。
- 在文档中包含功能名、需求描述、概述、功能细节描述。

## 工作流程:
1. 首先,用话术引导用户输入系统需求描述,理解用户的期望和项目目标。
2. 设计一个明确的系统功能文档框架,包含功能名、需求描述、概述、功能细节描述。
   
## 输出格式:
- 功能名:[功能名]
- 需求描述:[需求描述]
- 概述:[概述]
- 功能细节描述:[功能细节描述]

## 初始化
简介自己, 引导用户输入对系统的需求描述,全程使用中文描述。

ChatGPT回答如下:

您好!作为系统功能文档撰写专家,我在这里帮助您把系统需求转化为清晰、详尽的文档,确保项目成功实施。我将运用我的专业技能,从客户的视角出发,精准捕捉需求,并将其转化为明确的功能要求,同时确保文档的高质量和易于理解。

请您描述一下您希望实现的系统需求,包括您希望通过这个系统解决的问题、期望实现的功能等。这样我可以更好地理解您的项目目标,并为您设计一个规范的系统功能文档框架。

向ChatGPT发送如下请求:

我们要开发一个线上商城系统,需求如下:
- C端功能包括:品牌首页、基于LBS进店、加购、订单列表、结算、下单、支付、个人中心。
- B端功能包括:组织管理、渠道管理、客户管理、店铺装修、商品管理、B端管理、库存管理、订单管理、营销管理、配送管理、数据分析。
帮我生成一份详细的系统功能文档。

ChatGPT回答如下:

C端功能需求文档

1. 功能名:品牌首页

- 需求描述:为用户提供品牌介绍、主打商品展示、活动宣传等信息的入口页面。
- 概述:首页需要具有吸引用户并提供品牌信息的设计,包含搜索、分类浏览等功能,优化用户的访问体验。
- 功能细节描述:实现轮播图广告、热门商品推荐、品牌故事介绍等模块。支持用户搜索商品、查看各类商品分类。

2. 功能名:基于LBS的进店

- 需求描述:允许用户根据地理位置信息选择最近的店铺进行浏览和购买。
- 概述:通过LBS技术,推荐用户周围的店铺,提升用户体验和购买转化率。
- 功能细节描述:获取用户授权的位置信息,展示用户当前位置附近的店铺列表,支持店铺搜索和选择。

3. 功能名:加购

- 需求描述:用户可以将心仪的商品添加到购物车中。
- 概述:为用户提供便捷的商品浏览和加购体验,支持多商品加购和购物车管理。
- 功能细节描述:实现加购按钮、购物车商品数量编辑、购物车列表展示、商品选中结算等功能。

4. 功能名:订单列表

- 需求描述:允许用户查看其所有订单的状态和详情。
- 概述:提供一个用户友好的界面,展示用户的订单历史,包括正在进行、已完成、已取消等状态的订单。
- 功能细节描述:实现订单筛选功能,支持按照订单状态、下单时间等条件筛选。每个订单项需显示订单号、下单时间、商品详情、订单状态、支付金额等信息。

5. 功能名:结算

- 需求描述:用户在购物车选择商品后,进行订单确认和支付前的最后一步操作。
- 概述:为用户提供一个清晰的结算页面,展示所购商品详情、价格、预计配送时间等信息,并允许用户选择支付方式。
- 功能细节描述:包括商品列表、数量选择、价格汇总、优惠券使用、收货地址选择、支付方式选择等功能。

6. 功能名:下单

- 需求描述:用户完成商品选择和支付信息填写后,创建订单。
- 概述:确保用户能够轻松地完成订单创建,包括核对订单信息、选择配送选项、确认支付等步骤。
- 功能细节描述:生成订单摘要,包括商品详情、订单总额、支付信息、配送信息。支持不同的支付方式,包括但不限于信用卡、支付宝、微信支付等。

7. 功能名:支付

- 需求描述:为用户提供多种支付方式,完成订单支付。
- 概述:实现安全、便捷的支付流程,确保用户信息安全。
- 功能细节描述:集成第三方支付平台,支持支付状态查询和回调处理,确保支付成功后更新订单状态。

8. 功能名:个人中心

- 需求描述:允许用户管理个人信息、查看订单历史、管理收货地址等。
- 概述:提供一个个性化的用户界面,方便用户访问和管理个人相关信息。
- 功能细节描述:实现个人信息编辑、密码修改、订单历史查看、收货地址管理、支付方式管理等功能。

B端功能需求文档

1. 功能名:组织管理

- 需求描述:允许商城管理员配置和管理组织结构,包括部门、员工角色等。
- 概述:提供一个界面让管理员能够方便地管理公司的组织架构。
- 功能细节描述:实现组织架构的创建、编辑、删除功能;员工的添加、角色分配、权限设置等功能。

2. 功能名:渠道管理

- 需求描述:管理销售渠道和合作伙伴信息。
- 概述:为商城提供渠道拓展和渠道维护的管理功能。
- 功能细节描述:实现渠道信息录入、编辑、渠道业绩追踪、合作伙伴管理等功能。

3. 功能名:客户管理

- 需求描述:允许企业用户管理其客户信息,包括客户资料的录入、编辑和查询。
- 概述:为B端用户提供一个完整的客户信息管理系统,增强客户关系管理能力。
- 功能细节描述:客户信息的录入、编辑、删除功能;支持按照客户名、联系方式等条件搜索客户;客户购买历史和偏好分析等。

4. 功能名:店铺装修

- 需求描述:允许B端用户自定义店铺的布局和样式。
- 概述:提供一套灵活的店铺装修工具,支持拖拽布局、模板选择等功能,无需编程知识。
- 功能细节描述:支持多种布局模板选择,自定义颜色方案、字体选择;轮播图、商品展示区、促销活动板块等可自定义编辑。

5. 功能名:商品管理

- 需求描述:允许B端用户添加、编辑和管理销售的商品。
- 概述:提供一个界面以支持商品信息的完整管理,包括商品详情、价格、库存、分类等。
- 功能细节描述:实现商品信息的添加、编辑、删除功能;支持商品分类管理;实现库存管理功能,包括库存数量的调整和库存预警;支持商品图片上传和编辑。

6. 功能名:库存管理

- 需求描述:为B端用户提供库存量的监控和管理功能。
- 概述:确保用户可以实时了解商品库存情况,及时补充库存,避免缺货。
- 功能细节描述:展示各商品的当前库存量;支持库存的手动调整;实现库存预警设置,当库存低于预设阈值时自动提醒用户。

7. 功能名:订单管理

- 需求描述:允许B端用户查看、处理和管理客户订单。
- 概述:为用户提供订单的详细列表,包括订单状态、支付情况、配送信息等。
- 功能细节描述:实现订单详情查看,包括商品信息、订单金额、客户信息等;支持订单状态管理,如确认订单、取消订单、退货处理等;集成配送管理功能,包括配送方式选择、配送状态跟踪。

8. 功能名:营销管理

- 需求描述:为B端用户提供营销活动的创建、管理和分析工具。
- 概述:支持多种营销活动类型,如折扣、优惠券、积分奖励等,以提升销售额和客户粘性。
- 功能细节描述:实现营销活动的创建和设置,包括活动类型、时间、适用商品等;提供营销效果分析,如参与度、销售提升等指标的跟踪评估。

9. 功能名:配送管理

- 需求描述:允许B端用户管理商品的配送方式和配送状态。
- 概述:提供一个界面以支持对订单的配送方式选择、配送进度跟踪和管理。
- 功能细节描述:支持配送方式的设置和选择,如快递、自提等;实现配送进度的实时跟踪和更新;支持与第三方物流平台的集成,自动化配送流程。

10. 功能名:数据分析

- 需求描述:为B端用户提供销售数据和客户行为分析。
- 概述:通过数据分析帮助用户了解业务表现,指导决策。
- 功能细节描述:实现销售数据的汇总和分析,包括销售额、订单量、热销商品等;客户行为分析,如购买习惯、偏好分析等;支持自定义报表功能,便于用户根据需要生成各种分析报告。

通过ChatGPT,我们能生成详细的系统功能文档。基于这个,我们可以进一步修改和调整,极大地提高了写文档的效率。

用ChatGPT生成用例图

用例图是统一建模语言(UML)的一部分,用于描述系统的功能以及与之交互的外部实体(如人、系统或设备)。

它是一种图形表示法,用于展示系统的行为,通过展示参与者(actors)与系统的用例(use cases)之间的关系来实现。

用例图主要用于找出功能需求,并帮助团队理解系统提供的功能。用例图的主要元素包括:

用例(Use Cases)
:表示系统的一项功能或者一组功能,通常用椭圆形来表示。用例是从用户的角度出发,描述了用户可以通过系统完成的一个任务或者目标。

参与者(Actors)
:表示与系统交互的外部实体,可以是人、系统或设备。参与者通过与用例的交互来完成某些目标。

关系(Relationships)
:用来描述参与者与用例之间的交互关系,以及用例之间的关系。主要有以下几种类型:

  • 关联(Association)
    :直接连接参与者和用例,表示参与者参与用例的交互。
  • 包含(Include)
    :表示一个用例的执行包含另一个用例的执行。
  • 扩展(Extend)
    :表示一个用例的执行可能扩展或增加另一个用例的行为。
  • 泛化(Generalization)
    :表示参与者或用例之间的继承关系。

用例图主要用于需求分析阶段,帮助项目团队和客户之间建立共同的理解,以确保软件完全满足用户需求。它为开发过程提供了一个清晰的功能视图,同时也是沟通、讨论和计划的基础。

ChatGPT与PlantUML结合后,可以生成各种UML图表。接下来,我们使用ChatGPT生PlantUML语言描述的用例图。

向ChatGPT发送如下请求:

上文中已确定线上商城系统功能,请使用PlantUML语言帮我绘制用例图。

ChatGPT回答如下:

@startuml
left to right direction
skinparam packageStyle rectangle

actor C端用户 as cuser
actor B端用户 as buser

rectangle C端功能 {
  (品牌首页) as (HomePage) 
  (基于LBS进店) as (LBSStore)
  (加购) as (AddToCart)
  (订单列表) as (OrderList)
  (结算) as (Checkout)
  (下单) as (PlaceOrder)
  (支付) as (Payment)
  (个人中心) as (UserProfile)
}

rectangle B端功能 {
  (组织管理) as (OrgManagement)
  (渠道管理) as (ChannelManagement)
  (客户管理) as (CustomerManagement)
  (店铺装修) as (StoreDecoration)
  (商品管理) as (ProductManagement)
  (B端管理) as (BManagement)
  (库存管理) as (InventoryManagement)
  (订单管理) as (OrderManagementB)
  (营销管理) as (MarketingManagement)
  (配送管理) as (DistributionManagement)
  (数据分析) as (DataAnalysis)
}

cuser --> HomePage : 浏览
cuser --> LBSStore : 定位与推荐
cuser --> AddToCart : 添加商品
cuser --> OrderList : 查看订单
cuser --> Checkout : 进行结算
cuser --> PlaceOrder : 下单
cuser --> Payment : 支付
cuser --> UserProfile : 管理个人信息

buser --> OrgManagement : 组织架构管理
buser --> ChannelManagement : 渠道策略管理
buser --> CustomerManagement : 客户信息管理
buser --> StoreDecoration : 装修店铺
buser --> ProductManagement : 管理商品
buser --> BManagement : 管理B端用户
buser --> InventoryManagement : 监控库存
buser --> OrderManagementB : 处理订单
buser --> MarketingManagement : 执行营销活动
buser --> DistributionManagement : 管理配送
buser --> DataAnalysis : 进行数据分析

@enduml

用drawio绘制用例图

接下来,我们要使用drawio神器,绘制用例图。登录
https://app.diagrams.net/
,点击➕,选择高级→PlantUML。

将上文中的PlantUML代码,贴入文本框,点击插入。

线上商城系统的用例图就自动绘制好啦,是不是效率提升非常多~

转载请注明住处:
https://www.cnblogs.com/zhiyong-ITNote

概述

ShareGPT格式的数据集中,一般是如下格式:

[
  {
    "conversations": [
      {
        "from": "human",
        "value": "I saw a dress that I liked. It was originally priced at $200 but it's on sale for 20% off. Can you tell me how much it will cost after the discount?"
      },
      {
        "from": "function_call",
        "value": "{\"name\": \"calculate_discount\", \"arguments\": {\"original_price\": 200, \"discount_percentage\": 20}}"
      },
      {
        "from": "observation",
        "value": "{\"discounted_price\": 160}"
      },
      {
        "from": "gpt",
        "value": "The dress will cost you $160 after the 20% discount."
      }
    ],
    "system": "系统提示词(选填)",
    "tools": "[{\"name\": \"calculate_discount\", \"description\": \"Calculate the discounted price\", \"parameters\": {\"type\": \"object\", \"properties\": {\"original_price\": {\"type\": \"number\", \"description\": \"The original price of the item\"}, \"discount_percentage\": {\"type\": \"number\", \"description\": \"The percentage of discount\"}}, \"required\": [\"original_price\", \"discount_percentage\"]}}]"
  }
]

function_call
表示函数调用,什么是函数调用?其作用是什么?
由于大模型的数据一般都是截止于某个时间点之前的数据,不具备实时性。比如,我要问今天的天气,正常来说,由于模型参数的局限性,是不会知道的。但基于函数调用的功能,就解决了这个问题。
所谓的
function_call
,在某个程度来说,可以理解为API调用,这个API就是一个function,提供了某种功能。
observation
表示观测结果,即
function_call
的执行结果。
tools
表示工具,即对
function_call
的总结描述。

observation并不是新词汇,对于HMM模型如果有了解的话,在其模型算法的表述中,也有着observation的相关引用。

ShareGPT格式简单明了而且结构强大,不仅仅轻易的支持单轮对话、多轮对话;还引入了强大的函数调用,支持功能扩展。

扩展

function_call
的设计引申出来,可以对应到业务开发中的规则引擎、脚本引擎等设计。譬如,支持在json参数的格式中,传入JS脚本参数,做一些强大的运算等。在原有的参数格式中,引入强大的函数调用支持。
如何在聊天模型中调用函数(Function Calling)--金融大模型知识库实战(十六)
大模型开发 - 一文搞懂 Function Calling(函数调用)

转载请注明住处:
https://www.cnblogs.com/zhiyong-ITNote

首发于个人公众号
image

前言

本文的主题是
Visual Studio
调试
NuGet
包,以及符号包的概念,如何去发布一个
NuGet
包,让我们的
NuGet
包支持
SouceLink
,这些都是我们开发中比较容易忽视的内容,但是熟悉了以后可以让我们在调试中得心应手,也是开源项目开发的基础篇。

demo 源代码在文末

pdb 符号文件

程序数据库 (
.pdb
) 文件(也称为符号文件)将项目源代码中的标识符和语句映射到已编译应用中的相应标识符和说明。 这些映射文件将调试器链接到源代码,以进行调试。

在 Visual Studio 调试器(C#、C++、Visual Basic、F#)中指定符号 (.pdb) 和源文件

符号文件的工作方式

.pdb
文件保存调试和项目状态信息,使用这些信息可以对应用的调试配置进行增量链接。 在调试时,
Visual Studio
调试器使用
.pdb
文件来确定两项关键信息:

  • 要在
    Visual Studio IDE
    中显示的源文件名和行号。
  • 在应用中停止的断点位置。

调试器只会加载与在生成应用时创建的
.pdb
文件完全匹配的
.pdb
文件(即原始
.pdb
文件或副本)。

我们随便找一个自己代码的类库 Build 可以看一下
image

简单的讲:我们平时在
Visual Studio
中调试代码 编译后的
dll
文件在和
VS
内代码文件,断点等各种调试操作都是跟
.pdb
文件内记录的信息做的映射。

符号包 (.snupkg)

创建符号包

符号包提供了一些关键信息,例如已编译的代码与源代码之间的关联、局部变量的名称、堆栈跟踪,代码源文件映射等。 你可以使用符号包 (
.snupkg
) 来分发这些符号(
.pdb
),并改善
NuGet
包的调试体验。

创建符号包

有两种方式可以创建符号包

  • .csproj
    文件添加属性
<PropertyGroup>
    <IncludeSymbols>true</IncludeSymbols>
    <SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
  • 打包时指定参数
dotnet pack MyPackage.csproj -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg

那我们创建一个类库先用第二种命令行打包测试一下看看效果

image

可以看到我们的符号包已经成功创建了。

接下来我们看一下符号包里面有什么东西
这里面用
NuGetPackageExplorer
本地工具,直接打开本地的包
image

可以看到我们的
.pdb
文件已经被打包到符号包中

源链接将源代码管理元数据添加到程序集和
NuGet
包,这么做的好处是进一步的获得最佳调试体验,把源链接元数据跟符号包中的
pdb
文件绑定

github sourcelink


.NET 8
开始,
.NET SDK
默认包含对以下来源控制提供商的源链接(
Source Link
)支持:

如果您的项目使用
.NET SDK 8+
并托管在上述提供商中,则无需引用任何
Source Link
包或设置任何构建属性,
Source Link
已默认启用。

否则,您可以通过设置几个属性并添加适用于提供商的
Source Link
包的
PackageReference
来启用项目中的
Source Link
体验,这样可以实现在指定的来源控制环境中进行无缝调试和源代码导航。
配置如下

<Project>
 <PropertyGroup>
    <!-- Optional: Publish the repository URL in the built .nupkg (in the NuSpec <Repository> element) -->
    <PublishRepositoryUrl>true</PublishRepositoryUrl>

    <!-- Optional: Embed source files that are not tracked by the source control manager in the PDB -->
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
  </PropertyGroup>
  <ItemGroup>
    <!-- Add PackageReference specific for your source control provider (see below) -->
  </ItemGroup>
</Project>

如果你在
dotNet 8+
的环境中引用任何的源代码管理包比如
github.com
and
GitHub Enterprise

<ItemGroup>
  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All"/>
</ItemGroup>

会禁用
.NET SDK
中包含的
Source Link
功能。

本文的所有案例默认都是用
dotNet8
开发的 那按照说明如果代码在
github
那默认可以不用安装任何
SourceLink

package

接下来我们继续测试一下在类库中添加对应的属性

先提交一下代码,再打
pack
image

从这可以看出我们的
pdb
符号文件已经包含了
git
的源代码信息。

推送 Nuget 包

发布 Nuget 包
我们这里使用
dotnet cli
推送
用命令行推送
.nupkg
包同名的
.snupkg
符号包默认也会被推送到
nuget.org

 dotnet nuget push dotNetParadise-SourceLink.1.0.1.nupkg -s https://api.nuget.org/v3/index.json --api-key %nugetApiKey%

image

现在
NuGet
包已经推送上去了第一次推送的包
NuGet
平台需要对其进行索引病毒扫描等 大概需要几分钟

image

可以看到我们的符号包以及源代码地址都已经在
NuGet
平台显示了。

VS 调试部分

前面做的部分实际上都是为了我们在给用户用的时候方便调试,那我们来调试一下看看这个过程。
创建新项目->
NuGet
安装刚才上传的包

dotnet add package dotNetParadise-SourceLink --version 1.0.1

调试器查找符号文件的位置

  • 项目文件夹。

  • 在 DLL 或可执行 (.exe) 文件中指定的位置。


    • 默认情况下,如果你在计算机上已生成 DLL 或 .exe 文件,则链接器会将关联的 .pdb 文件的完整路径和文件名放入 DLL 或 .exe 文件中 。 调试器会检查该位置是否存在符号文件。
  • 与 DLL 或 .exe 文件相同的文件夹。

  • 在调试器选项中为符号文件指定的任何位置。


    • 任何本地符号缓存文件夹。

    • 指定的网络、Internet 或本地符号服务器和位置,例如 Microsoft 符号服务器(如果选择)。 Visual Studio 可从实现 symsrv 协议的符号服务器下载调试符号文件。 Visual Studio Team Foundation Server 和 Windows 调试工具是可使用符号服务器的两个工具。

  • 可能会用到的符号服务器包括:


    • 公共 Microsoft 符号服务器:要调试在调用系统 DLL 或第三方库时出 现的故障,通常需要系统 .pdb 文件。 系统 .pdb 文件包含 Windows DL、.exe 文件和设备驱动程序的符号 。 你可以从公共 Microsoft 符号服务器获取 Windows 操作系统、MDAC、IIS、ISA 和 .NET 的符号。

    • 内部网络或本地计算机上的符号服务器:你的团队或公司可为你自己的产品创建符号服务器,并作为外部源符号的缓存。 你自己的计算机上可能具有符号服务器。

    • 第三方符号服务器:Windows 应用程序和库的第三方提供程序可提供对 Internet 上的符号服务器的访问。

了解了这部分信息之后,我们的符号包是在 Nuget.org 中所以,需要在 Vs 中开启如下配置
image

VS 工具->选项->调试->符号 开启上面符号服务器的选中,可以设置一个本地缓存的文件夹,另外下面选择仅加载指定模块(如果开启上面除了排除的全部加载大项目调试起来有点难受)

VS 工具->选项->调试-常规
image

第一步要禁用
启用仅我的代码

第二部 启用源服务器的支持

到这儿基本上配置已经全部完成了

实战测试一下
我们的类库实际上是封装了一个
MinimalApis
的自动注册功能,感兴趣的朋友可以去读一下我之前的文章

public class TodoApi : IEndPoint
{
    public void MapEndPoints(IEndpointRouteBuilder app)
    {
        var group = app.MapGroupWithTags("Todo");
        group.MapGet("sayhello", (string name) => $"hello {name}");
    }
}

创建一个
api

program
调用类库方法注册一下

app.RegisterEndPoints();

image

可以看到很对
NuGet
类库 源码的调试就舒服多了,可以加断点修改代码,加类库调试。

最后

简要摘要:

本文介绍了在
Visual Studio
中调试
NuGet
包的相关概念,包括
PDB
符号文件、符号包、
Source Link
功能以及发布支持
Source Link

NuGet
包。通过配置符号包和
Source Link
,开发者可以更轻松地调试外部依赖项的源代码,提高调试效率。

总结:

  • PDB
    符号文件和符号包在调试中起着关键作用,帮助将源代码映射到编译后的应用程序,提供更详细的调试信息。
  • Source Link
    通过在程序集和
    NuGet
    包中添加源代码管理元数据,实现了方便调试外部依赖项的功能。
  • 配置符号服务器路径和
    Source Link
    选项可以使
    Visual Studio
    更好地支持调试
    NuGet
    包的源代码。

本文
Demo 源代码

希望本文能对你有帮助!

本文分享自华为云社区《
Python数据可视化大揭秘:Matplotlib和Seaborn高效应用指南
》,作者: 柠檬味拥抱。

安装Matplotlib和Seaborn

首先,确保你已经安装了Matplotlib和Seaborn库。如果没有安装,可以使用以下命令进行安装:

pip install matplotlib seaborn

Matplotlib基础

Matplotlib是一个灵活的绘图库,支持多种图表类型。以下是一个简单的折线图的代码示例:

import matplotlib.pyplot asplt

# 创建数据
x
= [1, 2, 3, 4, 5]
y
= [2, 4, 6, 8, 10]

# 绘制折线图
plt.plot(x, y, label
='Line Chart')

# 添加标题和标签
plt.title(
'Simple Line Chart')
plt.xlabel(
'X-axis')
plt.ylabel(
'Y-axis')

# 显示图例
plt.legend()

# 显示图表
plt.show()

上述代码首先导入Matplotlib库,然后创建了一组简单的数据并使用
plt.plot
绘制了折线图。接着,添加了标题和坐标轴标签,并通过
plt.legend
显示图例。最后,通过
plt.show
显示图表。

Seaborn的美化

Seaborn是基于Matplotlib的统计数据可视化库,它提供了更简单的接口和更美观的默认样式。以下是一个使用Seaborn创建直方图的代码示例:

import seaborn assns
import matplotlib.pyplot
asplt

# 创建数据
data
= [1, 2, 2, 3, 3, 3, 4, 4, 5]

# 使用Seaborn创建直方图
sns.histplot(data, bins
=5, kde=True, color='skyblue')

# 添加标题和标签
plt.title(
'Histogram with Seaborn')
plt.xlabel(
'Values')
plt.ylabel(
'Frequency')

# 显示图表
plt.show()

在这个例子中,使用
seaborn.histplot
创建了直方图,并通过参数设置调整了一些样式,如
bins
指定柱子的数量,
kde
添加核密度估计。此外,Matplotlib的基础功能仍然可以与Seaborn一起使用。

定制化和进阶功能

Matplotlib的子图和定制化

Matplotlib允许你在同一图表上绘制多个子图,通过
plt.subplot
实现。以下是一个使用子图的例子:

import matplotlib.pyplot asplt
import numpy
asnp

# 创建数据
x
= np.linspace(0, 2 * np.pi, 100)
y1
=np.sin(x)
y2
=np.cos(x)

# 创建子图
plt.subplot(
2, 1, 1) # 两行一列,当前选中第一个子图
plt.plot(x, y1, label
='Sin')
plt.title(
'Sin Function')
plt.legend()

plt.subplot(
2, 1, 2) # 两行一列,当前选中第二个子图
plt.plot(x, y2, label
='Cos')
plt.title(
'Cos Function')
plt.legend()

plt.tight_layout() # 调整子图布局,防止重叠
plt.show()

在这个例子中,使用
plt.subplot
创建了两个子图,分别绘制了正弦和余弦函数。

Matplotlib还提供了大量的定制化选项,包括颜色、线型、标记等。例如:

plt.plot(x, y, color='red', linestyle='--', marker='o', label='Data Points')

这将绘制一条红色虚线,带有圆形标记的线条。

Seaborn的高级绘图功能

Seaborn提供了一些高级绘图功能,如Pair Plots、Heatmaps等,可以更全面地了解数据之间的关系。

import seaborn assns
import matplotlib.pyplot
asplt

# 使用Seaborn创建Pair Plot
iris
= sns.load_dataset('iris')
sns.pairplot(iris, hue
='species', markers=['o', 's', 'D'])

plt.show()

这个例子中,使用Seaborn的
pairplot
创建了一个Pair Plot,展示了Iris数据集中不同物种之间的关系。

保存图表

无论是Matplotlib还是Seaborn,都支持将图表保存为图像文件。例如,使用
plt.savefig
保存Matplotlib图表:

plt.savefig('my_plot.png')

性能优化

对于大型数据集,性能可能成为一个问题。Matplotlib和Seaborn都提供了一些优化选项,如使用
plt.plot

marker
参数控制标记的显示,以提高渲染性能。

plt.plot(x, y, marker='.', markersize=1)

数据可视化的交互性

在实际应用中,交互性是数据可视化中的重要部分,能够增强用户体验并提供更深层次的数据探索。使用Matplotlib和Seaborn,你可以通过其他库或工具来实现交互性,如Plotly、Bokeh等。

使用Plotly创建交互性图表

Plotly是一个强大的交互性绘图库,可以与Matplotlib和Seaborn无缝集成。以下是一个简单的例子:

import plotly.express aspx

# 创建数据
df
=px.data.iris()

# 使用Plotly创建交互性散点图
fig
= px.scatter(df, x='sepal_width', y='sepal_length', color='species', size='petal_length', hover_data=['petal_width'])

# 显示图表
fig.show()

这个例子中,使用Plotly的
scatter
函数创建了一个交互性的散点图,通过
hover_data
参数添加了悬停信息。

Bokeh的交互性绘图

Bokeh是另一个强大的交互性绘图库,支持大规模数据集的交互式可视化。以下是一个简单的Bokeh例子:

frombokeh.plotting import figure, showfrombokeh.models import ColumnDataSource

# 创建数据
x
= [1, 2, 3, 4, 5]
y
= [2, 4, 6, 8, 10]

# 创建Bokeh图表
source
= ColumnDataSource(data=dict(x=x, y=y))
p
= figure(title='Interactive Line Chart', x_axis_label='X-axis', y_axis_label='Y-axis')

# 添加线条
p.line(
'x', 'y', source=source, line_width=2)

# 显示图表
show(p)

这个例子中,使用Bokeh的
figure

line
函数创建了一个交互性的折线图。

结合使用Matplotlib/Seaborn和交互性库

你还可以结合使用Matplotlib或Seaborn与交互性库,以在静态图表中添加交互性元素,提供更丰富的用户体验。

import matplotlib.pyplot aspltfrommplcursors import cursor

# 创建数据
x
= [1, 2, 3, 4, 5]
y
= [2, 4, 6, 8, 10]

# 绘制散点图
plt.scatter(x, y, label
='Data Points')

# 添加标题和标签
plt.title(
'Interactive Scatter Plot')
plt.xlabel(
'X-axis')
plt.ylabel(
'Y-axis')

# 使用mplcursors添加悬停信息
cursor(hover
=True)

# 显示图例
plt.legend()

# 显示图表
plt.show()

在这个例子中,使用了
mplcursors
库来添加悬停信息,通过悬停鼠标可以查看数据点的具体数值。

高级主题:时间序列可视化和面向对象的绘图

时间序列可视化

在许多数据分析任务中,我们需要处理时间序列数据。Matplotlib和Seaborn提供了强大的工具来可视化时间序列。

import pandas aspd
import matplotlib.pyplot
asplt

# 创建时间序列数据
date_rng
= pd.date_range(start='2024-01-01', end='2024-01-10', freq='D')
data
= {'value': [1, 3, 7, 2, 5, 8, 4, 6, 9, 10]}
df
= pd.DataFrame(data, index=date_rng)

# 绘制时间序列折线图
plt.plot(df.index, df[
'value'], marker='o', linestyle='-', color='b')

# 添加标题和标签
plt.title(
'Time Series Plot')
plt.xlabel(
'Date')
plt.ylabel(
'Value')

# 日期标签自动格式化
plt.gcf().autofmt_xdate()

# 显示图表
plt.show()

在这个例子中,我们使用了Pandas创建了一个简单的时间序列数据,并使用Matplotlib绘制了折线图。通过
autofmt_xdate
可以自动调整日期标签的格式,确保它们在图上显示得更加美观。

面向对象的绘图

Matplotlib支持两种不同的绘图接口:MATLAB风格的
plt
接口和面向对象的接口。面向对象的接口更为灵活,能够实现更高级的定制化。

import numpy asnp
import matplotlib.pyplot
asplt

# 创建数据
x
= np.linspace(0, 2 * np.pi, 100)
y1
=np.sin(x)
y2
=np.cos(x)

# 创建Figure和Axes对象
fig, ax
=plt.subplots()

# 在Axes对象上绘制折线图
line1,
= ax.plot(x, y1, label='Sin')
line2,
= ax.plot(x, y2, label='Cos')

# 添加标题和标签
ax.set_title(
'Sine and Cosine Functions')
ax.set_xlabel(
'X-axis')
ax.set_ylabel(
'Y-axis')

# 显示图例
ax.legend()

# 显示图表
plt.show()

在这个例子中,我们使用了面向对象的绘图方式,通过
subplots
创建了Figure和Axes对象,然后在Axes对象上绘制了两条折线。这种方式可以更灵活地控制图表的各个元素。

性能和效率优化

对于大规模的数据集或复杂的图表,性能和效率成为关键问题。以下是一些优化技巧:

  • 使用NumPy和Pandas优化数据处理: 尽可能使用向量化操作,以提高数据处理效率。

  • 使用
    plt.tight_layout()
    : 该函数能够自动调整子图的布局,避免重叠。

  • 避免绘制过多数据点: 对于大型数据集,可以通过降采样等方法减少数据点的数量。

  • 异步渲染: 在一些情况下,使用异步渲染可以提高交互性图表的响应速度。

交互性和动态可视化

在一些场景中,静态图表无法完全满足需求,需要使用交互性和动态可视化来更好地与数据进行互动。

使用Bokeh创建动态可视化

Bokeh是一个强大的交互式可视化库,支持创建动态可视化。以下是一个简单的Bokeh动态图表的例子:

frombokeh.plotting import figure, curdocfrombokeh.models import ColumnDataSourcefrombokeh.driving import count

# 创建数据源
source
= ColumnDataSource(data={'x': [], 'y': []})

# 创建Bokeh图表
p
= figure(title='Dynamic Plot', width=800, height=400)
p.circle(x
='x', y='y', size=10, color='navy', alpha=0.5, source=source)

# 定义动态更新函数
@count()
def update(i):
new_data
= {'x': [i], 'y': [i % 10]} # 更新数据
source.stream(new_data, rollover
=20) # 更新数据源

# 添加定时器,每100毫秒触发一次更新
curdoc().add_periodic_callback(update,
100)

# 显示图表
curdoc().title
= 'Dynamic Plot'curdoc().add_root(p)

在这个例子中,使用Bokeh创建了一个动态散点图,通过
ColumnDataSource
更新数据。使用
add_periodic_callback
函数定时触发数据更新,实现了动态可视化。

使用Plotly创建交互性动画

Plotly也提供了创建交互性动画的功能,以下是一个简单的例子:

import plotly.express aspx
import pandas
aspd

# 创建数据
df
= pd.DataFrame({'x': range(10), 'y': [i % 10 for i in range(10)]})

# 创建动画散点图
fig
= px.scatter(df, x='x', y='y', animation_frame=df.index, size_max=50, range_x=[0, 10], range_y=[0, 10])

# 显示图表
fig.show()

在这个例子中,使用Plotly的
scatter
函数创建了一个动画散点图,通过
animation_frame
参数指定了动画的帧。

输出和分享可视化

一旦创建了令人满意的可视化,你可能希望将其分享给他人。Matplotlib、Seaborn、Bokeh和Plotly都提供了保存图表的功能,可以将图表保存为图片或HTML文件。

# 保存Matplotlib图表
plt.savefig(
'my_plot.png')

# 保存Bokeh图表
frombokeh.io import output_file, save
output_file(
'my_bokeh_plot.html')
save(p)

# 保存Plotly图表
fig.write_html(
'my_plotly_plot.html')

这些方法使得你可以方便地将可视化结果分享给他人,或者嵌入到网页中。

实际应用示例:舆情分析的交互性可视化

让我们通过一个实际的应用场景,结合Matplotlib、Seaborn、Bokeh和Plotly,来展示如何创建一个交互性的舆情分析可视化。

假设我们有一份包含日期、情感分数和新闻数量的数据集,我们希望通过可视化展示每天的舆情走势,并提供交互性操作。

import pandas aspd
import matplotlib.pyplot
asplt
import seaborn
assnsfrombokeh.plotting import figure, show
import plotly.express
aspx

# 创建示例数据集
data
= {'Date': pd.date_range(start='2024-01-01', end='2024-01-10'),'Sentiment': [0.2, -0.1, 0.5, -0.3, 0.6, -0.2, 0.1, 0.4, -0.5, 0.3],'News_Count': [10, 8, 12, 6, 15, 9, 11, 14, 7, 13]}

df
=pd.DataFrame(data)

# Matplotlib折线图
plt.figure(figsize
=(10, 5))
plt.plot(df[
'Date'], df['Sentiment'], label='Sentiment Score', marker='o')
plt.plot(df[
'Date'], df['News_Count'], label='News Count', marker='o')
plt.title(
'Sentiment Analysis Over Time')
plt.xlabel(
'Date')
plt.ylabel(
'Score/Count')
plt.legend()
plt.show()

# Seaborn折线图
plt.figure(figsize
=(10, 5))
sns.lineplot(x
='Date', y='Sentiment', data=df, label='Sentiment Score', marker='o')
sns.lineplot(x
='Date', y='News_Count', data=df, label='News Count', marker='o')
plt.title(
'Sentiment Analysis Over Time (Seaborn)')
plt.xlabel(
'Date')
plt.ylabel(
'Score/Count')
plt.legend()
plt.show()

# Bokeh交互性折线图
p
= figure(title='Sentiment Analysis Over Time', x_axis_label='Date', y_axis_label='Score/Count', width=800, height=400)
p.line(df[
'Date'], df['Sentiment'], legend_label='Sentiment Score', line_width=2, line_color='blue')
p.circle(df[
'Date'], df['Sentiment'], size=8, color='blue')
p.line(df[
'Date'], df['News_Count'], legend_label='News Count', line_width=2, line_color='green')
p.square(df[
'Date'], df['News_Count'], size=8, color='green')
p.legend.location
= 'top_left'show(p)

# Plotly交互性折线图
fig
= px.line(df, x='Date', y=['Sentiment', 'News_Count'], labels={'value': 'Score/Count'},
title
='Sentiment Analysis Over Time (Plotly)', markers=True)
fig.show()

在这个示例中,我们使用了Matplotlib、Seaborn、Bokeh和Plotly创建了相同的舆情分析可视化,其中Bokeh和Plotly提供了交互性操作,可以缩放、平移、悬停查看数值等。

这种综合运用不同库的方式,可以根据具体需求选择最适合的工具,为数据科学和分析提供更全面、多样化的可视化支持。

总结

本文详细介绍了如何使用Python中的Matplotlib、Seaborn、Bokeh和Plotly等库进行数据可视化,并深入探讨了一系列主题,涵盖了从基础的静态图表到高级的交互性和动态可视化的方方面面。以下是本文的主要总结:

  1. Matplotlib和Seaborn基础: 学习了使用Matplotlib和Seaborn创建各种静态图表的基本方法,包括折线图、直方图和散点图。

  2. 高级主题: 涵盖了时间序列可视化、面向对象的绘图和性能优化等高级主题,使读者能够更好地应对不同场景下的数据可视化任务。

  3. 交互性和动态可视化: 介绍了Bokeh和Plotly这两个强大的交互性可视化库,展示了如何创建动态可视化和交互性图表,以更灵活地与数据进行互动。

  4. 实际应用示例: 通过一个舆情分析的实际应用场景,演示了如何结合多个库创建一个综合、交互性的可视化,为读者提供了在实际工作中应用所学知识的示范。

  5. 输出和分享可视化: 介绍了如何保存可视化结果为图片或HTML文件,以便分享或嵌入到网页中,帮助读者将成果展示给他人。

通过这篇综合性的指南,读者可以全面了解数据可视化的基础知识,并学会如何应用不同的库和技术,使得数据科学和分析工作更具深度和广度。希望本文能够激发读者对数据可视化的兴趣,并为他们在实际项目中提供有力的工具和方法。

点击关注,第一时间了解华为云新鲜技术~

上一篇文章分享了一款
简洁且强大的开源堡垒机OneTerm
,功能完善,代码简单,GO语言开发,用来学习很合适,拿来自用也没问题。堡垒机该有的核心功能基本都有了,方便与自有系统集成,我使用了两周,功能上没有什么大问题,但仍然发现了一些有待提升的地方,这篇文章从我个人使用的角度来写下我自己觉得有哪些是可以优化的,仅一家之言,官方觉得有道理可以采纳,也算回馈社区,觉得说错了也不必较真哈,毕竟我个人认知有限

Web终端

我们平常使用堡垒机最多的功能应该就是登陆系统控制台,OneTerm支持Linux终端使用,也能通过配置在客户端上使用,不过这些都比较麻烦,我们平常用的最多的还是Web控制台,那Web控制台的使用体验就十分重要了,OneTerm的Web终端连接在工作台页面

这个页面上点内容比较多,有我的资产、最近回话和个人信息,我个人觉得Web连接是个十分重要点功能,连接资产点页面应该简洁,只包含我的资产这块的内容即可,左侧目录树,右侧主机,点击连接直接打开web终端,还有就是突出最重要的「连接」按钮,而弱化是否可连接的状态显示,这里总感觉那个绿色的「连接」状态是可以点击的

堡垒机可以支持多个不同的账号登陆连接,这个比我之前设计的好多了,我之前写的堡垒机没考虑过多账号登陆的问题,支持多账号登陆显然更好,不过当一个主机只配置了一个登陆账号时就没必要弹出账号选择框了,直接连接即可,只在主机配置多个登陆账号时弹框让用户选择登陆账号,简化使用逻辑

OneTerm的Web终端是新开一个浏览器标签显示的,最大化了内容区域,不过似乎有些小bug,例如不会随着浏览器窗口的改变自动调整终端的展示大小,就是自动resize操作,我之前自己写WebSSH的时候处理过
终端窗口自适应Resize
的问题,应该是类似的,终端窗口除了这个bug外,还有一些可以优化的地方,例如新的Tab页面Title最好改成主机的IP或名称,这样让我明确的知道打开的这个窗口是哪个主机的,不然一次连接的主机多了很容易出错

其实更好的处理方式我觉得是一个页面多标签的形式,而非开多个页面,多页面间频繁切换还是非常麻烦的。这个页面可以参考Xshell或是MobaXterm之类成熟的SSH客户端,左侧目录树,显示所有目录及主机信息,右侧多标签显示操作窗口,使用体验比较好,并且也符合大众的操作习惯

数据互通

OneTerm支持与自家的CMDB联动,可以同步CMDB的数据到堡垒机,这个非常棒,打破不同系统间的数据壁垒,做到数据统一,基础数据只有一份保证CMDB数据权威。这跟我之前的理念一致,CMDB要想数据准确,靠制度和规范是不行的,必须要通过技术的手段来保证。上层应用强依赖是个很好的方式,CMDB作为唯一数据来源,如果数据不准确,直接影响到上层应用的正常服务,所以要想上层应用正常,会倒逼CMDB数据准确

不过Oneterm的问题在于,目前只能同步了主机资源,而没有目录,一个项目多个不同环境和版本,创建十几个甚至几十个目录树都很正常,如果不能按目录树来同步的话,那要想堡垒机的目录树跟CMDB的目录树保持一致,就要创建十几个甚至几十个目录和同步规则,确实麻烦,如果能选择目录树同步,那将大大降低使用成本,同时也能保证CMDB目录树与OneTerm完全一致,个人觉得更加符合使用习惯

页面统一

用过一些国外的产品,像CDN领域最为知名的两家厂商CloudFlare和Akamai,发现他们的产品几乎每个页面都不一样,而我们国内的产品做到了页面及操作的统一,这个并不是说哪个好哪个不好,或许是文化差异导致习惯不同而已,不过我个人更喜欢国内这种统一的,页面统一,操作统一,虽然可能看上去没什么花样和新意,但却降低来使用成本,看到一个页面大概就知道什么信息在哪里,该如何操作,而不用学习每个页面的使用

OneTerm在某些地方没有统一,例如添加资产时的授权账号是从账号列表里选择的,而创建网关时的账号是单独的,要输入账号密码信息,是否也可以从账号列表里选择,这样维护上比较统一,账号只保存在一个地方

例如资产管理下网关列表、账号列表、安全设置右上角都有个「创建」按钮,但资产列表右上角没有,要点击目录树节点才显示,这里可以理解点了目录树节点显示「创建」按钮之后默认填充节点至表单,不过似乎也不影响在未选中任何节点时「创建」资产

当然这些都不是啥大问题,仅仅是不够统一而已

后记

  1. 这些仅仅是与我个人使用习惯不完全相符而已,也并不一定都是问题,或许我觉得是bug,只是使用姿势不对的feature而已

  2. 我们总是很容易发现别人的问题,却很难发现自己的问题。发现问题相对容易,但真的要改正问题就很难,不一定难在改正的方法,更多的时候可能是我们直面问题的勇气

  3. 没有设计完美的产品,所有的好产品都是在使用中不断打磨出来的,一款产品如果真的重视用户使用体验,愿意持续不断的去优化,那距离它成为真的好用的产品差的只是时间而已