How do I replace NaN values in contourf with another plot?
6 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Jonathan Whiting
el 14 de Oct. de 2016
Comentada: Walter Roberson
el 17 de Oct. de 2016
I am using contourf to plot salinity over a large region. Data only shows over ocean, so I was hoping to show an outline of the shoreline where NaN values appear on the contour. I've created a representative example in the following code:
X=rand(30,60);
X(10:25,10:30) = NaN;
figure();
subplot(2,1,1)
load coast;
lat2=[nan;lat;nan; lat];
long2=[nan;long; nan; long+360];
plot(long2,lat2,'k','linewidth',1)
axis([260 320 0 30]);
subplot(2,1,2)
contourf(X)
This example creates two subplots: the first shows the shorelines, the second shows contours with a hole (due to NaN values). I want to create one plot that shows the filled contours on top with the shorelines peaking through the hole.
I have tried making the NaN values transparent, but wasn't getting anywhere. Any help would be greatly appreciated!
2 comentarios
Star Strider
el 14 de Oct. de 2016
Are you going to share ‘coast’, ‘lat’ and ‘lon’ with us?
Does this require the Mapping Toolbox? If so, please add that in the Product Tags.
Also, your axis call is perplexing, because ‘0’ and ‘30’ as integers can be represented exactly in binary form. No rounding is necessary.
Respuesta aceptada
Walter Roberson
el 15 de Oct. de 2016
You need to reference your data to lat and long. The below code does not assume that the data is spaced in degree increments.
Z = rand(30,60); %numeric arrays use Y for rows and X for columns
long_start = 260; long_end = 320; num_long = size(Z,2);
lat_start = 0; lat_end = 30; num_lat = size(Z,1);
[X, Y] = meshgrid(linspace(long_start,long_end,num_long), linspace(lat_start, lat_end, num_lat));
Z(10:25,10:30) = NaN;
contourf(X, Y, Z);
hold on
load coast;
lat2=[nan;lat;nan; lat];
long2=[nan;long; nan; long+360];
plot(long2,lat2,'k','linewidth',1)
axis([long_start long_end lat_start lat_end])
hold off
The methods would be a little different if you were using contourfm() and plotm() to do the drawing.
2 comentarios
Walter Roberson
el 17 de Oct. de 2016
All of the "high level" functions such as plot() usually clear the axes before drawing, whereas the "low level" functions such as "line" and "text" always add to existing plots. "hold on" mostly says "do not erase what has already been drawn"
The difficulty you were having was that your coordinates were wrong for your contour relative to your plot(). The default coordinates for contour() are the small integers, 1 to the number of rows or columns, whereas you were plotting near 260 . You needed to bring the two into alignment.
Más respuestas (0)
Ver también
Categorías
Más información sobre Contour Plots en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!