PYTHON
RESEAUX SOCIAUX

Introduction

Objectifs de ce TP :

Le réseau social étudié se compose :

Les relations d'amitié du réseau social peuvent se définir en Python avec une liste à deux dimensions. Exemple :

arete=[['Paul', 'Liza'], ['Paul', 'Marc'], ... ]

Ou, présenté différemment :

arete=[]
arete.append(['Paul', 'Liza'])
arete.append(['Paul', 'Marc'])
...

Expérimenter

Manipuler une liste à deux dimensions

Testez et étudiez le code ci-dessous :

# Définition des relations d'amitié
arete=[['Paul', 'Liza'], ['Sara', 'Marc'], ['Jade', 'Luc']]

print(arete[1], arete[1][0], arete[1][1])

print("Boucle sur chaque élément de la liste :")
for i in range(len(arete)):
  print(arete[i], arete[i][0], arete[i][1])

print("Variante produisant le même résultat :")
for i in arete:
  print(i, i[0], i[1])

Quelques caractéristiques du réseau social

Testez et étudiez les trois fonctions du code ci-dessous :

# Définition des relations d'amitié
arete=[['Paul', 'Liza'], ['Paul', 'Marc'], ['Paul', 'Sara'], ['Sara', 'Marc']]

def nb_aretes(l):
  return len(l)

def liste_sommets(l):
  n=[]
  for i in l:
    n.append(i[0])
    n.append(i[1])
  return list(set(n)) # enlève les doublons

def nb_sommets(l):
  return len(liste_sommets(l))

print(nb_aretes(arete))
print(liste_sommets(arete))
print(nb_sommets(arete))

Représentation graphique d'une arête et deux sommets

Testez et étudiez le code ci-dessous :

import matplotlib.pyplot as plt

# Définition de la relation d'amitié
arete=[['Paul', 'Liza']]

# Positions des sommets
x=[0,1]
y=[0,1]

# Dessin de l'arête et des cercles
plt.plot(x, y, linewidth=2, color='#00aa00', marker='o', markersize=24,
markerfacecolor='#ffbbbb', markeredgecolor='#bb8888')

# Ecritures sur les cercles
for i in range(2):
  plt.text(x[i], y[i], arete[0][i], size='15', color='#442200',
  horizontalalignment='center', verticalalignment='center')

plt.axis('off')
plt.show()

Tableau explicatif :

MéthodeParamètreDescription
plt.plot()linewidth=2Largeur du segment en pixels
color='#00aa00'Couleur du segment
markersize=24Diamètre du marqueur en pixels
markerfacecolor='#ffbbbb'Couleur du marqueur
markeredgecolor='#bb8888'Couleur de la bordure du marqueur
plt.text()size='15'Hauteur du texte en pixels
color='#442200'Couleur du texte
horizontalalignment='center'Alignement horizontal par rapport au point d'insersion
verticalalignment='center'Alignement vertical par rapport au point d'insersion

Résultat :

Programmer

Autre caractéristique du réseau social

Complétez la fonction nb_amis() qui retourne le nombre d'amis pour une personne du réseau social.

# Définition des relations d'amitié
arete=[['Paul', 'Liza'], ['Paul', 'Marc'], ['Paul', 'Sara'], ['Sara', 'Marc']]

def nb_amis(nom):
  ...
  return ...

print(nb_amis('Paul'))
print(nb_amis('Sara'))

Représentation graphique complète

Complétez le code ci-dessous :

import matplotlib.pyplot as plt

# Définition des relations d'amitié
arete=[['Paul', 'Liza'], ['Paul', 'Marc'], ['Paul', 'Sara'], ['Sara', 'Marc']]

def liste_sommets(l):
  n=[]
  for i in l:
    n.append(i[0])
    n.append(i[1])
  return list(set(n)) # enlève les doublons
  
sommet=liste_sommets(arete)

# Positions des sommets (limités à 8)
x=[0,0,1,1,2,2,3,3]
y=[0,1,0,1,0,1,0,1]

# Dessin des arêtes et des sommets
for i in arete:
  u=[] 
  v=[]
  for j in range(len(sommet)):
    ...
  plt.plot(u, v, linewidth=2, color='#00aa00', marker='o', markersize=24,
  markerfacecolor='#ffbbbb', markeredgecolor='#bb8888')

# Ecritures
for i in range( ... ):
  ...

plt.axis('off')
plt.show()

Résultat :

Pour aller plus loin

Réseau social plus important

Tester le programme précédent avec le réseau social ci-dessous.

...
# Définition des relations d'amitié
arete=[]
arete.append(['Marc', 'Sara'])
arete.append(['Marc', 'Liza'])
arete.append(['Marc', 'Jade'])
arete.append(['Paul', 'Liza'])
arete.append(['Sara', 'Liza'])
arete.append(['Jade', 'Paul'])
arete.append(['Luc', 'Paul'])
...

Sommets positionnés en cercle

Utiliser les fonctions trigonométriques ci-dessous pour positionner les sommets en cercle.

...
# Positionnement des sommets
from math import *
angle=2*pi/len(sommet)
x=[]
y=[]
for i in range(len(sommet)):
  x.append(cos(i*angle))
  y.append(sin(i*angle))
...

Résultat :

Bibliothèque networkx

Utiliser une bibliothèque permet de programmer plus vite, mais en restant limité par les caractéristiques de cette dernière.

from networkx import nx,diameter,radius,center
import matplotlib.pyplot as plt

# Définition des relations d'amitié
reseau_social=nx.Graph()
reseau_social.add_edge('Marc', 'Sara')
reseau_social.add_edge('Marc', 'Liza')
reseau_social.add_edge('Marc', 'Jade')
reseau_social.add_edge('Paul', 'Liza')
reseau_social.add_edge('Sara', 'Liza')
reseau_social.add_edge('Jade', 'Paul')
reseau_social.add_edge('Luc', 'Paul')

nx.draw(reseau_social, with_labels=True)
plt.draw()
plt.show()

print("nombre de sommets=",reseau_social.number_of_nodes())
print("nombre de arêtes=",reseau_social.number_of_edges())
print("Diamètre=",diameter(reseau_social))
print("Rayon=",radius(reseau_social))
print("Centre=",center(reseau_social))

Résultat :

nombre de sommets= 6
nombre de arêtes= 7
Diamètre= 3
Rayon= 2
Centre= ['Paul', 'Liza', 'Jade']