MATLAB | 你是猫猫教还是狗狗教还是ikun
Posted slandarer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB | 你是猫猫教还是狗狗教还是ikun相关的知识,希望对你有一定的参考价值。
发现了俩有趣github
项目,作者R CODER
写了一个将散点修改为猫猫狗狗图片的的工具函数:
- https://github.com/r-coderdotcom/ggcats
- https://github.com/R-CoderDotCom/ggdogs
R语言能有的MATLAB也要有,于是我将其改编了一个简简单单的MATLAB版本,效果如下:
工具函数
很显然没有素材包的话无法使用,素材包及完整代码请见文末提示关键词,不过当然构造起来也没难的,我将素材包的构造代码放在了最后。先展示工具函数完整代码:
function imageHdl=scatterCanD(X,Y,type,sz)
% @author:slandarer
if nargin<4,sz=1;end
if nargin<3,type=1;end
% 调整数组大小
X=X(:);Y=Y(:);type=type(:);sz=sz(:);
LenRatio1=ceil(length(X)/length(type));
LenRatio2=ceil(length(X)/length(sz));
type=repmat(type,[LenRatio1,1]);
sz=repmat(sz,[LenRatio2,1]);
% 导入图像
CanDSet=load('CanD.mat');
disp(CanDSet.author);
setC=CanDSet.CanD_C;
setA=CanDSet.CanD_A;
% 计算比例
ax=gca;hold on
tempScatter=scatter(X,Y);
PRatio=ax.PlotBoxAspectRatio;
XLen=diff(ax.XLim);
YLen=diff(ax.YLim);
baseLX=XLen/10;
baseLY=YLen/10./PRatio(2).*PRatio(1);
% 开始绘图
for i=1:length(X)
imageHdl(i)=image([-baseLX,baseLX].*sz(i)+X(i),...
[-baseLY,baseLY]./size(setCtype(i),2).*size(setCtype(i),1).*sz(i)+Y(i),...
setCtype(i),'AlphaData',setAtype(i));
end
delete(tempScatter)
% axis tight
hold off
end
- X 数组:x坐标
- Y 数组:y坐标
- type 向量或数值:图片种类1-15为猫,26-40为狗
- sz 向量或数值:图片大小
使用方式
类型为数值
X=rand([1,30]);
Y=rand([1,30]).*2;
scatterCanD(X,Y,11,1);
axis tight
注意请先确定好XY轴比例之后再绘图,不要绘图后再调整比例,即使未绘图前比例是1:100啥的很夸张的比例也能正常绘图,但之后再调整会比例失调:
X=rand([1,30]);
Y=rand([1,30]);
scatterCanD(X,Y,11,1);
axis tight
set(gca,'YLim',[0,2])
类型为向量
会循环向量对应的图像,例如循环14,15,9对应的图像:
X=linspace(0,2*pi,100);
Y=sin(X);
plot(X,Y,'LineWidth',4,'Color','k');
hold on
% 绘制14 15 9循环的图
X1=X(1:5:end);
Y1=Y(1:5:end);
scatterCanD(X1,Y1,[14,15,9],.6);
% 修饰一下
axis tight
ax=gca;box on;grid on
ax.GridLineStyle='-.';
ax.GridAlpha=.05;
ax.LineWidth=1.4;
随机类型
X=linspace(0,2*pi,100);
Y=sin(X);
plot(X,Y,'LineWidth',4,'Color','k');
hold on
% 随机绘图
X1=X(1:6:end);
Y1=Y(1:6:end);
L=length(X1);
scatterCanD(X1,Y1,randi([1,40],[1,L]),.6);
% 修饰一下
axis tight
ax=gca;box on;grid on
ax.GridLineStyle='-.';
ax.GridAlpha=.05;
ax.LineWidth=1.4;
大小为向量
和类型设置一模一样,也会循环向量内的大小,例如:
X=linspace(0,2*pi,100);
Y=sin(X);
plot(X,Y,'LineWidth',4,'Color','k');
hold on
X1=X(1:4:end);
Y1=Y(1:4:end);
scatterCanD(X1,Y1,14,[.3,.5,1]);
% 修饰一下
axis tight
ax=gca;box on;grid on
ax.GridLineStyle='-.';
ax.GridAlpha=.05;
ax.LineWidth=1.4;
X=linspace(0,2*pi,100);
Y=sin(X);
plot(X,Y,'LineWidth',4,'Color','k');
hold on
% 绘制14越来越小
X1=X(1:4:end);
Y1=Y(1:4:end);
L=length(X1);
sz=(L:-1:1)./L.*.5+.3;
scatterCanD(X1,Y1,14,sz);
% 修饰一下
axis tight
ax=gca;box on;grid on
ax.GridLineStyle='-.';
ax.GridAlpha=.05;
ax.LineWidth=1.4;
有趣的效果
弄了个有趣的动图:
X=linspace(0,10,100);
Y=X+rand([1,100]).*2;
Y(1:end-1)=(Y(1:end-1)+Y(2:end))./2;
% 修饰一下坐标区域
ax=gca;hold on;box on;grid on
ax.XLim=[0,12];
ax.YLim=[0,14];
ax.GridLineStyle='-.';
ax.GridAlpha=.05;
ax.LineWidth=1.4;
% 绘制线条及俩猫头
lineHdl=plot(X,Y,'LineWidth',2);
C8Hdl=scatterCanD(X(1),Y(1),8,.8);
C9Hdl=scatterCanD(X(1),Y(1),9,.8);
% 记录猫头初始位置
XData0=C8Hdl.XData-X(1);
YData0=C8Hdl.YData-Y(1);
% 初始化gif图
DelayTime=.1;
F=getframe(ax);
[imind,cm]=rgb2ind(F.cdata,256);
imwrite(imind,cm,'demo2.gif','gif','Loopcount',inf,'DelayTime',DelayTime);
for i=1:length(X)
lineHdl.XData=X(1:i);
lineHdl.YData=Y(1:i);
% 循环显示和隐藏俩猫头
if mod(i,2)==0
C8Hdl.Visible='on';
C9Hdl.Visible='off';
else
C9Hdl.Visible='on';
C8Hdl.Visible='off';
end
% 更新猫头坐标
C8Hdl.XData=XData0+X(i);
C9Hdl.XData=XData0+X(i);
C8Hdl.YData=YData0+Y(i);
C9Hdl.YData=YData0+Y(i);
drawnow
pause(.05)
% 逐帧存入gif图
F=getframe(ax);
[imind,cm]=rgb2ind(F.cdata,256);
imwrite(imind,cm,'demo2.gif','gif','WriteMode','append','DelayTime',DelayTime);
end
全部图片
展示一下全部的图片都有哪些:
[Y,X]=meshgrid(5:-1:1,1:8);
scatterCanD(X,Y,1:40,.8);
axis tight off
更换图片
更换素材包内图片用的代码也非常简单:
for i=1:14
[C,~,A]=imread(['c (',num2str(i),').png']);
C(:,:,1)=flipud(C(:,:,1));
C(:,:,2)=flipud(C(:,:,2));
C(:,:,3)=flipud(C(:,:,3));
% C=imgaussfilt(C,3);
CanD_Ci=C;
CanD_Ai=flipud(A);
end
author=char([20316 32773 58 32 115 108 97 110 100 97 114 101 114]);
save CanD2.mat CanD_C CanD_A author
需要当前文件夹有c (i).png为名字的图片,可以改一些有意思的东西比如羊了个羊:
完
完整代码及素材包:
链接:https://pan.baidu.com/s/12PL0MhS0ytWktaUk0DRJ0A?pwd=slan
提取码:slan
以上是关于MATLAB | 你是猫猫教还是狗狗教还是ikun的主要内容,如果未能解决你的问题,请参考以下文章