Skip to content

Event composite with significance

Event composite with significance

A synthetic monthly NDVI cube (2001–2020, 60 × 80 pixels of 1 km) with a seasonal cycle, a greening trend of 0.05 per decade, noise, and eight two-month hot-dry events. During each event NDVI drops by 0.03 in the west to 0.08 in the east, and by half that in the three months after. With eight events the t-test across events marks the response: dots where at least half of the pixels in a 1.6 mm cell are significant (p < 0.05); the per-pixel tests are not adjusted for multiple comparisons. The per-pixel linear trend is removed before the monthly climatology, so the late events are not made to look milder by the greening. Synthetic data.

Script PDF PNG, 600 dpi

import numpy as np
import pandas as pd
import rioxarray  # noqa: F401  (adds the .rio accessor)
import xarray as xr

import eofigs

rng = np.random.default_rng(3)
time = pd.date_range("2001-01-01", "2020-12-01", freq="MS")
ny, nx = 60, 80
years = (time - time[0]).days.to_numpy() / 365.2425
season = 0.15 * np.sin(2 * np.pi * (time.month.to_numpy() - 4) / 12)
east = np.linspace(0, 1, nx)[None, :] * np.ones((ny, 1))
values = (
    0.45
    + season[:, None, None]
    + 0.005 * years[:, None, None]
    + rng.normal(0, 0.02, (time.size, ny, nx))
)
starts = ["2002-06", "2004-07", "2007-05", "2009-08", "2012-06", "2014-07", "2017-06", "2019-05"]
events = []
for start in starts:
    i = time.get_loc(pd.Timestamp(f"{start}-01"))
    values[i : i + 2] -= 0.03 + 0.05 * east
    values[i + 2 : i + 5] -= 0.5 * (0.03 + 0.05 * east)
    events.append((time[i], time[i + 1]))
cube = xr.DataArray(
    values,
    dims=("time", "y", "x"),
    coords={
        "time": time,
        "y": 3_900_000 - (np.arange(ny) + 0.5) * 1000,
        "x": 750_000 + (np.arange(nx) + 0.5) * 1000,
    },
    name="ndvi",
    attrs={"long_name": "NDVI", "units": "1"},
).rio.write_crs("EPSG:32643")

eofigs.set_style("elsevier")
fig = eofigs.event_composite(cube, events, event_rule="eight synthetic two-month events")

if __name__ == "__main__":
    print(fig.eofigs_layout["caption"])
    print(eofigs.save_figure(fig, "event_composite_synthetic"))
Figure check
Figure check (elsevier): passed
  PASS  size: 190.0 x 122.6 mm (double width).
  PASS  resolution: 600 dpi (at least 500 for figures with text and images).
  PASS  font size: Smallest text 7 pt (minimum 7 pt).
  PASS  fonts: Fonts in use: Arial.
  PASS  colour-blind safety: 5 categorical colours, all distinguishable.
  PASS  colour maps: Colour maps: eofigs.terra_slate (diverging).