在油管、B站爆火的动态条形竞赛图来了【内附源代码】

d6ad6d0f79fa4606b97debf5900739a7.png

e29516ef6b7b728fcf1f473da739d5fc.gif

(图片来源:Flourish Studio)

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

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

答案是肯定的!

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

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

93107924767bc2ed84f0066c28492ab2.gif

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 Konaka版与Flourish网站上的版本还存在差异,小编在Eiji Konaka版的基础之上进行了升级,实现了类似Flourish网站上的效果,效果图如下:

8fb3b85576f410561c78a8ffda0a22c7.gif

小编升级版 —— 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

互动专区

matlab爱好者公众号中回复“QQ”,加入公众号专属Q群(非免费),与更多matlab爱好者一起交流回复原创”,加入原创代码共享Q群,小编原创matlab代码任性领!

如需转载,请在公众号中回复“转载”获取授权,未经授权擅自搬运抄袭的,必将追究其责任!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值