Shading Using Patterns in VCS

This notebook shows how to use patterns in vcs.

Pattern can be used with isofill, boxfill, meshfill and fillarea object.

In this notebook we are using primirarly boxfill

The CDAT software was developed by LLNL. This tutorial was written by Charles Doutriaux. This work was performed under the auspices of the U.S. Department of Energy by Lawrence Livermore National Laboratory under Contract DE-AC52-07NA27344.

Download Jupyter Notebook

Prepare Notebook Elements

Back to Top

In [1]:
import requests
r = requests.get("https://uvcdat.llnl.gov/cdat/sample_data/clt.nc",stream=True)
with open("clt.nc","wb") as f:
    for chunk in r.iter_content(chunk_size=1024):
        if chunk:  # filter local_filename keep-alive new chunks
            f.write(chunk)

import cdms2
# and load data
f = cdms2.open("clt.nc")
clt = f("clt",time=slice(0,1),squeeze=1) # Get first month
/software/anaconda53/envs/cdms2/lib/python3.7/site-packages/numpy/ma/core.py:3174: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  dout = self.data[indx]

Create default Graphic Method

Back to Top

In [2]:
import vcs
import cdms2
x=vcs.init(bg=True, geometry=(800,600))
gm = vcs.createboxfill()
gm.boxfill_type = "custom"
In [3]:
# Let's look at the data w/o pattern
x.plot(clt,gm)
Out[3]:

Mask some data

Now let's assume we are only interested in areas where clt is greater than 60% let's shade out areas where clt is < 60%

Back to Top

In [4]:
import MV2
bad = MV2.less(clt,60.).astype("f")

Method 1: Regular Masking

Back to Top

In [5]:
# let's create a second boxfill method 
gm2 = vcs.createboxfill()
gm2.boxfill_type = "custom"
# and a template for it
tmpl2 = vcs.createtemplate()
tmpl2.legend.priority=0
gm2.levels = [[0.5,1.]]  
gm2.fillareacolors = ["black",]
x.plot(bad,gm2,tmpl2)
Out[5]:

Method 2: Using Opacity

Let's use some opacity to "see" what's bellow

Back to Top

In [6]:
gm2.fillareaopacity = [50]
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[6]:

Method 3: Using Patterns

Rather than opacity, we can use patterns, that let us see better what's "underneath"

Back to Top

In [7]:
gm2.fillareastyle = "pattern"
gm2.fillareaindices = [10]
gm2.fillareaopacity = [100]
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[7]:
In [8]:
# we can control the size of patterns
gm2.fillareapixelscale = 2.
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[8]:

Controling Patterns Size

We can make the patterns bigger or smaller, using spacing

Back to Top

In [9]:
# Bigger
gm2.fillareapixelspacing = [20,20]
gm2.fillareapixelscale=None
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[9]:
In [10]:
# or smaller
gm2.fillareapixelspacing = [5,5]
gm2.fillareapixelscale=None
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[10]:

Size and Opacity

We can still add opacity

Back to Top

In [11]:
gm2.fillareaopacity = [25.]
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[11]:

Pattern Color can also be controled

Using hatch rather than pattern we can control the shading color

Back to Top

In [12]:
gm2.fillareaopacity = [100.]
gm2.fillareastyle = "hatch"
gm2.fillareacolors = ["red"]
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[12]:

Patterns legend

Back to Top

In [13]:
# could even have a legend
tmpl2.legend.x1 = .54
tmpl2.legend.x2 = .62
tmpl2.legend.y1 = .885
tmpl2.legend.y2 = .985
tmpl2.legend.priority=0
gm2.legend = {.5:" Bad"}
x.clear()
x.plot(clt,gm)
x.plot(bad,gm2,tmpl2)
Out[13]: