{"id":34087825,"url":"https://github.com/emcramer/clockplot","last_synced_at":"2026-03-10T07:31:38.518Z","repository":{"id":57455407,"uuid":"186610770","full_name":"emcramer/clockplot","owner":"emcramer","description":"Plotting utility for a \"clockplot\" that puts groups into a time-ordered heterogeneity visualization","archived":false,"fork":false,"pushed_at":"2019-05-16T15:57:05.000Z","size":392,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-02T16:53:39.924Z","etag":null,"topics":["biology","data-analysis","data-visualization","heterogeneity","pseudotemporal-ordering"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emcramer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-14T11:45:17.000Z","updated_at":"2019-05-16T15:57:07.000Z","dependencies_parsed_at":"2022-09-10T02:24:23.551Z","dependency_job_id":null,"html_url":"https://github.com/emcramer/clockplot","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/emcramer/clockplot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emcramer%2Fclockplot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emcramer%2Fclockplot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emcramer%2Fclockplot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emcramer%2Fclockplot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emcramer","download_url":"https://codeload.github.com/emcramer/clockplot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emcramer%2Fclockplot/sbom","scorecard":{"id":375056,"data":{"date":"2025-08-11","repo":{"name":"github.com/emcramer/clockplot","commit":"f2deceb911f2df1e92fcc24864b54431d0489450"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/15 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: dist/clockplot_cireric-0.0.1-py3-none-any.whl:1","Warn: binary detected: dist/ptoclockplot-0.0.1-py3-none-any.whl:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.0.1-alpha not signed: https://api.github.com/repos/emcramer/clockplot/releases/17391578","Warn: release artifact v0.0.1-alpha does not have provenance: https://api.github.com/repos/emcramer/clockplot/releases/17391578"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T14:02:17.709Z","repository_id":57455407,"created_at":"2025-08-18T14:02:17.709Z","updated_at":"2025-08-18T14:02:17.709Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30326904,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biology","data-analysis","data-visualization","heterogeneity","pseudotemporal-ordering"],"created_at":"2025-12-14T13:55:04.138Z","updated_at":"2026-03-10T07:31:38.467Z","avatar_url":"https://github.com/emcramer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# What is a \"clockplot?\"\n\n\nThe clockplot is designed to help visualize how subgroups of a population are arranged over time, while maintaining a metric of for the heterogeneity or purity of that subgroup. \n\n\u003cdiv style=\"text-align:center;\"\u003e\n    \u003cimg src=\"img/pop-to-plot.PNG\" alt=\"defining populations and subpopulations\"/\u003e\n    \u003cp\u003e\u003cem\u003e\n        We can see different subpopulations of a larger population, but how are they organized over time?\n    \u003c/p\u003e\u003c/em\u003e\n\u003c/div\u003e\n\n\nThis visualization was designed with biology in mind. For example, given a cell population defined by a particular CD marker, we might be want to define subpopulations by the different combinations of other markers expressed by those cells, and see *when* those phenotypes might appear. The clockplot lets you arrange the stages or time points like hours on a clock, and then the subpopulations are \"pulled\" towards each time point based on their percentage component of that timepoint (this algorithm is partially inspired by tracking how the center of mass along a frequency wave moves during a Fourier transform). \n\nEssentially, the angle starting from 12 o'clock indicates how much time has passed in the experiment before a given population appeared. The population's proximity to the center of the clockplot indicates the *heterogeneity* of the population with respect to time. For instance, a population in the center of the plot indicates that the population is equally likely to appear at all time points of the experiment, while a population near the periphery has a stronger association to a given time point.  \n\nThat said, this way of visualizing data could be applied to other data driven fields as well. Consider examining how the content of different stock portfolios changes over time, or looking at which times during the year we see more action versus cin\u0026eacute; art movies are released?\n\nExample with the included `lineardemo` data, which is simulated data made by \"rolling\" a population bolus across a series of time points. We can then order the populations based on their angle from 12 o'clock: 2, 4, 3, 8, 9, 12, 5, 7, 6, 11, 10. \n\n![A sample clockplot using the built-in lineardemo data](img/clockplot-explained.png)\n\nPlease see `demo.ipynb` for a demonstration of the usage.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femcramer%2Fclockplot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femcramer%2Fclockplot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femcramer%2Fclockplot/lists"}