Visualization¶
The radport accessor provides comprehensive visualization methods for OVRO-LWA
data.
For an introduction to plotting, refer to the Basic Plotting guide.
Cutout Visualization¶
Extract and visualize regions of interest:
# Create cutout around a region
cutout = ds.radport.cutout(
l_min=-0.3, l_max=0.3,
m_min=-0.3, m_max=0.3,
time_min=0, time_max=10,
freq_min=5, freq_max=15
)
# Plot the cutout
cutout.radport.plot_cutout(
time_idx=0,
freq_idx=0,
show_box=True # Show original region boundaries
)
Time-Frequency Visualizations¶
Dynamic Spectrum¶
Visualize temporal evolution at a specific spatial location:
# Extract dynamic spectrum
dyn_spec = ds.radport.dynamic_spectrum(l_idx=512, m_idx=512)
# Plot it
ds.radport.plot_dynamic_spectrum(
dyn_spec,
cmap='plasma',
aspect='auto',
interpolation='nearest'
)
For spatial regions:
# Average over a region
dyn_spec_region = ds.radport.dynamic_spectrum(
l_min=500, l_max=524,
m_min=500, m_max=524
)
Difference Plots¶
Visualize changes between time steps or frequencies:
# Time difference
diff_time = ds.radport.diff(dim='time', n=1)
ds.radport.plot_diff(diff_time, freq_idx=10)
# Frequency difference
diff_freq = ds.radport.diff(dim='frequency', n=1)
ds.radport.plot_diff(diff_freq, time_idx=0)
Light Curves and Spectra¶
Light Curves¶
Track intensity over time:
# Single pixel: resolve indices to l, m, then plot (kwargs go to ``plt.plot``)
l_idx, m_idx = 512, 512
l_val = float(ds.coords["l"].values[l_idx])
m_val = float(ds.coords["m"].values[m_idx])
fig = ds.radport.plot_light_curve(l=l_val, m=m_val, label="Source A")
# Multiple sources on one Axes: plot_light_curve always creates its own Figure,
# so call light_curve and use Matplotlib for overlays
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 6))
for l_i, m_i, label in [(512, 512, "Source A"), (600, 600, "Source B")]:
l_v = float(ds.coords["l"].values[l_i])
m_v = float(ds.coords["m"].values[m_i])
lc = ds.radport.light_curve(l=l_v, m=m_v)
ax.plot(lc.coords["time"], lc.values, marker="o", linestyle="-", label=label)
ax.set_xlabel("Time (MJD)")
ax.set_ylabel("SKY Intensity (Jy/beam)")
ax.legend()
plt.show()
Frequency Spectra¶
# Spectrum at a location
spec = ds.radport.spectrum(l_idx=512, m_idx=512)
ds.radport.plot_spectrum(spec)
# Spatially averaged spectrum
spec_avg = ds.radport.spectrum()
ds.radport.plot_spectrum(spec_avg, label='Average')
Grid Plots¶
Time Grid¶
Plot multiple time steps side-by-side:
# Grid of 4 time steps
ds.radport.plot_time_grid(
freq_idx=10,
time_indices=[0, 5, 10, 15],
ncols=2,
figsize=(12, 10),
cmap='inferno'
)
Frequency Grid¶
Plot multiple frequencies:
# Grid of 4 frequencies
ds.radport.plot_frequency_grid(
time_idx=0,
freq_indices=[0, 5, 10, 15],
ncols=2,
figsize=(12, 10)
)
General Grid Plot¶
Maximum flexibility:
# Custom grid configuration
ds.radport.plot_grid(
time_indices=[0, 5, 10],
freq_indices=[0, 10],
nrows=2,
ncols=3,
figsize=(15, 10),
share_colorbar=True
)
Averaged Visualizations¶
Time Average¶
# Average over all time
time_avg = ds.radport.time_average()
ds.radport.plot_time_average(time_avg, freq_idx=10)
# Average over time range
time_avg = ds.radport.time_average(time_min=10, time_max=50)
Frequency Average¶
# Average over all frequencies
freq_avg = ds.radport.frequency_average()
ds.radport.plot_frequency_average(freq_avg, time_idx=0)
# Average over frequency range
freq_avg = ds.radport.frequency_average(freq_min=5, freq_max=15)
Advanced Customization¶
Custom Colormaps¶
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
# Log scale with custom colormap
ds.radport.plot(
time_idx=0,
freq_idx=10,
cmap='magma',
norm='log',
vmin=1e-3,
vmax=1e2
)
Multiple Panels¶
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# Plot different frequencies
for ax, freq_idx in zip(axes, [0, 5, 10]):
ds.radport.plot(time_idx=0, freq_idx=freq_idx, ax=ax)
ax.set_title(f'Frequency index: {freq_idx}')
plt.tight_layout()
plt.show()
Overlaying Contours¶
import matplotlib.pyplot as plt
# Base image
ds.radport.plot(time_idx=0, freq_idx=10)
# Overlay contours
ax = plt.gca()
data = ds['SKY'].isel(time=0, frequency=10).values
ax.contour(data, colors='white', alpha=0.5, levels=5)
plt.show()
Validation Tools¶
Finding Valid Frames¶
Find frames without NaN values:
# Find first valid frame
valid_idx = ds.radport.find_valid_frame(freq_idx=10)
ds.radport.plot(time_idx=valid_idx, freq_idx=10)
Finite Fraction¶
Check data quality:
# Get fraction of finite values
fraction = ds.radport.finite_fraction(time_idx=0, freq_idx=10)
print(f"Valid data: {fraction*100:.1f}%")
Next Steps¶
- Learn about animations
- Explore WCS coordinate plotting
- Try spectral analysis
- See the API reference