(图片来源: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 Konaka版与Flourish网站上的版本还存在差异,小编在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
互动专区
在matlab爱好者公众号中回复“QQ”,加入公众号专属Q群(非免费),与更多matlab爱好者一起交流;回复“原创”,加入原创代码共享Q群,小编原创matlab代码任性领!
如需转载,请在公众号中回复“转载”获取授权,未经授权擅自搬运抄袭的,必将追究其责任!