"""
Visualization utilities for Graphem.
"""
import numpy as np
import pandas as pd
import plotly.express as px
from scipy import stats
[docs]
def report_corr(name, radii, centrality, alpha=0.025):
"""
Calculate and report the correlation between radial distances and a centrality measure.
Parameters:
name: str
Name of the centrality measure
radii: array-like
Radial distances from origin
centrality: array-like
Centrality values
alpha: float
Alpha level for confidence interval
Returns:
tuple: (correlation coefficient, p-value)
"""
# Calculate Spearman's rank correlation
rho, p_value = stats.spearmanr(radii, centrality)
# Calculate bootstrap confidence interval
n = len(radii)
reps = 1000
bootstrap_corrs = []
for _ in range(reps):
indices = np.random.choice(n, n, replace=True)
r_sample = radii[indices]
c_sample = centrality[indices]
rho_boot, _ = stats.spearmanr(r_sample, c_sample)
bootstrap_corrs.append(rho_boot)
# Calculate confidence interval
ci_low = np.percentile(bootstrap_corrs, 100 * alpha)
ci_high = np.percentile(bootstrap_corrs, 100 * (1 - alpha))
print(f"{name:15s}: rho = {rho:.3f} (95% CI: [{ci_low:.3f}, {ci_high:.3f}]), p = {p_value:.6f}")
return rho, p_value
[docs]
def report_full_correlation_matrix(radii, deg, btw, eig, pr, clo, nload, alpha=0.025):
"""
Calculate and report correlations between radial distances and various centrality measures.
Parameters:
radii: array-like
Radial distances from origin
deg, btw, eig, pr, clo, edge_btw: array-like
Various centrality measures
alpha: float
Alpha level for confidence interval
Returns:
pandas.DataFrame: Correlation matrix
"""
# Create a DataFrame with all measures
df = pd.DataFrame({
'Radius': radii,
'Degree': deg,
'Betweenness': btw,
'Eigenvector': eig,
'PageRank': pr,
'Closeness': clo,
'Node Load': nload
})
# Calculate correlation matrix
corr_matrix = df.corr(method='spearman')
# Print correlations with radii
print("Correlations with radial distance:")
report_corr("Degree", radii, deg, alpha)
report_corr("Betweenness", radii, btw, alpha)
report_corr("Eigenvector", radii, eig, alpha)
report_corr("PageRank", radii, pr, alpha)
report_corr("Closeness", radii, clo, alpha)
report_corr("Node Load", radii, nload, alpha)
return corr_matrix
[docs]
def plot_radial_vs_centrality(radii, centralities, names):
"""
Plot scatter plots of radial distances vs. various centrality measures.
Parameters:
radii: array-like
Radial distances from origin
centralities: list of array-like
List of centrality measures
names: list of str
Names of the centrality measures
"""
# Create figure with subplots
fig = px.scatter(
pd.DataFrame({
'Radial Distance': np.tile(radii, len(names)),
'Centrality Value': np.concatenate(centralities),
'Centrality Measure': np.repeat(names, len(radii))
}),
x='Radial Distance',
y='Centrality Value',
facet_col='Centrality Measure',
facet_col_wrap=3,
trendline='ols',
title='Correlation between Radial Distance and Centrality Measures'
)
# Update layout
fig.update_layout(
height=800,
width=1000
)
# Show figure
fig.show()
[docs]
def display_benchmark_results(benchmark_results):
"""
Display benchmark results in a nicely formatted table.
Parameters:
benchmark_results: list of dict
List of benchmark result dictionaries
"""
# Convert to DataFrame
df = pd.DataFrame(benchmark_results)
# Reorder columns for better readability
columns = [
'graph_type', 'n', 'm', 'dim', 'seed_method',
'influence', 'normalized_influence', 'time',
'layout_time', 'selection_time', 'evaluation_time'
]
df = df[[col for col in columns if col in df.columns]]
# Display the DataFrame
return df