def projects_morelab_collaborations(request): G = nx.Graph() projects = Project.objects.all() pr_role = Role.objects.get(slug='principal-researcher') for project in projects: person_ids = AssignedPerson.objects.filter(project_id=project.id).exclude(role_id=pr_role.id).values('person_id') if person_ids: _list = [person_id['person_id'] for person_id in person_ids] for pos, person_id in enumerate(_list): for i in range(pos+1, len(_list)): person1 = Person.objects.get(id=person_id) person2 = Person.objects.get(id=_list[i]) if person1.is_active and person2.is_active: G.add_edge(person1.id, person2.id) try: G[person1.id][person2.id]['weight'] += 1 except: G[person1.id][person2.id]['weight'] = 1 G.node[person1.id]['name'] = person1.full_name G.node[person2.id]['name'] = person2.full_name G = nx_graph.analyze(G) data = json_graph.node_link_data(G) # dictionary to be returned in render_to_response() return_dict = { 'web_title': u'Group collaborations', 'data': json.dumps(data), } return render_to_response("charts/projects/collaboration_morelab.html", return_dict, context_instance=RequestContext(request))
def project_collaborations(request, exclude_leaders=False, within_group=False): G = nx.Graph() projects = Project.objects.all() names = set() for project in projects: if exclude_leaders: person_ids = AssignedPerson.objects.filter( project=project ).exclude( role__exclude_from_charts=True ).values_list('person_id', flat=True) else: person_ids = AssignedPerson.objects.filter( project=project ).values_list('person_id', flat=True) if person_ids: for pos, person_id in enumerate(person_ids): for i in range(pos+1, len(person_ids)): person1 = Person.objects.get(id=person_id) person2 = Person.objects.get(id=person_ids[i]) names.add(person1.full_name) names.add(person2.full_name) add_node = True if within_group and (not person1.is_active or not person2.is_active): add_node = False if add_node: G.add_edge(person1.id, person2.id) try: G[person1.id][person2.id]['weight'] += 1 except: G[person1.id][person2.id]['weight'] = 1 G.node[person1.id]['name'] = person1.full_name G.node[person2.id]['name'] = person2.full_name G = nx_graph.analyze(G) data = json_graph.node_link_data(G) return_dict = { 'data': json.dumps(data), 'names': list(names), 'web_title': u'Group collaborations', 'within_group': within_group, } return render(request, "charts/projects/collaboration.html", return_dict)
def publication_coauthorships(request, max_position=None, within_group=False): G = nx.Graph() if max_position and int(max_position) > 1: pub_authors = PublicationAuthor.objects.exclude(position__gt=max_position) else: pub_authors = PublicationAuthor.objects.all() pub_authors = pub_authors.values("publication_id", "author_id", "author_id__full_name") # 'publication_id': [ pub_author1, pub_author2, pub_author3 ] authors_per_publication = defaultdict(list) if within_group: people = Person.objects.all().values("is_active", "id") active_by_id = {} for person in people: active_by_id[person['id']] = person['is_active'] for pub_author in pub_authors: check_coauthorship = True if within_group and not active_by_id[pub_author['author_id']]: check_coauthorship = False if check_coauthorship: entry = (pub_author['author_id'], pub_author['author_id__full_name']) authors_per_publication[pub_author['publication_id']].append(entry) for relations in authors_per_publication.values(): for (author_id1, name1), (author_id2, name2) in combinations(relations, 2): G.add_edge(author_id1, author_id2) try: G[author_id1][author_id2]['weight'] += 1 except: G[author_id1][author_id2]['weight'] = 1 G.node[author_id1]['name'] = name1 G.node[author_id2]['name'] = name2 G = nx_graph.analyze(G) data = json_graph.node_link_data(G) return_dict = { 'data': json.dumps(data), 'web_title': u'Publications co-authorship', 'within_group': within_group, } return render(request, "charts/publications/co_authorship.html", return_dict)
def publications_egonetwork(request, author_slug): author = get_object_or_404(Person, slug=author_slug) G = nx.Graph() pub_authors = PublicationAuthor.objects.all().values( "publication_id", "author_id", "author_id__full_name") authors_per_publication = defaultdict( list) # 'publication_id': [ pub_author1, pub_author2, pub_author3 ] for pub_author in pub_authors: entry = (pub_author['author_id'], pub_author['author_id__full_name']) authors_per_publication[pub_author['publication_id']].append(entry) for relations in authors_per_publication.values(): for (author_id1, name1), (author_id2, name2) in combinations(relations, 2): G.add_edge(author_id1, author_id2) try: G[author_id1][author_id2]['weight'] += 1 except: G[author_id1][author_id2]['weight'] = 1 G.node[author_id1]['name'] = name1 G.node[author_id2]['name'] = name2 try: G = nx_graph.analyze(G) ego_g = nx.ego_graph(G, author.id) data = json_graph.node_link_data(ego_g) except: data = {} # dictionary to be returned in render(request, ) return_dict = { # 'publication_tags_per_year': publication_tags_per_year, 'web_title': u'%s - Egonetwork' % author.full_name, 'data': json.dumps(data), 'author': author, } return render(request, "charts/publications/egonetwork.html", return_dict)
def publications_morelab_coauthorship(request, max_position=None): G = nx.Graph() if max_position and int(max_position) > 1: pub_authors = PublicationAuthor.objects.exclude(position__gt=max_position).values("publication_id", "author_id", "author_id__full_name") else: pub_authors = PublicationAuthor.objects.all().values("publication_id", "author_id", "author_id__full_name") people = Person.objects.all().values("is_active", "id") active_by_id = {} for person in people: active_by_id[person['id']] = person['is_active'] authors_per_publication = defaultdict(list) # 'publication_id': [ pub_author1, pub_author2, pub_author3 ] for pub_author in pub_authors: if active_by_id[pub_author['author_id']]: entry = (pub_author['author_id'], pub_author['author_id__full_name']) authors_per_publication[pub_author['publication_id']].append(entry) for relations in authors_per_publication.values(): for (author_id1, name1), (author_id2, name2) in combinations(relations, 2): G.add_edge(author_id1, author_id2) try: G[author_id1][author_id2]['weight'] += 1 except: G[author_id1][author_id2]['weight'] = 1 G.node[author_id1]['name'] = name1 G.node[author_id2]['name'] = name2 G = nx_graph.analyze(G) data = json_graph.node_link_data(G) # dictionary to be returned in render_to_response() return_dict = { 'web_title': u'Group publications co-authorship', 'data': json.dumps(data), } return render_to_response("charts/publications/co_authorship.html", return_dict, context_instance=RequestContext(request))
def publications_egonetwork(request, author_slug): author = get_object_or_404(Person, slug=author_slug) G = nx.Graph() pub_authors = PublicationAuthor.objects.all().values("publication_id", "author_id", "author_id__full_name") authors_per_publication = defaultdict(list) # 'publication_id': [ pub_author1, pub_author2, pub_author3 ] for pub_author in pub_authors: entry = (pub_author['author_id'], pub_author['author_id__full_name']) authors_per_publication[pub_author['publication_id']].append(entry) for relations in authors_per_publication.values(): for (author_id1, name1), (author_id2, name2) in combinations(relations, 2): G.add_edge(author_id1, author_id2) try: G[author_id1][author_id2]['weight'] += 1 except: G[author_id1][author_id2]['weight'] = 1 G.node[author_id1]['name'] = name1 G.node[author_id2]['name'] = name2 try: G = nx_graph.analyze(G) ego_g = nx.ego_graph(G, author.id) data = json_graph.node_link_data(ego_g) except: data = {} # dictionary to be returned in render(request, ) return_dict = { # 'publication_tags_per_year': publication_tags_per_year, 'web_title': u'%s - Egonetwork' % author.full_name, 'data': json.dumps(data), 'author': author, } return render(request, "charts/publications/egonetwork.html", return_dict)
def publication_coauthorships(request, max_position=None, within_group=False): G = nx.Graph() if max_position and int(max_position) > 1: pub_authors = PublicationAuthor.objects.exclude( position__gt=max_position) else: pub_authors = PublicationAuthor.objects.all() pub_authors = pub_authors.values("publication_id", "author_id", "author_id__full_name") # 'publication_id': [ pub_author1, pub_author2, pub_author3 ] authors_per_publication = defaultdict(list) names = set() if within_group: people = Person.objects.all().values("is_active", "id") active_by_id = {} for person in people: active_by_id[person['id']] = person['is_active'] for pub_author in pub_authors: check_coauthorship = True if within_group and not active_by_id[pub_author['author_id']]: check_coauthorship = False if check_coauthorship: entry = (pub_author['author_id'], pub_author['author_id__full_name']) authors_per_publication[pub_author['publication_id']].append(entry) for relations in authors_per_publication.values(): for (author_id1, name1), (author_id2, name2) in combinations(relations, 2): G.add_edge(author_id1, author_id2) try: G[author_id1][author_id2]['weight'] += 1 except: G[author_id1][author_id2]['weight'] = 1 G.node[author_id1]['name'] = name1 G.node[author_id2]['name'] = name2 names.add(name1) names.add(name2) try: G = nx_graph.analyze(G) except: # Avoid networkx's "power iteration failed to converge" error pass data = json_graph.node_link_data(G) return_dict = { 'data': json.dumps(data), 'names': list(names), 'web_title': u'Publications co-authorship', 'within_group': within_group, } return render(request, "charts/publications/co_authorship.html", return_dict)