Repository Analysis

pyecharts/pyecharts

🎨 Python Echarts Plotting Library

12.0 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of pyecharts/pyecharts, a Python project with 15,770 GitHub stars. SynthScan v2.0 examined 35,527 lines of code across 162 source files, recording 498 pattern matches distributed across 8 syntactic categories. The overall adjusted score of 12.0 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

12.0
Adjusted Score
12.0
Raw Score
100%
Time Factor
2026-07-25
Last Push
15.8K
Stars
Python
Language
35.5K
Lines of Code
162
Files
498
Pattern Hits
2026-08-02
Scan Date
0.01
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 1MEDIUM 0LOW 497

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 498 distinct pattern matches across 8 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers152 hits · 160 pts
SeverityFileLineSnippetContext
LOWAGENTS.md199 def test_chart_line_style_opts(self):CODE
LOWpyecharts/commons/utils.py56def replace_placeholder_with_quotes(html: str) -> str:CODE
LOWpyecharts/commons/utils.py109def remove_key_with_none_value(incoming_dict):CODE
LOWpyecharts/charts/basic_charts/wordcloud.py43 def _create_mask_image_variable(self, data: str) -> JsCode:CODE
LOWtest/test_amap.py35 def test_amap_map_control_panel(self, fake_writer):CODE
LOWtest/test_amap.py56 def test_amap_polyline_and_large(self, fake_writer):CODE
LOWtest/test_series_options.py21 def test_label_options_defaults(self):CODE
LOWtest/test_series_options.py63 def test_label_options_custom(self):CODE
LOWtest/test_series_options.py116 def test_mark_point_item_remove_none(self):CODE
LOWtest/test_series_options.py121 def test_mark_line_item_remove_none(self):CODE
LOWtest/test_series_options.py126 def test_mark_area_item_remove_none(self):CODE
LOWtest/test_series_options.py149 def test_mark_area_options_remove_none(self):CODE
LOWtest/test_series_options.py158 def test_tree_map_breadcrumb_options_remove_none(self):CODE
LOWtest/test_series_options.py173 def test_minor_tick_options_remove_none(self):CODE
LOWtest/test_series_options.py182 def test_minor_split_line_options_remove_none(self):CODE
LOWtest/test_series_options.py191 def test_area_color_in_item_styles(self):CODE
LOWtest/test_series_options.py195 def test_mark_point_opts_with_animation(self):CODE
LOWtest/test_series_options.py199 def test_mark_line_opts_with_animation(self):CODE
LOWtest/test_series_options.py203 def test_mark_area_opts_with_animation(self):CODE
LOWtest/test_engine.py51 def test_import_iterable_new_location(self):CODE
LOWtest/test_engine.py61 def test_import_iterable_old_location(self):CODE
LOWtest/test_utils.py8 def test_utils_produce_require_dict(self):CODE
LOWtest/test_utils.py37 def test_utils_produce_require_dict_with_extra(self):CODE
LOWtest/test_utils.py58 def test_utils_remove_key_with_none_value(self):CODE
LOWtest/test_utils.py67 def test_utils_remove_key_with_none_value_raise_value_error(self):CODE
LOWtest/test_effectscatter.py19 def test_effectscatter_item_base(self, fake_writer):CODE
LOWtest/test_grid.py11 def _verify_instance_for_datazoom_and_visualmap(self, chart, key):CODE
LOWtest/test_grid.py62 def _chart_for_set_grid_index(self, gird_index=None) -> Bar:CODE
LOWtest/test_grid.py74 def _chart_for_grid_with_datazoom_and_visualmap(self) -> Bar:CODE
LOWtest/test_grid.py95 def _chart_for_grid_with_multiple_datazoom_and_visualmap(self) -> Bar:CODE
LOWtest/test_grid.py143 def test_grid_set_grid_index_priority(self):CODE
LOWtest/test_grid.py170 def test_grid_set_grid_out_of_order(self):CODE
LOWtest/test_grid.py184 def test_grid_control_axis_index(self):CODE
LOWtest/test_grid.py195 def test_grid_do_not_control_axis_index(self):CODE
LOWtest/test_grid.py202 def test_grid_with_more_datazoom_and_visualmap_opts(self):CODE
LOWtest/test_tree.py38 def test_tree_collapse_interval(self, fake_writer):CODE
LOWtest/test_gmap.py35 def test_gmap_map_control_panel(self, fake_writer):CODE
LOWtest/test_gmap.py52 def test_gmap_polyline_and_large(self, fake_writer):CODE
LOWtest/test_chart_options.py30 def test_bar_background_style_options_remove_none(self):CODE
LOWtest/test_chart_options.py43 def test_globe_layers_options_remove_none(self):CODE
LOWtest/test_chart_options.py54 def test_theme_river_item_remove_none(self):CODE
LOWtest/test_chart_options.py59 def test_tree_river_item_remove_none(self):CODE
LOWtest/test_chart_options.py64 def test_timeline_check_pointer_style_options_remove_none(self):CODE
LOWtest/test_chart_options.py80 def test_timeline_control_style_options_remove_none(self):CODE
LOWtest/test_chart_options.py96 def test_graph_category_item_remove_none(self):CODE
LOWtest/test_chart_options.py101 def test_tree_map_item_style_options_remove_none(self):CODE
LOWtest/test_chart_options.py109 def test_graphic_image_style_opts_remove_none(self):CODE
LOWtest/test_chart_options.py121 def test_graphic_text_style_opts_remove_none(self):CODE
LOWtest/test_chart_options.py132 def test_geo_region_opts_remove_none(self):CODE
LOWtest/test_chart_options.py143 def test_sunburst_label_line_opts_remove_none(self):CODE
LOWtest/test_chart_options.py148 def test_sunburst_label_layout_opts_remove_none(self):CODE
LOWtest/test_chart_options.py153 def test_sunburst_level_opts_remove_none(self):CODE
LOWtest/test_chart_options.py158 def test_custom_item_payload_opts_remove_none(self):CODE
LOWtest/test_datasets.py64 def test_fuzzy_search_key_error(self):CODE
LOWtest/test_datasets.py76 def test_type_error_with_non_string_key(self):CODE
LOWtest/test_datasets.py84 def test_type_error_with_non_string_lookfor(self):CODE
LOWtest/test_wordcloud.py47 def test_wordcloud_mask_image(self, fake_writer):CODE
LOWtest/test_geo.py127 def test_extra_geo_parameters(self, fake_writer):CODE
LOWtest/test_geo.py157 def test_geo_dump_options_with_quotes(self):CODE
LOWtest/test_bmap.py51 def test_bmap_effect_trail_length(self, fake_writer):CODE
92 more matches not shown…
Unused Imports219 hits · 144 pts
SeverityFileLineSnippetContext
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py1CODE
LOWpyecharts/__init__.py2CODE
LOWpyecharts/__init__.py2CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py1CODE
LOWpyecharts/types.py16CODE
LOWpyecharts/types.py16CODE
LOWpyecharts/types.py16CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
LOWpyecharts/options/__init__.py3CODE
159 more matches not shown…
AI Structural Patterns110 hits · 100 pts
SeverityFileLineSnippetContext
LOWpyecharts/options/global_options.py23CODE
LOWpyecharts/options/global_options.py85CODE
LOWpyecharts/options/global_options.py131CODE
LOWpyecharts/options/global_options.py170CODE
LOWpyecharts/options/global_options.py224CODE
LOWpyecharts/options/global_options.py260CODE
LOWpyecharts/options/global_options.py294CODE
LOWpyecharts/options/global_options.py316CODE
LOWpyecharts/options/global_options.py351CODE
LOWpyecharts/options/global_options.py417CODE
LOWpyecharts/options/global_options.py467CODE
LOWpyecharts/options/global_options.py517CODE
LOWpyecharts/options/global_options.py577CODE
LOWpyecharts/options/global_options.py682CODE
LOWpyecharts/options/global_options.py782CODE
LOWpyecharts/options/global_options.py927CODE
LOWpyecharts/options/global_options.py999CODE
LOWpyecharts/options/global_options.py1117CODE
LOWpyecharts/options/global_options.py1181CODE
LOWpyecharts/options/global_options.py1241CODE
LOWpyecharts/options/global_options.py1285CODE
LOWpyecharts/options/global_options.py1335CODE
LOWpyecharts/options/global_options.py1394CODE
LOWpyecharts/options/global_options.py1426CODE
LOWpyecharts/options/global_options.py1458CODE
LOWpyecharts/options/global_options.py1488CODE
LOWpyecharts/options/global_options.py1530CODE
LOWpyecharts/options/global_options.py1596CODE
LOWpyecharts/options/global_options.py1661CODE
LOWpyecharts/options/global_options.py1734CODE
LOWpyecharts/options/global_options.py1832CODE
LOWpyecharts/options/global_options.py1878CODE
LOWpyecharts/options/global_options.py1946CODE
LOWpyecharts/options/global_options.py1980CODE
LOWpyecharts/options/global_options.py2018CODE
LOWpyecharts/options/global_options.py2052CODE
LOWpyecharts/options/charts_options.py46CODE
LOWpyecharts/options/charts_options.py100CODE
LOWpyecharts/options/charts_options.py418CODE
LOWpyecharts/options/charts_options.py449CODE
LOWpyecharts/options/charts_options.py603CODE
LOWpyecharts/options/charts_options.py667CODE
LOWpyecharts/options/charts_options.py719CODE
LOWpyecharts/options/charts_options.py752CODE
LOWpyecharts/options/charts_options.py803CODE
LOWpyecharts/options/charts_options.py865CODE
LOWpyecharts/options/charts_options.py889CODE
LOWpyecharts/options/charts_options.py917CODE
LOWpyecharts/options/charts_options.py965CODE
LOWpyecharts/options/charts_options.py1075CODE
LOWpyecharts/options/charts_options.py1099CODE
LOWpyecharts/options/charts_options.py1125CODE
LOWpyecharts/options/charts_options.py1158CODE
LOWpyecharts/options/charts_options.py1246CODE
LOWpyecharts/options/charts_options.py1304CODE
LOWpyecharts/options/charts_options.py1412CODE
LOWpyecharts/options/charts_options.py1468CODE
LOWpyecharts/options/charts_options.py1535CODE
LOWpyecharts/options/charts_options.py1565CODE
LOWpyecharts/options/charts_options.py1589CODE
50 more matches not shown…
Deep Nesting13 hits · 13 pts
SeverityFileLineSnippetContext
LOWpyecharts/commons/utils.py29CODE
LOWpyecharts/commons/utils.py74CODE
LOWpyecharts/charts/basic_charts/geo.py45CODE
LOWpyecharts/charts/basic_charts/tree.py17CODE
LOWpyecharts/charts/basic_charts/gmap.py31CODE
LOWpyecharts/charts/basic_charts/boxplot.py93CODE
LOWpyecharts/charts/basic_charts/amap.py31CODE
LOWpyecharts/charts/basic_charts/bmap.py32CODE
LOWpyecharts/charts/basic_charts/wordcloud.py56CODE
LOWpyecharts/charts/basic_charts/lmap.py31CODE
LOWpyecharts/charts/basic_charts/scatter.py19CODE
LOWpyecharts/charts/three_axis_charts/map3D.py21CODE
LOWpyecharts/render/engine.py30CODE
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippetContext
HIGHpyecharts/charts/composite_charts/page.py25 result.push({CODE
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippetContext
LOWpyecharts/datasets/__init__.py33 # if the item is in the dictionary then just return itCOMMENT
Excessive Try-Catch Wrapping1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpyecharts/datasets/__init__.py109 except Exception as e:CODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOWpyecharts/render/snapshot.py9logger = logging.getLogger(__name__)CODE