{"id":48335091,"url":"https://github.com/3mcloud/plotme","last_synced_at":"2026-04-05T01:37:43.663Z","repository":{"id":99166952,"uuid":"525153781","full_name":"3mcloud/plotme","owner":"3mcloud","description":"plot all the things in all the folders automatically but only if there have been changes","archived":false,"fork":false,"pushed_at":"2025-12-29T16:26:04.000Z","size":103,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-29T13:50:59.114Z","etag":null,"topics":["cli","csv","plotly"],"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/3mcloud.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-08-15T22:13:24.000Z","updated_at":"2025-12-29T16:26:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"fd2a1bdb-2d9b-4648-b7d5-e510cbc0c42c","html_url":"https://github.com/3mcloud/plotme","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/3mcloud/plotme","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mcloud%2Fplotme","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mcloud%2Fplotme/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mcloud%2Fplotme/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mcloud%2Fplotme/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/3mcloud","download_url":"https://codeload.github.com/3mcloud/plotme/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3mcloud%2Fplotme/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31421869,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T00:25:07.052Z","status":"ssl_error","status_checked_at":"2026-04-05T00:25:05.923Z","response_time":60,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["cli","csv","plotly"],"created_at":"2026-04-05T01:37:43.214Z","updated_at":"2026-04-05T01:37:43.650Z","avatar_url":"https://github.com/3mcloud.png","language":"Python","readme":"# plotme\nscatter plot all the things in all the folders automatically but only if there have been changes\n\n## Description\nPlotme takes tabular data (e.g. excel) and outputs interactive scatter plots. It is a command line tool written in python. It uses json files to configure the plots. It is for technical and non-techncial folks.\n\n## Features\n* specify data_root using argument or current directory\n* save the plot's configuration/definition with the data (plot_info.json)\n* finds plot_info files at any depth in the folder tree\n* validation plot_info.json using jsonschema\n* pass-through to plotly\n  * scatter plot\n    * `trace_mode` (markers or lines) \n    * `marker_symbols` [documentation](https://plotly.com/python/marker-style/)\n    * `constant_lines` constant lines\n    * `error_y` error bars\n    * `x_axes_kwargs`, `y_axes_kwargs` plotly axes keyword arguments e.g. 'type'\n  * [pio.templates](https://plotly.com/python/templates/)\n  * `update_layout_kwargs` plotly layout keyword arguments e.g. 'font', 'legend' etc\n  * `update_traces_kwargs` plotly traces keyword arguments e.g. 'marker', 'selector' etc\n* auto-detect data files (xls, xlsx, csv only)\n* supported data files: xls, xlsx, csv, txt\n* filter data files (include and exclude) `folder_include_filter`, `folder_exclude_filter`, \n* filter folders (include and exclude) `file_include_filter`, `file_exclude_filter`, \n* trace label from y_id (when plot is single file) or file name (default) or folder name `trace_label`\n* remove common text from all trace labels `remove_from_trace_label`\n* only re-generate plots if data or plot_info has changed, to force regeneration `plotme -f`\n* pre-process `pre`\n* post-process (max, min, avg) `post`\n* x value time stamp in file name conversion to seconds using [strptime format codes](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes) `x_time_format`\n* extract x value from filename using regular expression `x_id_is_reg_exp`\n\n## Install options\n* install using [pipx](https://pipx.pypa.io/stable/) from source (recommended if you want system wide availability)\n  * `pipx install git+https://github.com/3mcloud/plotme.git`\n* install to active python environment from source:\n  * SSH: ```python -m pip install git+ssh://git@github.com/3mcloud/plotme.git```\n  * HTTPS: ```python -m pip install https://github.com/3mcloud/plotme.git```\n\n## How to use\n* from command line: plotme(.exe) -h to see arguments\n* from file explorer:\n  1. move to data directory or above\n  2. run once to generate a template of the plot_info.json\n  3. modify the template as needed\n  4. run again to generate plot(s)\n\n\n### example JSON plot_info.json file\nin this example\n* the x value is extracted from the file name via regular expression\n* each point on the scatter plot is the maximum value from a column called `Force(N)-data` where the header is located at the 4th row of a data file\n* the legend is inside the plot in the right top corner, by default the legend is outside the plot on the right side\n* markers are used and they are 10 pixels in diameter\n```json\n{\n    \"title_text\": \"Force over temperature\",\n    \"x_id\": \"_(\\\\d+)C\",\n    \"x_title\": \"Temperature (C)\",\n    \"y_id\": \"Force(N)-data\",\n    \"y_title\": \"Max Force (N)\",\n    \"showlegend\": true,\n    \"update_layout_kwargs\": {\n        \"legend\": {\"xanchor\": \"right\", \"yanchor\": \"top\"},\n        \"font\": {\"size\": 17}\n    },\n    \"x_axes_kwargs\": {\n        \"type\": \"-\"\n    },\n    \"y_axes_kwargs\": {\n        \"type\": \"log\"\n    },\n    \"xaxes_visible\": true,\n    \"yaxes_visible\": true,\n    \"schema\": {\n        \"header\": 3,\n        \"x_id_is_reg_exp\": true\n    },\n    \"post\": \"max\",\n    \"pio.template\": \"plotly_white\",\n    \"trace_mode\": \"markers\",\n    \"update_traces_kwargs\": {\n        \"marker\": {\"size\": 10}\n    }\n}\n```\n\n## Contribute\n\n### unimplemented ideas, in order of priority\n0. sign exe and add to releases\n1. create better tests\n2. Hierarchical plot_info based on folder structure\n3. yml support\n4. pkl data file support\n5. 3D plots\n6. plot_info linter\n\n### Develop\n1. clone \n1. Navigate into the folder or open the folder with your favorite python IDE\n1. create conda env `conda create -n plotme python=3.13`\n1. activate env `conda activate plotme`\n1. install as -e package `python -m pip install -e .` - Note the dot at the end, it's important\n\n### Build windows exe\n1. follow Develop instructions\n2. ```choco install visualstudio2019buildtools``` (needed to compile orderedset)\n3. ```pip install nuitka orderedset zstandard```\n4. ```python -m nuitka plotme --onefile --standalone --include-package=plotly --include-package-data=plotly --nofollow-import-to=module_name=pytest --msvc=latest```\n\n### Test\n1. follow Develop instructions\n2. Install packages to run automated tests `python -m pip install -e .[test]`\n1. run tests","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3mcloud%2Fplotme","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F3mcloud%2Fplotme","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3mcloud%2Fplotme/lists"}