Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set mask for matplotlib tricontourf

I have some numpy array containing data that I would visualize on a 2D grid. Some of the data is unphysical and I would like to mask this data. However, I could not figure out how to set the mask attribute of tricontour correctly. I tried:

import matplotlib.pyplot as mp
import numpy as np

with open('some_data.dat', 'r') as infile:
        x, y, z = np.loadtxt(infile, usecols=(0, 1, 2), unpack=True)
isbad = np.less(z, 1.4) | np.greater(z, 2.1)
mp.tricontourf(x, y, z, mask = isbad)

But the resulting figure is simply not masked. I tried masking part of a contourf plot in matplotlib, i.e.

z2 = np.ma.array(z, mask= isbad)
mp.tricontourf(x, y, z2)

which did not work either. I want to use tricontourf instrad of contourf, because I do not want to grid my data.

z[isbad] = np.nan

results in a Segmentation fault when calling tricontourf

Here's the figure, the red colours are the ones I would like to mark as unphysical.A coloured contour plot with an overshooting color axis, due to unphysical data

like image 818
wsj Avatar asked Oct 31 '22 08:10

wsj


1 Answers

Here comes the trick. I need to collect the indices of triangles (which are indices into z!), evaluate whether they are good or not and then accept only the triangles for that at least one corner is valid (reducing the dimension from (ntri, 3) to ntri

triang = tr.Triangulation(x, y)
mask = np.all(np.where(isbad[triang.triangles], True, False), axis=1)
triang.set_mask(mask)
colplt = mp.tricontourf(triang, z)
mp.colorbar()

Inspired by this link: http://matplotlib.org/examples/pylab_examples/tripcolor_demo.html

Coloured contour plot with maksed unphysical region

like image 65
wsj Avatar answered Nov 08 '22 10:11

wsj