【问题标题】:Length scaling orientation data in MATLABMATLAB 中的长度缩放方向数据
【发布时间】:2017-08-21 12:37:06
【问题描述】:

问题

我有一个描述地质结构的数据集。每个结构都有一行具有两个属性 - 它的长度和方向(0-360 度)。

在这个数据集中,有两种类型的结构。

  • 类型 1:数据点较少,但结构在物理上较大(大 length,因此更重要)。
  • 类型 2:更多数据点,但结构在物理上更小(小length,因此意义不大)。

我想创建一个rose plot 来显示结构方向的分布。但是,我希望这个图也能结合它们所面对的方向来代表结构的重要性 - 考虑到长度。

是否有可能在 MATLAB 中以某种方式按长度缩放,这样当结构很大时,数量较少的子集就不会被低估?


示例

一个数据集可能包含:

  • 10座南北向结构,长50公里。
  • 100 个东西方向的结构,长 0.5 公里。

在这种情况下,根据绝对数字,东西方人口看起来比南北人口更重要。然而,实际上构成该种群的成员的长度要小得多,因此结构不那么重要。


代码

这是我到目前为止的代码:

load('WG_rose_data.xy') 
azimuth = WG_rose_data(:,2); 
length = WG_rose_data(:,1); 
rose(azimuth,20); 

其中WG_rose_data.xy 是一个包含 2 列的数据文件,其中包含地质结构的长度和方位角(方向)数据。

【问题讨论】:

  • 给我们你现在拥有的示例数据和图表,这样更容易表明你想要什么。
  • 嗨,我现在已经修改了我的原始帖子以包含这个,因为它在评论中并没有很好地出现。
  • 我仍然不明白您所说的“一个人口较少但包含更大的成员”的意思 - 什么人口?据我所知,您只有一个正在绘制的向量...同样来自rose documentation:“不推荐使用玫瑰。请改用极坐标图”。
  • 好吧,举个例子,我们有 10 个南北方向的线性结构,长 50 公里,但我们有 100 个东西方向的结构,长 0.5 公里。在这种情况下,根据绝对数字,东西方人口看起来比南北人口更重要。然而,在现实中,为这个群体做出贡献的成员的长度要小得多。我正在寻找一种方法来扩展此类方向数据集。所以是的,我目前只是在绘制方向,因为我不知道如何使用长度。
  • 我已编辑您的问题以提高其清晰度,我认为根据您提供的额外信息已大大改进,但请随时进一步编辑以提高清晰度。

标签: matlab rose-diagram


【解决方案1】:

对于数据中的每一行,您可以根据其长度值将其复制给定次数。因此,如果您有一个长度为 50 的结构,它计为 50 个数据点,而长度为 1 的结构仅计为 1 个数据点。当然,你必须四舍五入你的长度,因为你只能有整数行。

这可以通过矩阵d中的示例数据来实现

% Set up example data: 10 large vertical structures, 100 small ones perpendicular
d = [repmat([0, 50], 10, 1); repmat([90, .5], 100, 1)];
% For each row, duplicate the data in column 1, according to the length in column 2
d1 = [];
for ii = 1:size(d,1)
    % make d(ii,2) = length copies of d(ii,1) = orientation
    d1(end+1:end+ceil(d(ii,2))) = d(ii,1); 
end

输出玫瑰图:

您可以微调如何复制数据以实现实际数据和长度权重的理想平衡。

【讨论】:

  • 是的,这是一个很好的建议,谢谢。我现在将尝试使用我的实际数据集和报告结果。
  • 附注。如何让 MATLAB 将方向数据视为双向数据?即使玫瑰图关于南北轴对称,因为90度的方位角实际上与270度相同,依此类推。
  • 我会使用mod 函数使您的所有azimuth 数据位于(0,180) 范围内。所以azimuth = mod(azimuth,180).
【解决方案2】:

感谢您提供的所有帮助。此代码是我的最终工作版本供参考:

clear all
close all

% Input dataset
original_data = load('WG_rose_data.xy');

d = [];
%reformat azimuth
d(:,1)= original_data(:,2);
%reformat length
d(:,2)= original_data(:,1);

% For each row, duplicate the data in column 1, according to the length in column 2

d1 = [];
for a = 1:size(d,1)
    d1(end+1:end+ceil(d(a,2))) = d(a,1); 
end

%create oposite directions for rose diagram
length_d1_azi = length(d1);
d1_op_azi=zeros(1,length_d1_azi);

for i = 1:length_d1_azi

    d1_op_azi(i)=d1(i)-180;
    if d1_op_azi(i) < 1;
        d1_op_azi(i) = 360 - (d1_op_azi(i)*-1);
    end    

end

%join calculated oposites to original input
new_length = length_d1_azi*2;
all=zeros(new_length,1);

for i = 1:length_d1_azi
    all(i)=d1(i);
end

for j = length_d1_azi+1:new_length;
    all(j)=d1_op_azi(j-length_d1_azi);
end

%convert input aray into radians to plot
d1_rad=degtorad(all);

rose(d1_rad,24)
set(gca,'View',[-90 90],'YDir','reverse');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 2017-04-18
    相关资源
    最近更新 更多