polygraph/polygraph.py

65 lines
1.9 KiB
Python
Raw Normal View History

#!/usr/bin/python
import pygraphviz as pgv
import json
import argparse
# These are the attributes to use for color-coding the graphs
# fixme: make these configurable
# This represents whether a particular relationship involves the
# *risk* of fluid exchange. The values are applied to the edge 'style' attribute
fluid_colors = { 'yes': 'solid',
'no': 'dashed',
}
# Three gender colours, so that we encapsulate masculine, feminine, and a catch-all for other identities
# If you'd rather explicitly colour-code other identities, just add them :)
gender_colors = {
'm': 'blue',
'f': 'pink',
'o': 'green',
}
# Relationship types... feel free to edit to suit your poly family's needs
relationship_colors = {
'stable': 'blue',
'developing': 'red'
}
def parse_args():
parser = argparse.ArgumentParser(description='Generate graphs of polyamorous family networks from data files')
parser.add_argument('--input', '-i', default='network.json', help='Input file in json format')
parser.add_argument('--output', '-o', default='network.png', help='Output image file. Format auto-detected from file extension')
return parser.parse_args()
def main():
settings = parse_args()
try:
data = json.load(open(settings.input, 'r'))
except Exception as e:
print "Error parsing data file: " + str(e)
return
graph = pgv.AGraph()
graph.graph_attr['overlap'] = 'prism'
graph.node_attr['style'] = 'filled'
graph.edge_attr['arrowsize'] = 0.5
# Add nodes to graph
for user in data['members']:
graph.add_node(user['name'], fillcolor=gender_colors[user['gender']])
# Add edges to graph
for (member1,member2,rel,fluid) in data['relationships']:
graph.add_edge(member1, member2, style=fluid_colors[fluid], color=relationship_colors[rel])
graph.layout()
graph.draw(settings.output)
if __name__ == '__main__': main()