数据是数学建模竞赛答卷的核心支撑,直接决定建模成果的说服力与完整性!今天小云就为大家整理了美赛必备的数据可视化宝藏网站,助力同学们高效备战、精准呈现建模思路~

涵盖 **5 个实用在线工具及 MATLAB、Python 相关可视化实现,助力高效呈现建模思路

一、美赛必备数据可视化工具

1.Tableau Public

免费平台,拥有庞大可视化库,支持柱状图、地图等多种类型,无需编程即可实现复杂数据分析与交互,作品可嵌入网页分享。

2.Plotly

擅长制作美观且高交互性图表,支持 Python、R 等多编程语言,提供丰富模板和在线编辑器(Plotly Dash),缩放、悬停等功能便于深度探索数据。

3.Desmos

在线图形计算器,操作直观,支持绘图、统计分析、科学计算等,兼容 LaTeX 语法,可动态调整参数,不受表达式数量限制。

4.Visme

提供海量图片、模板、字体等素材,可制作演示文稿、图表、报告,支持随时随地查看呈现内容。

5.Infogram

专业可视化工具,模板库丰富,无需编程技能,可在网页端制作信息图、地图等,具备交互式图表、可点击链接等功能。

二、MATLAB 相关可视化

包含地图、三维山脉图、散点图、热图、带数据点的箱型图的实现代码及效果展示。

1.地图

% demo2
% 需要mapping toolbox
% 大地水准面高度数导入
load geoid60c.mat
% 创建某经纬度范围世界地图坐标区域
latlim=[-50 50];
lonlim=[160 -30];
ax=worldmap(latlim,lonlim);
geoshow(ax,geoid60c,geoid60cR,'DisplayType','surface')
% 205 190 215
colormap(nclCM(215,20))
% colormap(nclCM(335,100))

2.三维山脉图

clear;clc;close all;
x = linspace(-3,3,30);
y = linspace(-4,4,40);
[X,Y] = meshgrid(x,y);
Z = peaks(X,Y);
Z(5:10,15:20) = 0;
z1 = max(Z);
z2 = max(Z,[], 2);
figure;
subplot(3,3,[1,2]);
plot(x,z1,'LineWidth', 2);
subplot(3,3,[6, 9]);
plot(z2, y,'LineWidth', 2);
subplot(3,3,[4,5,7,8]);
surf(x,y,Z);
xlim([-3,3]);
ylim([-4,4]);
view(0,90);
shading interp%平滑图像
上下滑动查看更多

3.散点图

clc
close all
clear
%% 导入数据
X=[
    -0.752713846442762  2.48140797998545    1
...
-1.62181912776895   -0.851506362212275  2
];
%%
datamin = min(min(XYZ(:, 1)), min(XYZ(:, 2)));
datamax = max(max(XYZ(:, 1)), max(XYZ(:, 2)));
datamin = floor(datamin);
datamax = ceil(datamax);

Length = 600;
Width = 600;

axismin = datamin;
axismax = datamax;

% 绘制密度图
XYZ(:, 3) = XYZ(:, 3) - XYZ(:, 3);
sizeXYZ = size(XYZ);
searchR = 1.0;
for i = 1 : sizeXYZ(1)
    index_i = find(XYZ(:, 1) > XYZ(i, 1) - searchR & XYZ(:, 1) < XYZ(i, 1) + searchR ...
        & XYZ(:, 2) > XYZ(i, 2) - searchR & XYZ(:, 2) < XYZ(i, 2) + searchR);
    sizeIndexI = size(index_i);
    XYZ(i, 3) = sizeIndexI(1);
end
[sortXYZ, sortI] = sort(XYZ(:, 3));

figure(1)
hold on;
box on;
h(1) = scatter(XYZ(sortI, 1), XYZ(sortI, 2), [], XYZ(sortI, 3), 'filled');
colormap jet
xlabel("X");
ylabel("Y");
axis([axismin axismax axismin axismax]);
gc = get(gca);
set(gcf, 'position', [300, 100, Length, Width]);
set(gca,'fontsize',12);
colorbar

4.热图

figureUnits = 'centimeters';
figureWidth = 20; 
figureHeight = 12;
% 图形1:绘制热图
figure(2)
set(gcf, 'Units', figureUnits, 'Position', [0 0 figureWidth figureHeight]);
h = heatmap( rho ,'FontSize',10);          %  XName, YName,
h.GridVisible = 'off';
h.XDisplayLabels = {'','','','4','','','','8','','','','12','','','','16','','','','20','','','','24'};
h.YDisplayLabels = {' ','2\\fontname{宋体}月',' ','4\\fontname{宋体}月',' ','6\\fontname{宋体}月',' ','8\\fontname{宋体}月',' ','10\\fontname{宋体}月',' ','12\\fontname{宋体}月'};
h.FontName='Times New Roman';      % 设置显示的字体
h.FontSize = 14;                                 % 设置显示的字体大小
% 设置坐标区名字与图的大标题
% h.Title = 'Tiltle';
h.XLabel = '\\fontname{宋体}时间尺度\\fontname{Times New Roman}\\itSPI';
h.YLabel = '\\fontname{宋体}月份';
% 对热图上色—colormap函数
hc = colormap(gca, flipud(hot) );
set(gca,'FontSize',16);   % ,'Fontname', 'Times New Roman'

5.带有数据点的箱型图

#绘制带有数据点的箱型图的代码如下:
import plotly.io as pio
import plotly.graph_objs as go
import plotly.express as px
from plotly.subplots import make_subplots
import pandas as pd
import numpy as np
# can be `plotly`, `plotly_white`, `plotly_dark`, `ggplot2`, `seaborn`, `simple_white`, `none`pio.templates.default = 'plotly_white'
fig = go.Figure()
fig.add_trace(go.Box(y=np.random.rand(100),name='trace1'))
fig.add_trace(go.Box(y=np.random.rand(100),name='trace2'))
fig.add_trace(go.Box(y=np.random.rand(100), name='trace3'))
# boxpoints 可以为 `all`, `outliers`,`suspectedoutliers`, False
# 使用jitter参数随机对点进行抖动,防止重叠
fig.update_traces(boxpoints='all', jitter=0.2)
fig.write_html('test.html')

三、Python 相关可视化

提供热力图、地图、三维核密度图、等高线图、气泡图的代码示例,适配不同数据呈现需求。

1.热力图

import numpy as np
import plotly.graph_objs as go
arr = np.random.normal(loc = 0,scale = 1,size = [10,10])
trace = go.Heatmap(x=np.arange(10),y=np.arange(10),z=arr,
colorscale='Viridis',showscale=True,reversescale = False)
layout = go.Layout(width=600, height=600)
fig = go.Figure(data=trace,layout=layout)
fig.show()

2.地图

# 检验数据读取绘图
fig = plt.figure(figsize=(12, 5))
leftlon, rightlon, lowerlat, upperlat = (-180, 180, -90, 90)
proj = ccrs.PlateCarree(central_longitude=180)  # 指定投影为经纬度投影。
ax1 = fig.add_axes([0.1, 0.1, 0.9, 0.8], projection=proj)  # 绘制第一个子图
ax1.set_extent([leftlon, rightlon, lowerlat, upperlat], crs=proj)
# 设置经纬度标签
ax1.set_xticks(np.arange(leftlon, rightlon + 30, 30), crs=proj)
ax1.set_yticks(np.arange(lowerlat, upperlat + 10, 10), crs=proj)
lon_formatter = cticker.LongitudeFormatter()
lat_formatter = cticker.LatitudeFormatter()
ax1.xaxis.set_major_formatter(lon_formatter)
ax1.yaxis.set_major_formatter(lat_formatter)
c = ax1.contourf(lon.values, lat.values, anosst, levels=np.arange(-5,6,0.1),cmap=plt.get_cmap('RdBu_r'),
transform=ccrs.PlateCarree(),extend='both')
cbar = plt.colorbar(c, shrink=0.7)
coastline_50m = cfeature.COASTLINE.with_scale('50m')
ax1.add_feature(coastline_50m)
land_facecolor = 'white'
land = cfeature.NaturalEarthFeature('physical', 'land', '50m',facecolor=land_facecolor)
ax1.add_feature(land)
cbar.set_label('Surface Sea Temperature')
plt.show()

3.三维核密度图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
x = insurance['age'].values
y = insurance['bmi'].values
z = insurance['charges'].values
# 计算核密度估计
density, x_edges, y_edges = np.histogram2d(x, y, bins=50, density=True)
density /= density.sum()
# 创建网格坐标
x_grid, y_grid = np.meshgrid(x_edges[:-1], y_edges[:-1])
# 绘制三维核密度图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x_grid, y_grid, density,cmap='viridis')
ax.set_xlabel('age')
ax.set_ylabel('bmi')
ax.set_zlabel('charges')
plt.show()

4.等高线图

mport matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm#matplotlib内置的颜色地图
from mpl_toolkits.mplot3d import Axes3D#引入3d绘图模块
X = np.arange(-8, 8, 0.25)
Y = np.arange(-8, 8, 0.25)
X, Y = np.meshgrid(X, Y)#生成网格点矩阵,就是对X,Y进行网格化
R = np.sqrt(X**2 + Y**2 + X + Y)#X**2代表X的二次方
Z = np.sin(R)
fig = plt.figure()#Figure(640x480)   生成画布
ax = Axes3D(fig)#和上一步一起构建一个3d画布
ax.plot_surface(X, Y, Z, rstride=1#行跨(x)为1
, cstride=1        #列跨(y)为1
, cmap=cm.viridis  #设置颜色
)#构造3D图像
ax.contourf(X,Y,Z,#传入数据
zdir='z'#设置为z轴为等高线的不变轴
,offset=-1#映射位置在z=-1处
,cmap=plt.get_cmap('rainbow')#设置颜色为彩虹色
)#绘制图像的映射,就是等高线图。
plt.xlabel('x_axis')
plt.ylabel('y_axis')
plt.show()

5.气泡图

from pyecharts import options as opts
from pyecharts.charts import Scatter
# 生成示例数据
data2 = [(i, random.randint(30, 150), random.randint(1, 100)) for i in range(1, 11)]
# 绘制多系列气泡图
scatter_multi_series = Scatter()
scatter_multi_series.add_xaxis([str(item[0]) for item in data])
scatter_multi_series.add_yaxis("销售A", [item[1] for item in data],
symbol_size=[item[2] for item in data],
label_opts=opts.LabelOpts(is_show=False))
scatter_multi_series.add_yaxis("销售B", [item[1] for item in data2],
symbol_size=[item[2] for item in data2],
label_opts=opts.LabelOpts(is_show=False))
scatter_multi_series.set_global_opts(title_opts=opts.TitleOpts(title="多系列气泡图"),
xaxis_opts=opts.AxisOpts(type_="category"))
# 渲染图表
scatter_multi_series.render("multi_series_bubble_chart.html")

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐