0

ラベル付きのポイントをプロットするマップがあります。ここで、ラベルが互いに接近している場所では、ラベルが重なっています。一部の人々が textbp (FileExchange) を提案しているのを見ましたが、セル配列の列からラベルを取得しているため、その関数は機能しません。すべてのラベルがはっきりと見えるように、ラベルがポイントから十分離れて配置されるようにするにはどうすればよいですか? どのラベルがどのプロットのラベルであるかが明確でない場合は、矢印を追加してください。

データはこのファイルです: https://www.dropbox.com/sh/li3hh1nvt11vok5/4YGfwStQlo . このファイルからデータを取り出して並べ替え、一意の値を見つけ、それを使用して点をプロットしました。

スクリプトのマップ部分は次のとおりです。

%% Use function to read in 2012
    % Format: data = ('filename', 'delimiter')
filename = ('PM2.5_NY_2012.csv'); % PM2.5 88101 and 88502 data from NY 

data = read_mixed_csv(filename,', '); % 2012 must have ',' taken out first. DO NOT need to use for 2011 
data = read_mixed_csv(filename,'"'); % Creates cell array of data (2011, 2012)
data = regexprep(data, '^"|"$',''); % Gets rid of double quotes at the start and end of the string 
data = data(:,2:2:end); % 2012. Do it only if there are blank columns. Keep only the even cells because the odd ones are just commas
PM25_NY_2012 = data;

%% Pull data of a specific parameter (Latitude and Longitude - Columns 20 and 21)

% Pull out data with Local Conditions only (Locations differ compared to Acceptable PM2.5
data_Loc = data(strcmp('PM2.5 - Local Conditions', data(:,10)),:);

% Pull out data with Acceptable PM2.5 AQI only
data_Acc = data(strcmp('Acceptable PM2.5 AQI & Speciation Mass', data(:,10)),:); 

%% Find index for the first unique lat and lon
% Local Conditions
[C,ia,ic] = unique(data_Loc(:,2));
DupIndex = setdiff(1:size(data_Loc(:,2)), ia);
data_Loc(DupIndex,:) = [];

datalat_Loc = data_Loc(:,19);
datalon_Loc = data_Loc(:,20);

% Acceptable PM2.5
[C, ia,ic] = unique(data_Acc(:,2));
DupIndex = setdiff(1:size(data_Acc(:,2)), ia);
data_Acc(DupIndex,:) = [];

datalat_Acc = data_Acc(:,19);
datalon_Acc = data_Acc(:,20);

%% Plot map
latlim = [39 47];
lonlim = [-81 -70];
figure('Color','w');

% Plot for Acceptable PM2.5
subplot(1,2,1)

usamap('New York'); % 'Vermont', 'Massachusetts', 'Rhode Island', 'Connecticut', 'New Jersey', 'Pennsylvania', 'Delaware', 'Maryland')
shi = shaperead('usastatehi', 'UseGeoCoords', true,...
            'Selector',{@(name) strcmpi(name,'New York'), 'Name'});
geoshow(shi, 'FaceColor', [0.3 1.0, 0.675])
textm(shi.LabelLat, shi.LabelLon, shi.Name, 'HorizontalAlignment', 'center')

[row,col] = size(datalat_Acc);
nb_point = row;
LAT = str2double(datalat_Acc);
LON = str2double(datalon_Acc);
h = geoshow(LAT, LON, 'DisplayType', 'Point', 'Marker', '*', 'Color', 'red');
textm(LAT, LON,(data_Acc(:,2))', 'FontSize',8)
title('PM2.5 Sites in New York State in 2012 - Acceptable PM2.5 AQI & Speciation Mass');

hold all

% Plot for Local Conditions
subplot(1,2,2)

% figure('Color','w');
usamap('New York'); % 'Vermont', 'Massachusetts', 'Rhode Island', 'Connecticut', 'New Jersey', 'Pennsylvania', 'Delaware', 'Maryland')
shi = shaperead('usastatehi', 'UseGeoCoords', true,...
            'Selector',{@(name) strcmpi(name,'New York'), 'Name'});
geoshow(shi, 'FaceColor', [0.3 1.0, 0.675])
textm(shi.LabelLat, shi.LabelLon, shi.Name, 'HorizontalAlignment', 'center')

[row,col] = size(datalat_Loc);
nb_point = row;
LAT = str2double(datalat_Loc);
LON = str2double(datalon_Loc);
h = geoshow(LAT, LON, 'DisplayType', 'Point', 'Marker', '+', 'Color', 'red');
textm(LAT, LON,(data_Loc(:,2))', 'FontSize',5)
title('PM2.5 Sites in New York State in 2012 - Local Conditions');

したがって、問題はtextm、ラベルを重ねてプロットするスクリプトの部分にあります。

ここに 2 つのサブプロットがあります。 ご覧のとおり、点が多い部分は黒い塊です

4

1 に答える 1

2

あなたのコードはそのままでは実行されず、datalat_Acc なしでハングアップします。それがそれらのファイルの1つにあったかどうかはわかりません。ただし、この問題は、テキスト ラベルを作成しながら反復処理を行い、その位置を動的に変更することで解決できます。最初のラベルを書き出し、そのラベルの位置を取得し、2 番目のラベルの位置をその少し下に設定します。次に、その 2 番目のラベルの位置を取得し、それを使用して 3 番目のラベルを調整します。これらの位置を使用して、ラベルとマップ ポイントの間に線を引くこともできます。この例では、すべて同じ場所を指していますが、これをコードに合わせれば変更できます。

clf
hold on
plot(peaks)
h=text(5,8,'label1', 'FontSize',8);
posh=get(h,'position');

for i=1:5
    h2=text(posh(1),posh(2)-0.5,['label',num2str(i+1)], 'FontSize',8);
    posh=get(h2,'position');

    plot([posh(1) 0],[posh(2) 7])
end

それらすべてを反復せずにこれを行う方法があると確信していますが、これが最も簡単に書くことができると思いました。

于 2013-10-11T21:15:44.370 に答える