|
510 | 510 | "## Comparing Sindi's comparator and its light version with respect to the invariant denoising task" |
511 | 511 | ] |
512 | 512 | }, |
| 513 | + { |
| 514 | + "cell_type": "code", |
| 515 | + "execution_count": 24, |
| 516 | + "metadata": {}, |
| 517 | + "outputs": [ |
| 518 | + { |
| 519 | + "data": { |
| 520 | + "image/png": "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", |
| 521 | + "text/plain": [ |
| 522 | + "<Figure size 340x240 with 1 Axes>" |
| 523 | + ] |
| 524 | + }, |
| 525 | + "metadata": {}, |
| 526 | + "output_type": "display_data" |
| 527 | + } |
| 528 | + ], |
| 529 | + "source": [ |
| 530 | + "import json\n", |
| 531 | + "import pandas as pd\n", |
| 532 | + "import seaborn as sns\n", |
| 533 | + "import matplotlib.pyplot as plt\n", |
| 534 | + "from matplotlib.patches import Patch, PathPatch\n", |
| 535 | + "\n", |
| 536 | + "# ----------------------------\n", |
| 537 | + "# 1) Load JSON data\n", |
| 538 | + "# ----------------------------\n", |
| 539 | + "with open('output/erc20.json', 'r') as f:\n", |
| 540 | + " erc20_data = json.load(f)\n", |
| 541 | + "with open('output/sok.json', 'r') as f:\n", |
| 542 | + " sok_data = json.load(f)\n", |
| 543 | + "\n", |
| 544 | + "with open('output_light/erc20.json', 'r') as f:\n", |
| 545 | + " erc20_baseline_data = json.load(f)\n", |
| 546 | + "with open('output_light/sok.json', 'r') as f:\n", |
| 547 | + " sok_baseline_data = json.load(f)\n", |
| 548 | + "\n", |
| 549 | + "# ----------------------------\n", |
| 550 | + "# 2) To DataFrames + labels\n", |
| 551 | + "# ----------------------------\n", |
| 552 | + "# Sindi data\n", |
| 553 | + "erc20_df = pd.DataFrame(erc20_data)\n", |
| 554 | + "erc20_df['Dataset'] = 'ERC20'\n", |
| 555 | + "erc20_df['Experiment'] = 'Sindi'\n", |
| 556 | + "\n", |
| 557 | + "sok_df = pd.DataFrame(sok_data)\n", |
| 558 | + "sok_df['Dataset'] = 'SoK'\n", |
| 559 | + "sok_df['Experiment'] = 'Sindi'\n", |
| 560 | + "\n", |
| 561 | + "# Sindi Light data\n", |
| 562 | + "erc20_baseline_df = pd.DataFrame(erc20_baseline_data)\n", |
| 563 | + "erc20_baseline_df['Dataset'] = 'ERC20'\n", |
| 564 | + "erc20_baseline_df['Experiment'] = 'Sindi Light'\n", |
| 565 | + "\n", |
| 566 | + "sok_baseline_df = pd.DataFrame(sok_baseline_data)\n", |
| 567 | + "sok_baseline_df['Dataset'] = 'SoK'\n", |
| 568 | + "sok_baseline_df['Experiment'] = 'Sindi Light'\n", |
| 569 | + "\n", |
| 570 | + "# ----------------------------\n", |
| 571 | + "# 3) Combine\n", |
| 572 | + "# ----------------------------\n", |
| 573 | + "df = pd.concat([erc20_df, sok_df, erc20_baseline_df, sok_baseline_df], ignore_index=True)\n", |
| 574 | + "\n", |
| 575 | + "# ----------------------------\n", |
| 576 | + "# 4) Compute metric\n", |
| 577 | + "# ----------------------------\n", |
| 578 | + "df['percentage_removed'] = (1 - df['reduction_ratio']) * 100\n", |
| 579 | + "\n", |
| 580 | + "# ----------------------------\n", |
| 581 | + "# 5) Plot style\n", |
| 582 | + "# ----------------------------\n", |
| 583 | + "sns.set_context(\"paper\", font_scale=1)\n", |
| 584 | + "sns.set_style(\"white\")\n", |
| 585 | + "\n", |
| 586 | + "# ----------------------------\n", |
| 587 | + "# 6) Figure\n", |
| 588 | + "# ----------------------------\n", |
| 589 | + "plt.figure(figsize=(3.4, 2.4))\n", |
| 590 | + "\n", |
| 591 | + "# Fixed hue order so we always know which box is which within each category\n", |
| 592 | + "hue_order = ['Sindi', 'Sindi Light']\n", |
| 593 | + "palette = {'Sindi': '#639CD9', 'Sindi Light': '#D97C63'}\n", |
| 594 | + "\n", |
| 595 | + "ax = sns.boxplot(\n", |
| 596 | + " x='Dataset',\n", |
| 597 | + " y='percentage_removed',\n", |
| 598 | + " hue='Experiment',\n", |
| 599 | + " hue_order=hue_order,\n", |
| 600 | + " data=df,\n", |
| 601 | + " width=0.6,\n", |
| 602 | + " palette=palette,\n", |
| 603 | + " linewidth=0.9,\n", |
| 604 | + " whiskerprops={'color': 'black', 'linewidth': 0.9},\n", |
| 605 | + " capprops={'color': 'black', 'linewidth': 0.9},\n", |
| 606 | + " medianprops={'color': 'black', 'linewidth': 0.9},\n", |
| 607 | + " flierprops={'markeredgecolor': 'black', 'markersize': 3}\n", |
| 608 | + ")\n", |
| 609 | + "\n", |
| 610 | + "# ----------------------------\n", |
| 611 | + "# 7) Apply hatching robustly\n", |
| 612 | + "# ----------------------------\n", |
| 613 | + "# Seaborn stores box artists in ax.artists (most versions). As a fallback, derive from ax.patches.\n", |
| 614 | + "boxes = list(ax.artists)\n", |
| 615 | + "if not boxes:\n", |
| 616 | + " boxes = [p for p in ax.patches if isinstance(p, PathPatch)]\n", |
| 617 | + "\n", |
| 618 | + "# There are len(hue_order) boxes per category (Dataset). We hatch the \"Sindi Light\" ones.\n", |
| 619 | + "num_hue = len(hue_order) # 2\n", |
| 620 | + "for i, box in enumerate(boxes):\n", |
| 621 | + " # Within each x category, boxes appear in hue_order.\n", |
| 622 | + " hue_index = i % num_hue\n", |
| 623 | + " if hue_order[hue_index] == 'Sindi Light':\n", |
| 624 | + " box.set_hatch('//')\n", |
| 625 | + " else:\n", |
| 626 | + " box.set_hatch('')\n", |
| 627 | + " box.set_edgecolor('black')\n", |
| 628 | + " box.set_alpha(1) # ensure solid fill so hatch renders crisply in vector outputs\n", |
| 629 | + "\n", |
| 630 | + "# ----------------------------\n", |
| 631 | + "# 8) Axes cosmetics\n", |
| 632 | + "# ----------------------------\n", |
| 633 | + "for spine in ax.spines.values():\n", |
| 634 | + " spine.set_visible(True)\n", |
| 635 | + " spine.set_linewidth(0.5)\n", |
| 636 | + " spine.set_edgecolor('black')\n", |
| 637 | + "\n", |
| 638 | + "plt.ylim(0, 100)\n", |
| 639 | + "plt.xlabel(\"\")\n", |
| 640 | + "plt.ylabel(\"Invariants Removed (%)\")\n", |
| 641 | + "\n", |
| 642 | + "# ----------------------------\n", |
| 643 | + "# 9) Legend with matching hatch\n", |
| 644 | + "# ----------------------------\n", |
| 645 | + "handles, labels = ax.get_legend_handles_labels()\n", |
| 646 | + "# Rebuild legend to ensure consistent hatching/edges\n", |
| 647 | + "new_handles = []\n", |
| 648 | + "for lab in labels:\n", |
| 649 | + " if lab == 'Sindi Light':\n", |
| 650 | + " new_handles.append(Patch(facecolor=palette[lab], edgecolor='black', hatch='//'))\n", |
| 651 | + " else:\n", |
| 652 | + " new_handles.append(Patch(facecolor=palette[lab], edgecolor='black'))\n", |
| 653 | + "ax.legend(new_handles, labels, title='', frameon=False)\n", |
| 654 | + "\n", |
| 655 | + "plt.tight_layout()\n", |
| 656 | + "\n", |
| 657 | + "# ----------------------------\n", |
| 658 | + "# 10) Save / Show\n", |
| 659 | + "# ----------------------------\n", |
| 660 | + "plt.savefig(\"paired_boxplot_invariants_removed.pdf\", dpi=300, bbox_inches='tight')\n", |
| 661 | + "plt.show()\n" |
| 662 | + ] |
| 663 | + }, |
513 | 664 | { |
514 | 665 | "cell_type": "code", |
515 | 666 | "execution_count": null, |
|
0 commit comments