【数学建模美赛M奖速成系列】数据可视化方法(一)

数据可视化方法

  • 写在前面
  • 山脊图
    • 优点
    • 缺点
    • 实现
      • matlab
      • python
  • 气泡矩阵图
    • 实现
      • matlab
      • python
  • 后续

写在前面

最近开始更新一个新的系列科研绘图,在同一个竞赛下,大家都近乎相同的解题思路下。之所以能出现一等二等三等奖的区别很大部分都在于结果的可视化,为了能更好地帮助大家进行可视化,近期将专门推出一个可视化板块,推出各种好看实用的可视化图形。

山脊图

也称为Joy Plot。它是一种数据可视化的方法,用于展示一个或多个组的数据分布。在山脊图中,每个组的数据分布通过平滑的密度曲线表示,这些曲线沿垂直轴堆叠排列,从而产生类似山脊的视觉效果。这种图表尤其适用于比较不同组的数据分布情况。

山脊图的制作基于核密度估计(Kernel Density Estimation, KDE),这是一种估计概率密度函数的非参数方式。与传统的条形图或直方图相比,山脊图提供了一种更平滑、更直观的方式来展示数据的分布情况。它特别适合于展示大量组的数据分布,可以帮助观察者理解不同组之间的差异和相似之处。

山脊图(Ridge Plot)是一种数据可视化工具,主要用于比较多个分布。

优点

  1. 比较能力:非常适合比较多个分布的形状和大小。它能清晰地展示不同组之间的变化和趋势。
  2. 空间效率:通过在单个图中堆叠,山脊图可以有效地利用空间,显示多组数据,避免了创建多个单独的密度图。
  3. 美观性:山脊图在视觉上吸引人,可以用不同的颜色和样式来区分不同的组,使得数据更加生动和直观。
  4. 趋势识别:可以轻松识别多个群体数据中的共同模式和异常值。
  5. 数据量:适用于展示大量数据集,而不会显得拥挤或不清晰。

缺点

  1. 过度拥挤:如果组的数量过多,山脊图可能会显得拥挤,使得个别分布难以辨认。
  2. 精确度:由于重叠,难以精确读取特定点的值,尤其是在分布之间的重叠区域。
  3. 数值比较:虽然能够展示分布趋势,但不适合精确比较不同组之间的数值。
  4. 边缘效应:在堆叠的密度图中,可能会产生误导,例如,边缘的分布可能看起来比实际更少。

实现

本次更新主要以matlab为主,python实现代码也放于文末展示

matlab

首先是,绘制最初始的,最简单的山脊图,如下所示
在这里插入图片描述

% 清空环境变量和窗口
clear; close all;

% 生成模拟数据
data = [];
groups = 6;
for i = 1:groups
data = [data; normrnd(i, 0.5, [200, 1])];
end

% 为每组数据创建一个标签
group = repelem(1:groups, 200)';

% 创建一个图形窗口
figure;

% 对每组数据进行绘制
for i = 1:groups
% 选择当前组的数据
subset = data(group == i);
% 计算核密度估计
[f, xi] = ksdensity(subset);
% 绘制密度曲线,并上移相应的高度以创建堆叠效果
plot(xi, f + i, 'LineWidth', 2);
hold on;
end

% 添加图例和坐标轴标签
legend('Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5', 'Group 6');
xlabel('Value');
ylabel('Density');
title('Ridge Plot Example');

% 显示图形
hold off;

为了进一步美化图形,添加一些元素和调整一些参数来增强其视觉效果。

在这里插入图片描述

% 清空环境变量和窗口
clear; close all;

% 生成模拟数据
data = [];
groups = 6;
colors = jet(groups); % 使用彩虹色系
for i = 1:groups
data = [data; normrnd(i, 0.5, [200, 1])];
end

% 为每组数据创建一个标签
group = repelem(1:groups, 200)';

% 创建一个图形窗口
figure;

% 对每组数据进行绘制
for i = 1:groups
% 选择当前组的数据
subset = data(group == i);
% 计算核密度估计
[f, xi] = ksdensity(subset);
% 绘制密度曲线,并上移相应的高度以创建堆叠效果
plot(xi, f + i, 'LineWidth', 2, 'Color', colors(i, :));
hold on;
end

% 添加图例和坐标轴标签
legend('Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5', 'Group 6', ...
'Location', 'northeastoutside');
xlabel('Value');
ylabel('Density');
title('Enhanced Ridge Plot Example');

% 设置坐标轴界限和网格
xlim([min(data), max(data)]);
ylim([1, groups + 1]);
grid on;

% 设置字体大小
set(gca, 'FontSize', 10);

% 显示图形
hold off;

下面两个是matalb美化后的版本
在这里插入图片描述
在这里插入图片描述

python

在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

# 如果您想尝试使用默认样式,可以注释掉下面这行代码
# plt.style.use('seaborn')

# 生成模拟数据
groups = 6
data = pd.DataFrame({f'Group_{i}': np.random.normal(loc=i, scale=0.5, size=200) for i in range(1, groups + 1)})

# 转换为“长格式”
data_long = pd.melt(data, var_name='Group', value_name='Value')

# 初始化图形
fig, ax = plt.subplots(figsize=(10, 6))

# 对每组数据进行绘制
for i, group in enumerate(data.columns):
    # 选择当前组的数据
    subset = data[group]

    # 计算核密度估计
    density = gaussian_kde(subset)
    xs = np.linspace(subset.min(), subset.max(), 200)
    ys = density(xs)

    # 绘制密度曲线,并上移相应的高度以创建堆叠效果
    ax.plot(xs, ys + i, lw=2)

# 添加图例和坐标轴标签
ax.legend([f'Group {i + 1}' for i in range(groups)])
ax.set_xlabel('Value')
ax.set_ylabel('Density')
ax.set_title('Ridge Plot Example')

# 显示图形
plt.show()

在这里插入图片描述

气泡矩阵图

气泡矩阵图(Bubble Matrix Plot),通常用于显示三个变量之间的关系。这种图表类型将数据点表示为气泡的形式,其中气泡的大小通常表示第三个数值变量的大小。图表的X轴和Y轴代表两个分类或定量变量。颜色可能代表另一个分类变量或是另一个连续变量的梯度,这里颜色的深浅对应于颜色条(Color Bar)上的值。
在这里插入图片描述

实现

matlab

在这里插入图片描述

% MATLAB code to create an aesthetic bubble matrix plot

% Generate some example data
x_categories = 1:10;
y_categories = 1:10;
[X, Y] = meshgrid(x_categories, y_categories);
bubbleSizes = reshape(rand(size(X)), [], 1) * 100; % Random bubble sizes
colors = reshape(rand(size(X)), [], 1); % Random colors for the bubbles

% Create the figure
figure;

% Create the bubble plot using scatter
scatter(X(:), Y(:), bubbleSizes, colors, 'filled');

% Improve aesthetics
colormap('jet'); % Use the 'jet' colormap for color coding the bubbles
colorbar; % Show a color bar
title('Aesthetic Bubble Matrix Plot');
xlabel('XAxis');
ylabel('YAxis');

% Change the axis to show the category names
xticks(x_categories);
xticklabels(arrayfun(@num2str, x_categories, 'UniformOutput', false));
yticks(y_categories);
yticklabels(arrayfun(@num2str, y_categories, 'UniformOutput', false));

% Add a grid
grid on;
set(gca, 'GridLineStyle', '--', 'GridColor', [0.5, 0.5, 0.5], 'GridAlpha', 0.7); % Use a gray color for the grid

% There is no tight_layout in MATLAB, but you can manually adjust subplot margins or use 'axis tight'
% axis tight; % Uncomment this if you want to remove white space around the axes

% Add a legend for the bubble sizes
lgd = legend('Bubble Sizes');
title(lgd, 'Legend');

为了进一步美化,我们使用了更现代的parula颜色映射,并为每个气泡添加了黑色的边缘,以便更好地与背景区分。同时,我对颜色条标签和标题的字体大小进行了调整,并设置了图例的位置和样式,使其更加美观。
在这里插入图片描述

python

import matplotlib.pyplot as plt
import numpy as np

# Generate example data
x_categories = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10']
y_categories = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B9', 'B10']
x = np.repeat(range(len(x_categories)), len(y_categories))
y = np.tile(range(len(y_categories)), len(x_categories))
bubble_sizes = np.random.uniform(10, 1000, size=len(x)) # Bubble sizes
colors = np.random.uniform(0.1, 1, size=len(x)) # Color values

# Create the bubble matrix plot
plt.figure(figsize=(10, 8))
scatter = plt.scatter(x, y, s=bubble_sizes, c=colors, cmap='viridis', alpha=0.6, edgecolors="w", linewidth=0.5)

# Add titles and labels
plt.title('Bubble Matrix Plot Example')
plt.xlabel('XAxis')
plt.ylabel('YAxis')

# Change the axis to show the category names
plt.xticks(ticks=np.arange(len(x_categories)), labels=x_categories)
plt.yticks(ticks=np.arange(len(y_categories)), labels=y_categories)

# Add a color bar
plt.colorbar(scatter, label='Color Bar')

# Add a legend for sizes
for size in [100, 300, 600]:
    plt.scatter([], [], c='k', alpha=0.3, s=size, label=str(size))
plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='Bubble Sizes')

plt.grid(True)
plt.show()

为了进一步美化,我们使用了Spectral色彩映射来提供一个更丰富的颜色梯度。调整了标题和标签的字体大小,以提高可读性。修改了颜色条和图例,使其更具有信息性且易于阅读。添加了网格线,并调整了其样式以更加微妙且不干扰数据的展示。
在这里插入图片描述

后续

后续还会更新,百分比堆叠线条图、火山图、玫瑰图…有任何问题欢迎留言!需要完成的matlab和python代码看下面!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战 php 使用 wkhtmltopdf 生成pdf的全过程

公司里边有生成pdf报告的业务需求,之前有过尝试用tcpdf,直接生成的pdf的过程,但是pdf报告的内容数据,根据不同内容的变化,都是各种各样的bug,一直处理修修补补的状态,让后台开发人员很是头疼. 经过思索和甄选,总结出我们的业务中是由于样式不可控导致的,当时从逻辑上就思考到用…

半监督学习 - 三元组学习(Triplet Learning)

什么是机器学习 三元组学习(Triplet Learning)是半监督学习中一种用于学习有用表示的方法。它通常用于学习数据中的相似性关系,尤其在人脸识别、图像检索等领域中得到广泛应用。三元组学习是通过构造三元组(triplet)来…

Java NIO (一)简介(备份)

1 NIO简介 在1.4版本之前,Java NIO类库是阻塞IO,从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。New IO类库的目的 就是要让Java支持非阻塞IO。 Java NIO类库包含三个核心组件: …

AGV磁导航传感器CNS-MGS-160N安装与调试方法与注意事项

AGV磁导航传感器CNS-MGS-160N通过上位机给传感器下发岔路选择指令,传感器即⾃动屏蔽⾮选择⽅向的磁条,使AGV平滑过弯⽆抖动,可通过配置软件设置传感器的检测灵敏度,适应不同的安装⾼度下的检测要求,其通过输出1mm⾼精度…

行测:国考省考行测:语句表达,位置分析,语句分析,语句填空

国考省考行测:语句表达 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到…

STM32 CubeIDE 使用 CMSIS-DAP烧录 (方法2--外部小工具)

前言: 本篇所用方法,需要借助一个外部的工具小软件。 优点:烧录更稳定; 缺点:不能在线仿真调试。 下面链接,是另一种方法:修改CubeIDE调试文件。能在CubeIDE直接烧录、仿真,但不稳定。…

人工智能在数据安全中的应用场景

场景一:数据资产梳理 数据资产梳理是数据安全的基础。知道企业究竟有多少数据,这些数据在哪里?有哪些类型的数据?其中哪些是敏感数据?这些数据的敏感等级分别是什么?只有明确了保护的目标,才能…

浅析企业云性能监控的关键作用

企业云性能监控是一项关键的IT管理活动,它旨在实时追踪、分析和优化企业在云环境中的应用程序和系统性能。云性能监控涉及到监测各个层面的云服务,从基础设施到应用程序,以确保企业能够在云环境中实现高效、可靠和稳定的运行。以下是企业云性…

20. 从零用Rust编写正反向代理,四层反向代理stream(tcp与udp)实现

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子 项目地址 gite: https:…

transbigdata笔记:可视化

1 可视化轨迹 transbigdata.visualization_trip(trajdata, col[Lng, Lat, ID, Time], zoomauto, height500) 例子见transbigdata 笔记:官方文档案例1(出租车GPS数据处理)-CSDN博客 2 可视化od transbigdata.visualization_od(oddata, col…

深入解析JavaScript中的变量作用域和闭包

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript作为一门解释执行的脚本语言,其变量作用域与传统编译型语言…

第二证券:抢占技术前沿 中国光伏企业结伴“走出去”

2024年新年前后,光伏职业分外忙碌。据证券时报记者不完全统计,晶澳科技、华晟新动力、高测股份、华民股份等多家企业宣告新建项目投产,安徽皇氏绿能等企业的项目也迎来设备安装的重要节点。 证券时报记者采访多家企业的负责人后了解到&#…

3.goLand基础语法

目录 概述语法for常量与变量数组切片 slice切片问题问题1问题2 Make 和 New结构体和指针结构体标签 结束 概述 从 java 转来学 go &#xff0c;在此记录&#xff0c;方便以后翻阅。 语法 for package mainimport "fmt"func main() {for i : 0; i < 3; i {fmt.…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

开发实践6_缓存^中间件

以下学习 朔宁夫 开发工程师 课程。 缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。 一 缓存 1. 数据库缓存 创建缓存数据表 // python manage.py createcachetable cache_table setting // # 缓存配置 CACHES {def…

精品基于Uniapp+Springboot宠物用品服务销售管理系统App

《[含文档PPT源码等]精品基于UniappSpringboot宠物管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

js日期排序(使用sort)

根据日期进行排序&#xff0c;也可以根据number类型的大小来进行排序 按日期排序的函数 let data [{id: 2,time: 2019-04-26 10:53:19},{id: 4,time: 2019-04-26 10:51:19}, {id: 1,time: 2019-04-26 11:04:32}, {id: 3,time: 2019-04-26 11:05:32} ] //property是你需要排序…

geemap学习笔记048:光谱变换

前言 Earth Engine中有多种光谱变换方法。其中包括图像上的实例方法&#xff0c;例如 normalizedDifference()、unmix()、rgbToHsv() 和 hsvToRgb()。 1 导入库并初始化 import ee import geemapee.Initialize()2 全色图像锐化(Pan sharpening) Map geemap.Map(center[40,…

计算机二级Python基本排序题-序号43(补充)

1. 在一组单词中&#xff0c;查找出所有长度最长的单词&#xff0c;如果给定的一组单词是&#xff1a;“cad” ,“VB”.“Python” ,“MATLAB” , “hel1o” , “world” 则输出结果为&#xff1a;the longest words are: Python MATLAB def proc(strings): …

unique()函数

这篇博客是本人在学习算法中遇到的一个常用的函数&#xff0c;记录分享给大家 注意 &#xff1a;unique&#xff08;&#xff09;函数是删除相邻的重复元素&#xff0c;并且返回的是去重范围后的第一个元素的地址&#xff0c;左闭右开 #include <bits/stdc.h> using na…