이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
How to grid data with coordinates to create a spatial plot using geoshow
조회 수: 10 (최근 30일)
이전 댓글 표시
Ronnie
2017년 8월 31일
I have 3 vectors: data, lat, lon which I am trying to plot spatially for the continental US. Is there a function where I can organize my lat and lon vectors in the appropriate gridded format which geoshow will plot properly while ensuring the data vector is organized in the same fashion so the data points remain with their respective coordinates?
채택된 답변
Chad Greene
2017년 8월 31일
Is it possible that your data vectors are in fact regular, but simply not in gridded format? To check, try
scatterm(lat,lon,20,data)
[LON,LAT,DATA] = xyz2grid(lon,lat,data);
where lowercase are your data vectors and upper case are gridded. Then you can do
pcolorm(LAT,LON,DATA)
댓글 수: 13
Ronnie Abolafia-Rosenzweig
2017년 9월 1일
unfortunately the data vectors are not regular; the scatterm function produced an error when running the program
Chad Greene
2017년 9월 1일
That means a map hasn't been initialized. Try
worldmap([min(lat) max(lat)],[min(lon) max(lon)])
scatterm(lat,lon,20,data)
Ronnie
2017년 9월 5일
Thank you! This is working very well. I see the 20 denotes the area of each marker; do you know what units this is in? (i.e. if each point is symbolic of a 20 km x 20 km grid cell should I use 20?)
Chad Greene
2017년 9월 5일
The 20 isn't really units of real-world space. Rather, it's more like the number of pixels it takes up on your screen.
The scatterm suggestion was just to check whether your data correspond to a regular grid. Do the circles produced by scatterm make a gridded pattern? If yes, I recommend
% Grid the data:
[LON,LAT,DATA] = xyz2grid(lon,lat,data);
% Initialize a map:
worldmap([min(lat) max(lat)],[min(lon) max(lon)])
% plot the gridded data:
pcolorm(LAT,LON)
shading interp
Ronnie
2017년 9월 5일
편집: Walter Roberson
2017년 9월 6일
I see what you are saying. Unfortunately my arrays are too large for the xyz2grid function to work. I am getting the following error message:
Error using accumarray
Requested 3857x5166498 (148.5GB) array exceeds maximum array size preference. Creation of
arrays greater than this limit may take a long time and cause MATLAB to become
unresponsive. See array size limit or preference panel for more information.
Error in xyz2grid (line 92)
Z = accumarray([yi xi],z(:),[],[],NaN);
Error in Monthly_Average_Function (line 85)
[X,Y,Z] = xyz2grid(double(Z),double(lon),double(lat));
I went into my preferences to uncheck the box that limits the array size limit to RAM; however once I did this MATLAB just shuts down. Do you have any suggestions on this issue?
Chad Greene
2017년 9월 6일
Oh wow, that's a lot of data points. I haven't downloaded the data you shared, but from KSSV's comment it looks like he found a lot of data points you can get rid of. If it's true, perhaps you can follow his suggestion
%%remove -9999
data(lon==-9999) = [] ;
lon(lon==-9999) = [] ;
lat(lat==-9999) = [] ;
And then use xyz2grid.
Walter Roberson
2017년 9월 6일
편집: Walter Roberson
2017년 9월 6일
pcolor and scatterm are quite different purposes.
pcolor does a surface plot of a data grid -- it is surf() followed by view(2). pcolor of an N x M data grid produces (N-1) x (M-1) faces with the colors being interpolated by adjacent data points.
scatterm does a 2D scatter plot on a mapping axes, putting a marker at each location specified.
In answer to your earlier question, the area of the marker, such as 20, is in "points squared" where 1 point is 1/72 of an inch. In the case of circular markers, for size S, you would take R = sqrt(S/pi) to get the radius of the circle, in points. This size is used for the marker no matter how far in or out you zoom, so it does not reflect any particular data units.
Ronnie
2017년 9월 6일
Thank you, Chad and Walter. I greatly appreciate your insights and I will move forward and utilize this knowledge.
Best, -Ronnie
Ronnie
2017년 9월 6일
Update: I got it to work by trimming down the data even further (getting rid of NaN values) and then xyz2grid worked; and I am able to show the data using geoshow. Thank you so much for your help!
추가 답변 (1개)
KSSV
2017년 8월 31일
편집: Chad Greene
2017년 8월 31일
Let data be your nx3 array which has lon, lat and data in the first, second and column respectively.
% Get longitude and latitude vectors
x = unique(data(:,1)) ;
y = unique(data(:,2)) ;
% dimensions of the data
nx = length(x) ;
ny = length(y) ;
% Frame matrix of grid
D = reshape(data(:,3),[ny,nx]) ;
% flip matrix to adjust for plot
H = flipud(H) ;
% Transpose the matrix
H = H' ; % Check if is required
surf(x,y,H) ;
댓글 수: 16
Ronnie Abolafia-Rosenzweig
2017년 8월 31일
In this solution, using the unique function to create latitude and longitude vectors will erase any duplicates of latitude and then any duplicates of longitude. It is okay to have multiple latitude readings, as long as they are paired with different respective longitude readings. I do not want to erase data points from the vectors. Both vecotrs (lat and lon) have already been updated to ensure that there are no duplicate coordinates.
I am seeking for a way to transform vectors in matrices which can be read by the function geoshow.
KSSV
2017년 8월 31일
The above code works..if your data is a structured grid and in (x,y,z) format......if it is unstructured grid, you need to follow the below:
x0 = min(lon) ; x1 = max(lon) ; nx = 100 ;
y0 = min(lat) ; y1 = max(lat) ; ny = 100 ;
x = linspace(x0,x1,nx) ;
y = linspace(y0,y1,ny) ;
[X,Y] = meshgrid(x,y) ;
Z = griddata(lon,lat,data,X,Y)
surf(X,Y,Z)
Ronnie
2017년 8월 31일
My data is not a structured grid. And I cannot use meshgrid for my lat and lon vectors unfortunately because the vector sizes I am using gives me an error saying it is too large to use in meshgrid. I appreciate your help!
Ronnie
2017년 8월 31일
I am also looking to do a 2d plot, thus the surf function will not work, which is why I am trying to use geoshow.
Ronnie Abolafia-Rosenzweig
2017년 9월 1일
I appreciate your help. I will send the data tomorrow once I am back at the computer!
Ronnie
2017년 9월 1일
SMAP_March was the 3-columned matrix with data in column 1 and the data's corresponding lat and lon in columns 2 and 3 respectively.
data=SMAP_March(:,1); lat=SMAP_March(:,2); lon=SMAP_March(:,3);
%Saves a variable as the script file (will replace rest of script file) matlab.io.saveVariablesToScript('DATA.m','data') matlab.io.saveVariablesToScript('LAT.m','lat') matlab.io.saveVariablesToScript('LON.m','lon')
I used the following code to save the 3 vectors I am sending to you (attached).
Ronnie Abolafia-Rosenzweig
2017년 9월 2일
Enjoy the weekend, I will not have access to my computer until Monday as well. :)
Ronnie Abolafia-Rosenzweig
2017년 9월 4일
The site will not allow me to send any files greater than 5 MB, which the lat and data files are. The LON.mat file was bellow the size limit and is attached. Can you please send me an email at ronnie.aggie2016@gmail.com and I will respond with the .mat files. I apologize for the inconvenience
Ronnie Abolafia-Rosenzweig
2017년 9월 5일
편집: KSSV
2017년 9월 6일
It should allow you full access. Thank you
KSSV
2017년 9월 6일
This works....
lon = load('LON.mat') ;
lon = lon.lon ;
lat = load('LAT.mat') ;
lat = lat.lat ;
data = load('DATA.mat') ;
data = data.data ;
%%remove -9999
data(lon==-9999) = [] ;
lon(lon==-9999) = [] ;
lat(lat==-9999) = [] ;
scatter(lon,lat,data,data)
TAPAS
2018년 6월 12일
The code xyz2grid is not working it's showing mistake in line 31 in xyz read and line 72 in in xyz2grid
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom(English)
아시아 태평양
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
