【问题标题】:Plotting 1000 points (following a particular probability distribution) on the USA map在美国地图上绘制 1000 个点(遵循特定的概率分布)
【发布时间】:2013-06-08 17:49:37
【问题描述】:

我从 mathworks 获得了以下绘制美国地图的代码:

 figure; ax = usamap('conus');
    states = shaperead('usastatelo', 'UseGeoCoords', true,...
      'Selector',...
      {@(name) ~any(strcmp(name,{'Alaska','Hawaii'})), 'Name'});
    faceColors = makesymbolspec('Polygon',...
        {'INDEX', [1 numel(states)], 'FaceColor', ... 
        polcmap(numel(states))}); %NOTE - colors are random
    geoshow(ax, states, 'DisplayType', 'polygon', ...
       'SymbolSpec', faceColors)
    framem off; gridm off; mlabel off; plabel off

如果有人能在以下方面帮助我,我将不胜感激: 我想在分布在美国的概率分布(现在说指数,但可以针对任何其他分布进行修改)之后绘制 1000 个点。这些聚类点需要与背景颜色区分开来并且足够大。此外,我希望能够获得这些点的坐标 1000 点“(x,y)”用于其他计算。我将不胜感激有关此的任何帮助。此外,如果美国代码可以变得更有效率,并且可能包括加拿大的魁北克州,那么这也将不胜感激。谢谢!

【问题讨论】:

    标签: matlab plot


    【解决方案1】:

    首先,您需要创建一组随机坐标,并记住坐标应在地图的范围(边界)内: 假设您在 x 方向的范围是 [xmin xmax] 在 y 方向上是 [ymin ymax]。

    应从地图中提取最小值和最大值。 这是我提取的。 1-如果您只是使用较差的图像:

    xmax = 2.354e6;
    ymax = 5.478e6;
    xmin = -1.984e6;
    ymin = 2.674e6;
    

    2- 如果你使用地图:

     v=[];
     allLat=[v states(:).LabelLat];
     allLon=[v states(:).LabelLon];
     xmin = min(allLon);
     xmax = max(allLon);
     ymin = min(allLat);
     ymax = max(allLat);
    

    那么您应该从区间 [a, b] 上的均匀分布生成值。一般形式是这样的:

    % r = a + (b-a).*rand(100,1); % don't need to run this line
    

    您可以使用以下命令创建 1000 个随机分布的点:

    X = xmin + (xmax-xmin).*rand(1000,1);
    Y = ymin + (ymax-ymin).*rand(1000,1);
    

    现在您有了随机创建的点,那么简单的部分就是绘制这些点。在此之前,您需要检查该点是否在特定地图内。

    function v = checkPoint(x,y) 
    b = zeros(size(landareas));
    for i = 1:max(size(landareas))
        if x >= landareas(i).BoundingBox(1,1) && x <= landareas(i).BoundingBox(2,1) && y >=       landareas(i).BoundingBox(1,2) && y <= landareas(i).BoundingBox(2,2) 
        b(i) = 1;
    end
    end
    v = ~isempty(find(b==1)) 
    

    (上述功能并未优化)

    所以您使用“checkPoint”函数检查您的点,如果返回值为 v = 1,那么您绘制该点,否则您忽略该点。现在您可以使用以下命令:

    plot(X,Y,'oy','MarkerSize',10)
    

    您也可以稍后使用 X 和 Y 向量进行任何计算。

    最后,您可以使用此代码绘制您喜欢的世界任何部分:

    worldmap({'Canada','Usa'})
    land = shaperead('landareas.shp', 'UseGeoCoords', true);
    geoshow(land, 'FaceColor', [0.15 0.5 0.15])
    cities = shaperead('worldcities', 'UseGeoCoords', true);
    geoshow(cities, 'Marker', '.', 'Color', 'red')
    

    【讨论】:

    • 感谢您的回复。我看不到如何在地图中包含魁北克州,以及 mathworks 图中的范围是多少(即 [a b])...您能否为这些提出一些建议...非常感谢,再次!
    • 另外,你能告诉我r = a + (b-a).*rand(100,1); 的意义吗?在 X、Y 的计算中?抱歉,我看不到。
    • “rand”命令在 [0 1] 范围内创建随机数。所以你需要将此值映射到地图的比例。否则在这种情况下使用 [0 1] 范围内的随机数是没有用的。
    • 非常感谢。我不能那样做。最后两件事:1. r = a + (b-a).*rand(100,1); 的意义是什么? 2. 无论如何,你能帮我包括魁北克州吗?我尽力在网上搜索,但我没有任何运气在魁北克找到美国。再次抱歉打扰。
    • r=a+(b-a)*rand(100,1) 只是一个更好地显示公式的示例。魁北克我不知道。此外,在 Matlab 中运行代码后,您将拥有一个名为“状态”的结构。您可以通过 Matlab 在 MapViewer App 中打开该结构。然后你可以在地图上移动鼠标,看看坐标在变化。
    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多