2013-10-11 5 views
0

레이블이있는 점을 찍은지도가 있습니다. 이제 레이블이 서로 인접 해있는 위치에서 레이블이 겹칩니다. 일부 사람들이 textbp (FileExchange)를 제안했지만 셀 배열의 열에서 내 레이블을 가져와 기능이 작동하지 않는다는 것을 알았습니다. 라벨을 모든 라벨이 명확하게 보이도록 포인트에서 충분히 멀리 배치하도록하려면 어떻게해야합니까? 어느 레이블이 어떤 플롯에 대한 것인지 명확하지 않은 경우 화살표를 추가 할 수 있습니까?MATLAB지도에서 텍스트가 겹치지 않도록하십시오.

데이터는 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 부분이다. 귀하의 코드를 그대로 실행되지 않습니다

Here are the two subplots. As you can see, the parts where there are a lot of points are a mass of black

답변

2

는 datalat_Acc없이 달려 있습니다. 그 파일 중 하나에 있는지 없는지 모르겠습니다. 그러나 텍스트 레이블을 만들고 동적으로 위치를 변경하면서이 문제를 반복적으로 해결할 수 있습니다. 첫 번째 레이블을 작성하고 해당 레이블의 위치를 ​​얻은 다음 두 번째 레이블의 위치를 ​​약간 아래로 설정하십시오. 그런 다음 두 번째 레이블의 위치를 ​​가져 와서 세 번째 레이블을 조정하는 등의 작업을 수행합니다. 또한 해당 위치를 사용하여 레이블과 맵 지점 사이에 선을 그릴 수 있습니다. 이 예에서는 모두 같은 위치를 가리키고 있지만 코드에 맞게 조정하면 변경할 수 있습니다.

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 

내가 그들 모두를 반복하지 않고 할 수있는 방법이 있는지,하지만이 작성하는 가장 쉬운 방법으로 마음에 온 것입니다.

+0

제안한 방법을 이해하는 데 문제가 있습니다. 나는 일반적으로 코딩하기가 아주 쉽다. 누락 된 부분을 포함하도록 위 스크립트를 업데이트했습니다. 이제 실행해야합니다. 좀 봐 줄래? 그것은 나의 특별한 경우에 더 관련이있는 무언가를 가지고 있다는 것을 알아내는 데 도움이 될 것입니다. – shizishan

+0

그럼 read_mixed_csv() 없이는 실행되지 않습니다. 그러나 당신은 여전히 ​​나의 모범을 적용 할 수 있어야합니다. get (h, 'position') 함수는 텍스트 레이블의 배열 [x 좌표 y 좌표 z 좌표]를 반환합니다. 따라서 x 및 y 대신 textm() 함수에서 LAT 및 LON 값을 사용하고 있습니다. 먼저 텍스트 (LAT, LON ...) 함수를 for 루프로 변경해야합니다. 그러면 LAT 및 LON을 위치 (1 및 2)로 바꿀 수 있습니다. 루프에서 textm() 레이블을 배치 할 때마다 lat (i) = lat (i-1) - # 도의 lat 값을 사용하면 이전 레이블 아래의 #degrees만큼 레이블을 이동합니다. – jmolaro

+0

나는 그것을 시도해보고 잘하면, 그것을 작동시킬 수있을 것이다. 폴더에 read_mixed_csv를 추가했습니다. Stackoverflow 질문에 대한 답변으로 게시 한 사람이 작성 했으므로 잊어 버렸습니다. – shizishan