Pytorch-Geometric

I’m new to Pytorch-geometric, and geometric deep learning. I’m trying to visualize the datasets available in pytorch-geometric, but couldn’t find anything to do so.

How do I visualize these graph datasets. Is there provision to do so in pytorch-geometric? How else can we visualize this ?

1 Like
from torch_geometric.datasets import KarateClub
dataset = KarateClub()

for i in dataset[0]:
  print(i)
# this torch.geometric.datasets object comprises of edge(edge information for each node), x(nodes) and y(labels for each node)

edge,x,y = dataset[0]
numpyx = x[1].numpy()
numpyy = y[1].numpy()
numpyedge = edge[1].numpy()

import networkx as nx

g = nx.Graph(numpyx)

name,edgeinfo = edge

src = edgeinfo[0].numpy()
dst = edgeinfo[1].numpy()
edgelist = zip(src,dst)

for i,j in edgelist:
  g.add_edge(i,j) 

nx.draw_networkx(g)

Hi,
What is nx here? Is it networkx library?

Yes. My apologies. I’ve now modified the code to include the import line.

No problem, Good luck.

Actually… there’s an even better way. PyG has something in-built to convert the graph datasets to a networkx graph.

import networkx as nx
import torch
import numpy as np
import pandas as pd
from torch_geometric.datasets import Planetoid
from torch_geometric.utils.convert import to_networkx

dataset1 = Planetoid(root = '/content/cora',name='Cora')

cora = dataset1 [0]

coragraph = to_networkx(cora)

node_labels = cora.y[list(coragraph.nodes)].numpy()

import matplotlib.pyplot as plt
plt.figure(1,figsize=(14,12)) 
nx.draw(coragraph, cmap=plt.get_cmap('Set1'),node_color = node_labels,node_size=75,linewidths=6)
plt.show()

3 Likes

Hello all! I am also new in PyG… I am trying to import the dataset using Colab but following your instructions outputs an error: module ‘community’ has no attribute ‘best_partition’. Do you know why this could be happening? Thanks for the help!!

from torch_geometric.datasets import KarateClub

dataset = KarateClub()
AttributeError: module ‘community’ has no attribute ‘best_partition’

For future issues, python-louvain already installs networkx package. Therefore, if the previous error appears uninstall both libraries and install back only python-louvain.

this is impler:

import networkx as nx

edge_index = torch.tensor([[0, 1, 1, 2],
                           [1, 0, 2, 1]], dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)

data = torch_geometric.data.Data(x=x, edge_index=edge_index)
g = torch_geometric.utils.to_networkx(data, to_undirected=True)
nx.draw(g)

you need matplot lib installed too do conda install -y matplotlib.

I tried with enzyme datset in the same way but i didnt get and i tried in this way and it is giving error: please help:


def convert_to_networkx(graph, n_sample=None):
   
    g = to_networkx(graph, node_attrs=["x"])
    y = graph.y.numpy()
    if n_sample is not None:
        if n_sample >= len(g.nodes):
            # If n_sample is larger or equal to the number of nodes, use all nodes
            sampled_nodes = list(g.nodes)
        else:
            # Sample n_sample nodes from the graph
            sampled_nodes = random.sample(list(g.nodes), n_sample)

        g = g.subgraph(sampled_nodes)
        y = y[sampled_nodes]

    return g, y


def plot_graph(g, y):

    plt.figure(figsize=(9, 7))
    nx.draw_spring(g, node_size=30, arrows=False, node_color=y)
    plt.show() 
from torch_geometric.datasets import TUDataset
import random

# Load the Enzymes dataset
dataset = TUDataset(root='/path/to/your/dataset', name='ENZYMES')

# Check the total number of graphs in the dataset
num_graphs_in_dataset = len(dataset)

# Define the number of graphs you want to visualize (e.g., 5 random graphs)
num_graphs_to_visualize = 5

# Ensure you don't sample more graphs than are available in the dataset
if num_graphs_to_visualize > num_graphs_in_dataset:
    num_graphs_to_visualize = num_graphs_in_dataset

# Create a list of unique indices to select random graphs
random_graph_indices = random.sample(range(num_graphs_in_dataset), num_graphs_to_visualize)

# Iterate through the selected graphs
for i in random_graph_indices:
    g, y = convert_to_networkx(dataset[i], n_sample=1000)  # You can adjust n_sample as needed
    plot_graph(g, y)

I am getting error:

Untitled-2.ipynb Cell 4 line 2
     22 for i in random_graph_indices:
     23     print("i=",i )
---> 24     g, y = convert_to_networkx(dataset[i], n_sample=1000)  # You can adjust n_sample as needed
     25     plot_graph(g, y)

Untitled-2.ipynb Cell 4 line 4
     37         sampled_nodes = random.sample(list(g.nodes), n_sample)
     39     g = g.subgraph(sampled_nodes)
---> 40     y = y[sampled_nodes]
     42 return g, y

IndexError: index 1 is out of bounds for axis 0 with size 1

Please help me !! thanks in advance