我使用Matlab进行一些粒子动力学模拟,并且我将每个粒子定义为圆形标记。基本上,每次我更新我的情节时,我会根据情节比例调整这些标记的大小;我可以在下面找到所有这些的绘图代码:
%%Initial Plot at time t = 0 Along with Scaling in the Y-Direction
figure;
h=scatter(Pos(1,:),Pos(2,:),6,jet(length(Pos(1,:))),'filled','MarkerEdgeColor','k','linewidth',1);
hold on
axis ([0 dp 0 dp]*L*Scale)
currentunits = get(gca,'Units');
set(gca, 'Units', 'Points');
axpos = get(gca,'Position');
set(gca, 'Units', currentunits);
markerWidth = dp/diff(ylim)*axpos(4); % Calculate Marker width in points
set(h, 'SizeData', markerWidth^2)
这是我遇到的奇怪问题。当我运行我的模拟时,我发现粒子没有按照它们的要求进行排列,这符合很多关于此的文献。基本上,我最终得到了x方向上的粒子之间的间隙(y方向很好) 最初,我认为我的排斥力存在一些问题,但我回去重新排列粒子使得它们会接触(作为初始测试),我注意到 - 尽管参数是正确的 - 绘制的标记没有接触在x方向(再次,y方向很好) 似乎Matlab标记不是完美的圆圈? 有没有人有关于此的任何其他信息或想法如何解决标记以这种方式表现的事实?
答案 0 :(得分:1)
您可以在设置轴限制之前调用axis equal
来实现所需的行为。
将轴范围设置为相等值时,纵横比可以关闭。因此,圆形标记可能不会接触。以下是基于您的方法的示例(为简单起见略作修改):
figure;
POINTS = [1 1;
2 1;
1 2];
h = plot(POINTS(:,1),POINTS(:,2),'o');
%axis equal
dp = 3;
axis ([0 dp 0 dp])
set(gca, 'Units', 'Points');
axpos = get(gca,'Position');
markerWidth = 1/(dp)*axpos(4);
set(h, 'markersize', markerWidth);
这产生了以下简单的图:
我相信,这就是你所经历的。现在,如果您在上面的示例中取消注释axis equal
,则会得到此图:
您还可以使用daspect
获取当前的宽高比。使用此处的原始示例,在没有任何参数的情况下调用[1.5 1.5 1.0]
时,您将获得daspect
。
如果您想要特定的宽高比,可以在这样的情节之后调用daspect
,例如:
daspect([2 1 1])
这将给你这个情节:
请注意,您必须为daspect
的所有三个轴提供一个因子(即使像这里一样,没有z轴)。
设置daspect([1 1 1])
与axis equal
相同。