spacenet.point_patterns.cross_pair_correlation_function#

spacenet.point_patterns.cross_pair_correlation_function(spatial_network, nodes_a=None, nodes_b=None, spatial_kernel_bandwidth=10, spatial_kernel_n=2, r_min=0, r_max=100, r_step=10, edge_weight_name='Distance', return_confidence_interval=False, low_memory=False, verbose=True, n_jobs=1)#

Computes the pair correlation function (PCF) or cross-pair correlation function (cross-PCF) for nodes in a spatial network.

The PCF is computed when nodes_a and nodes_b refer to the same set of nodes, and quantifies spatial dependence within a single node population.

The cross-PCF is computed when nodes_a and nodes_b refer to different node populations, and quantifies spatial dependence between those populations.

Parameters:
spatial_networknetworkx.Graph

The spatial network on which to compute the pair correlation function. Edges should have a weight attribute corresponding to the distance between nodes.

nodes_aarray-like, optional

The indices of the nodes in population A. If None, all nodes in the network will be considered as part of population A. Default is None.

nodes_barray-like, optional

The indices of the nodes in population B. If None, all nodes in the network will be considered as part of population B. Default is None.

spatial_kernel_bandwidthfloat, optional

The bandwidth parameter for the spatial kernel function. This controls the smoothness of the pair correlation function. Default is 10.

spatial_kernel_nint, optional

The exponent parameter for the spatial kernel function. This controls the shape of the kernel. Default is 2 (which corresponds to Epanechnikov).

r_minfloat, optional

The minimum distance to consider when computing the pair correlation function. Default is 0.

r_maxfloat, optional

The maximum distance to consider when computing the pair correlation function. Default is 100.

r_stepfloat, optional

The step size for the distance bins when computing the pair correlation function. Default is 10.

edge_weight_namestr, optional

The name of the edge attribute in the network that corresponds to the distance between nodes. Default is ‘Distance’.

low_memorybool, optional

Whether to use a low-memory implementation of Dijkstra’s algorithm that computes distances in batches. This can be useful for large networks that do not fit in memory. Default is False.

verbosebool, optional

Whether to print progress messages during computation. Default is True.

n_jobsint, optional

The number of parallel jobs to run when computing contributions. If n_jobs > 1, the contributions will be computed in parallel across multiple CPU cores. Default is 1 (no parallelization).

Returns:
radiinumpy.ndarray

The radii at which the pair correlation function was computed.

gnumpy.ndarray

The values of the pair correlation function at the corresponding radii.

confidence_intervalnumpy.ndarray (if return_confidence_interval is True)

If return_confidence_interval is True, this will be a numpy array (2,n) containing the confidence intervals for the pair correlation function at each radius. The first row corresponds to the lower bounds of the confidence intervals, and the second row corresponds to the upper bounds. If return_confidence_interval is False, this will not be returned.

Notes

For more information, see the reference paper:

Moore et al. (2026). netPCF: Geometry-aware Pair Correlation Functions for Spatial Biology. DOI: https://doi.org/10.64898/2026.07.02.736020

Examples

Computing the pair correlation function for a single population of nodes:

import spacenet as sn
import matplotlib.pyplot as plt 

# get data from the Spiral dataset
sprial_df = sn.datasets.load_dataset('spiral')
points = sprial_df[['x','y']].values

# generate a spatial network using the delaunay method
G = sn.utils.spatial_network_from_points(points,network_type='delaunay',max_edge_distance=75)

# compute the PCF for the spatial network over all nodes
radius,pcf_values,con_interval = sn.point_patterns.cross_pair_correlation_function(G,spatial_kernel_bandwidth=80,r_max=1000,return_confidence_interval=True)

# plot the PCF
fig,ax=plt.subplots()
ax.axhline(1,linestyle='dashed',color='grey')
ax.plot(radius,pcf_values)
ax.fill_between(radius,con_interval[0],con_interval[1],alpha=0.2)
ax.set_xlabel('Radius')
ax.set_ylabel('Pair Correlation')
ax.set_ylim(0,2)  

Computing the cross pair correlation function for a two populations of nodes:

import spacenet as sn
import matplotlib.pyplot as plt 

# get data from the Spiral dataset
sprial_df = sn.datasets.load_dataset('spiral')
points = sprial_df[['x','y']].values
categorical_labels = sprial_df['Marker (categorical)'].values

# generate a spatial network using the delaunay method and add labels
G = sn.utils.spatial_network_from_points(points,network_type='delaunay',max_edge_distance=75)
sn.utils.add_node_labels(G,categorical_labels,node_label_name='Marker (categorical)')

# get the node ids for the two categories
nodes_a = sn.utils.query_nodes(G,node_label_name='Marker (categorical)',relation='is',node_label_value='A')
nodes_b = sn.utils.query_nodes(G,node_label_name='Marker (categorical)',relation='is',node_label_value='B') 

# compute the cross-PCF for the spatial network between nodes_a and nodes_b
radius,pcf_values,con_interval = sn.point_patterns.cross_pair_correlation_function(G,nodes_a=nodes_a,nodes_b=nodes_b,spatial_kernel_bandwidth=80,r_max=1000,return_confidence_interval=True)

# plot the PCF
fig,ax=plt.subplots()
ax.axhline(1,linestyle='dashed',color='grey')
ax.plot(radius,pcf_values)
ax.fill_between(radius,con_interval[0],con_interval[1],alpha=0.2)
ax.set_xlabel('Radius')
ax.set_ylabel('Pair Correlation')
ax.set_ylim(0,3)