在油管、B站爆火的动态条形竞赛图来了

Posted by

(图片来源:Flourish Studio)

玩过油管、B站的伙伴可能遇到过上面的动态条形图,可以说是集酷炫狂拽于一身,能将干瘪的数据跃然纸上、使之绘声绘色,轻松俘获各种眼球。

而像这样的图表在Flourish网站上可以轻松实现,不过作为matlab爱好者,看到这样的图表自然而然会想到可不可以在matlab中也给它实现呢?

答案是肯定的!


这个图表的学名叫 —— Bar Chart Race,实现原理其实并不难。首先需要准备绘制所需的数据,如果是跟世界各国相关的数据,建议大家去世界银行官网下载。其次,就是绘制横向的条形图,使用matlab的barh函数即可轻松搞定。再者,通过在各个时间点对相关数据进行排序并记录序列位置,两时间点之间通过线性插值来完成条形图位置的动态变化。最后,可以在条形图适当的位置添加图片logo或者文字标签,通过for循环来实现整个动态变化效果,详细参见:如何用matlab制作演示动画并存储


经过小编在FileExchange中检索发现,Eiji Konaka已经将相关初级源代码分享至该平台 (链接:www.mathworks.com/matlabcentral/fileexchange/74003-barchartrace)。

Eiji Konaka —— main函数:

%%
% This file explains how to call barChartRace.
% written by Eiji Konaka, Jan/2020
clear; clc; close all
%% sample data
y=rand(8,25);%y(:,1)=zeros(size(y(:,1)));
y=filter(1,[1 -1], y')';

%% options
Opt.xTickLabelStrs=cell(size(y,1),1);
Opt.outFileName='outFile.gif';
Opt.xLabelStr='x';
Opt.yLabelStr='y';
Opt.titleStr='Eiji Konaka版本演示';
Opt.faceColor=[0,0,1]; %'blue';

for n1=1:size(y,1)
    Opt.xTickLabelStrs(n1)={char('A'+(n1)-1)};
end

barChartRace(y,Opt); % 核心程序

如需要Eiji Konaka版完整程序伙伴可以到FileExchange平台下载或者在matlab爱好者公众号回复“条形竞赛图”获取。

很显然,Eiji KonakaFlourish网站上的版本还存在差异,小编在Eiji Konaka的基础之上进行了升级,实现了类似Flourish网站上的效果,效果图如下:

小编升级版 —— main函数:

% 原作者:Eiji Konaka
% 改编:巴山 (bashan)
% 感谢关注matlab爱好者公众号

clear;clc;close all
D = importdata('GDPnew.xls');
% 生成绘图所需要的数据
N = 10;

% 设置第一列数据对应国家名称
CT = {'美国','德国','日本','法国','英国','意大利','中国','加拿大','印度','巴西'};

% 定义与CT中国家名称相对应的颜色
crI = [51,160,44;
       31,120,180;
       255,127,0;
       106,61,154;
       177,89,40;
       251,154,153;
       255,0,0;
       178,223,138;
       253,191,111;
       202,178,214]/255;

% 读取对应国家国旗
filepath = strcat(pwd,'\flags\');
imgList  = dir(strcat(filepath,'*.jpg'));
lenM     = length(imgList);
img      = cell(lenM,2);
for k = 1:lenM
    loc      = contains({imgList.name},CT{k});
    img{k,1} = imread(strcat(filepath,imgList(loc).name));
    img{k,2} = size(img{k,1});
end

% 对数据进行预处理
y      = round(D.data)/1e8;
year   = D.textdata(1,2:end);

% 选项设置
Opt.xTickLabelStrs = cell(size(y,1),1);
Opt.outFileName    = 'outFile.gif';
Opt.xLabelStr      = 'GDP (千万美元)';
Opt.titleStr       = '1970—2019年GDP排名动态变化图';
Opt.xTickLabelStrs = CT;

dynamicBar(y,Opt,img,crI,year); % 改编后的核心函数

大家可根据Eiji Konaka来尝试实现小编以上的效果图,其实还可以添加更多更丰富的内容到里面,小编这里仅是抛砖引玉。

当然,若有愿意支持小编的伙伴,可以加入原创代码共享Q群获取本文小编改进版完整源程序及相关素材,小编今后也会将更多精彩的改编或原创程序上传至该群中,在matlab爱好者公众号中回复“原创”或“共享”即可加入原创代码共享Q群最后,感谢大家的阅读!若觉得好,别忘分享给和您一样爱学习研究的小伙伴哦!

参考资料:

[1] www.mathworks.com/matlabcentral/fileexchange/74003-barchartrace

[2] https://app.flourish.studio/@flourish/bar-chart-race