Matlab动画绘图问题:输出视频中坐标轴刻度不可见
解决Matlab中animatedline生成视频无坐标轴刻度的问题
使用Matlab的animatedline函数制作数据动画视频时,代码运行正常,但输出的视频中无法显示坐标轴刻度值,核心问题出在坐标轴字体设置过小,以及部分代码冗余。
原问题代码
clc clear close all %%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx leftX=[0 -0.081205 -0.16242 -0.24363 -0.32485 -0.40606 -0.48727 -0.56849 -0.6497 -0.73091 -0.81213 -0.89334 -0.97455 -1.0558 -1.137 -1.2182 -1.2994 -1.3806 -1.4618 -1.543 -1.6243 -1.7055 -1.7867 -1.8679 -1.9491 -2.0303 -2.1115 -2.1928 -2.274 -2.3552 -2.4364 -2.5176 -2.5988 -2.68 -2.7612 -2.8425 -2.9237 -3.0049]; leftY=[45.281 51.25 48.898 59.386 49.465 62.04 50.664 53.231 63.503 53.371 55.802 59.646 56.474 56.683 57.956 56.628 56.925 57.331 56.525 56.857 57.245 56.807 56.973 57.035 56.859 56.993 57.126 57.126 57.012 57.046 57.112 57.144 57.079 57.045 56.927 57.089 57.134 57.012]; rightX=[0.000 0.081 0.162 0.244 0.325 0.406 0.487 0.568 0.650 0.731 0.812 0.893 0.975 1.056 1.137 1.218 1.299 1.381 1.462 1.543 1.624 1.706 1.787 1.868 1.949 2.030 2.112 2.193 2.274 2.355 2.436 2.518 2.599 2.680 2.761 2.843 2.924 3.005]; rightY=[45.281 51.212 48.869 59.459 49.138 62.068 50.844 52.928 63.230 53.481 55.907 59.519 56.434 56.849 57.779 56.599 57.046 57.256 56.714 56.974 56.936 56.936 57.113 56.924 56.941 56.908 57.044 56.847 56.952 57.008 56.947 57.041 57.038 56.910 56.858 57.093 57.034 56.928]; %animate function h=animatedline('Color','r','LineWidth',2.5); axis([-2.0 2.0 40 70]); h2=animatedline('LineWidth',2.5); box on set(gca, 'FontSize', 1.20, 'LineWidth', 1.2); ylabel(' O^{2-}ion density(ion/{nm}^3)', 'FontSize', 20); xlabel('Distance from GB core(nm)', 'FontSize', 20); frames= cell(length(leftX)+20,1) %define forloop for i=1:length(leftX) addpoints(h,leftX(i),leftY(i)); addpoints(h2,rightX(i),rightY(i)) drawnow; pause(1.3) frame(i)=getframe(gcf); end obj =VideoWriter('oscillations.avi'); obj.Quality=100; obj.FrameRate =1; open(obj); for i=1:length(leftX) writeVideo(obj,frame(i)); end obj.close()
问题分析
- 坐标轴字体过小:代码中
set(gca, 'FontSize', 1.20)将坐标轴刻度字体设置为1.2,这个尺寸太小,肉眼几乎无法识别,导致视频中完全看不到刻度值。 - 冗余变量:
frames= cell(length(leftX)+20,1)定义后未被使用,属于无效代码。 - 未预分配数组:
frame数组在循环中动态赋值,会降低运行效率。
修改后的代码
clc clear close all leftX=[0 -0.081205 -0.16242 -0.24363 -0.32485 -0.40606 -0.48727 -0.56849 -0.6497 -0.73091 -0.81213 -0.89334 -0.97455 -1.0558 -1.137 -1.2182 -1.2994 -1.3806 -1.4618 -1.543 -1.6243 -1.7055 -1.7867 -1.8679 -1.9491 -2.0303 -2.1115 -2.1928 -2.274 -2.3552 -2.4364 -2.5176 -2.5988 -2.68 -2.7612 -2.8425 -2.9237 -3.0049]; leftY=[45.281 51.25 48.898 59.386 49.465 62.04 50.664 53.231 63.503 53.371 55.802 59.646 56.474 56.683 57.956 56.628 56.925 57.331 56.525 56.857 57.245 56.807 56.973 57.035 56.859 56.993 57.126 57.126 57.012 57.046 57.112 57.144 57.079 57.045 56.927 57.089 57.134 57.012]; rightX=[0.000 0.081 0.162 0.244 0.325 0.406 0.487 0.568 0.650 0.731 0.812 0.893 0.975 1.056 1.137 1.218 1.299 1.381 1.462 1.543 1.624 1.706 1.787 1.868 1.949 2.030 2.112 2.193 2.274 2.355 2.436 2.518 2.599 2.680 2.761 2.843 2.924 3.005]; rightY=[45.281 51.212 48.869 59.459 49.138 62.068 50.844 52.928 63.230 53.481 55.907 59.519 56.434 56.849 57.779 56.599 57.046 57.256 56.714 56.974 56.936 56.936 57.113 56.924 56.941 56.908 57.044 56.847 56.952 57.008 56.947 57.041 57.038 56.910 56.858 57.093 57.034 56.928]; % 设置画布大小,确保刻度完整显示 figure('Position', [100 100 800 600]); % 创建动画线条 h=animatedline('Color','r','LineWidth',2.5); axis([-2.0 2.0 40 70]); h2=animatedline('LineWidth',2.5); box on % 修正坐标轴字体大小,设置为合适的12号字 set(gca, 'FontSize', 12, 'LineWidth', 1.2); ylabel(' O^{2-}ion density(ion/{nm}^3)', 'FontSize', 20); xlabel('Distance from GB core(nm)', 'FontSize', 20); % 预分配frame数组,提升效率 frame = struct('cdata', [], 'colormap', []); frame(length(leftX)) = frame(1); % 动画循环 for i=1:length(leftX) addpoints(h,leftX(i),leftY(i)); addpoints(h2,rightX(i),rightY(i)) drawnow; pause(1.3); frame(i)=getframe(gcf); end % 写入视频 obj =VideoWriter('oscillations.avi'); obj.Quality=100; obj.FrameRate =1; open(obj); writeVideo(obj,frame); close(obj);
关键修改点说明
- 调整坐标轴字体大小:将
FontSize从1.2改为12,确保刻度文字清晰可见。 - 预分配数组:提前初始化
frame数组,避免循环中动态扩容,提升代码运行效率。 - 设置画布尺寸:通过
figure('Position', [100 100 800 600])固定画布大小,防止getframe捕获不完整的界面元素。 - 简化视频写入循环:直接使用
writeVideo(obj,frame)一次性写入所有帧,替代原有的循环写法。
内容的提问来源于stack exchange,提问作者shir447
相关产品推荐
相关产品推荐

