{"spec_id":"network-bipartite","library":"pygal","language":"python","code":"\"\"\" anyplot.ai\nnetwork-bipartite: Bipartite Network Graph\nLibrary: pygal 3.1.0 | Python 3.13.13\nQuality: 79/100 | Created: 2026-05-14\n\"\"\"\n\nimport os\nimport sys\n\n\n# Remove current directory from path to avoid importing this file as 'pygal'\n_cwd = sys.path[0] if sys.path[0] else \".\"\nif _cwd in sys.path:\n    sys.path.remove(_cwd)\n\nimport pygal\nfrom pygal.style import Style\n\n\nsys.path.insert(0, _cwd)\n\nTHEME = os.getenv(\"ANYPLOT_THEME\", \"light\")\nPAGE_BG = \"#FAF8F1\" if THEME == \"light\" else \"#1A1A17\"\nINK = \"#1A1A17\" if THEME == \"light\" else \"#F0EFE8\"\nINK_MUTED = \"#6B6A63\" if THEME == \"light\" else \"#A8A79F\"\n\nIMPRINT = (\"#009E73\", \"#C475FD\", \"#4467A3\", \"#BD8233\", \"#AE3030\", \"#2ABCCD\", \"#954477\")\n\ncustom_style = Style(\n    background=PAGE_BG,\n    plot_background=PAGE_BG,\n    foreground=INK,\n    foreground_strong=INK,\n    foreground_subtle=INK_MUTED,\n    colors=IMPRINT,\n    title_font_size=28,\n    label_font_size=18,\n    major_label_font_size=18,\n    legend_font_size=16,\n    value_font_size=14,\n    stroke_width=3,\n)\n\n# Data: Author-Paper Collaboration Network\nauthors = [\"Smith\", \"Zhang\", \"Patel\", \"Mueller\", \"Garcia\", \"Kim\", \"Okonkwo\", \"Novak\"]\npapers = [\"P01\", \"P02\", \"P03\", \"P04\", \"P05\", \"P06\", \"P07\", \"P08\", \"P09\", \"P10\"]\n\nauthor_papers = {\n    \"Smith\": [\"P01\", \"P02\", \"P05\"],\n    \"Zhang\": [\"P01\", \"P03\", \"P07\"],\n    \"Patel\": [\"P02\", \"P04\", \"P06\", \"P08\"],\n    \"Mueller\": [\"P03\", \"P05\", \"P09\"],\n    \"Garcia\": [\"P04\", \"P06\", \"P10\"],\n    \"Kim\": [\"P07\", \"P08\", \"P09\"],\n    \"Okonkwo\": [\"P01\", \"P05\", \"P10\"],\n    \"Novak\": [\"P06\", \"P09\", \"P10\"],\n}\n\n# Y positions: both sets span 1–8 so lines cross cleanly\nn_authors = len(authors)\nn_papers = len(papers)\nauthor_y = {a: float(n_authors - i) for i, a in enumerate(authors)}\npaper_y = {p: 1.0 + (n_papers - 1 - i) * (n_authors - 1.0) / (n_papers - 1) for i, p in enumerate(papers)}\n\nAUTHOR_X = 0\nPAPER_X = 10\n\n# Chart\nchart = pygal.XY(\n    style=custom_style,\n    width=4800,\n    height=2700,\n    title=\"Author–Paper Network · network-bipartite · pygal · anyplot.ai\",\n    show_x_guides=False,\n    show_y_guides=False,\n    show_y_labels=False,\n    show_x_labels=False,\n    dots_size=8,\n    legend_at_bottom=True,\n    legend_at_bottom_columns=4,\n)\n\n# One series per author; each edge is a two-point segment separated by None\nfor author in authors:\n    pts = []\n    for paper in author_papers[author]:\n        pts.extend(\n            [\n                {\"value\": (AUTHOR_X, author_y[author]), \"label\": author},\n                {\"value\": (PAPER_X, paper_y[paper]), \"label\": paper},\n                None,\n            ]\n        )\n    chart.add(author, pts)\n\n# Save\nchart.render_to_png(f\"plot-{THEME}.png\")\nwith open(f\"plot-{THEME}.html\", \"wb\") as f:\n    f.write(chart.render())\n"}