{"id":26334457,"url":"https://github.com/asjadnaqvi/stata-sankey","last_synced_at":"2026-01-02T15:42:49.943Z","repository":{"id":65776403,"uuid":"575857129","full_name":"asjadnaqvi/stata-sankey","owner":"asjadnaqvi","description":"A Stata package for Sankey diagrams","archived":false,"fork":false,"pushed_at":"2024-10-21T12:01:18.000Z","size":55586,"stargazers_count":22,"open_issues_count":10,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-10T06:34:46.318Z","etag":null,"topics":["ado","package","sankey","stata"],"latest_commit_sha":null,"homepage":"","language":"Stata","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/asjadnaqvi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"asjadnaqvi"}},"created_at":"2022-12-08T13:07:40.000Z","updated_at":"2024-10-22T03:53:14.000Z","dependencies_parsed_at":"2024-09-17T13:51:07.959Z","dependency_job_id":"8c6e8ddb-7d83-4899-98e2-eb74e40688c9","html_url":"https://github.com/asjadnaqvi/stata-sankey","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asjadnaqvi%2Fstata-sankey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asjadnaqvi%2Fstata-sankey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asjadnaqvi%2Fstata-sankey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/asjadnaqvi%2Fstata-sankey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/asjadnaqvi","download_url":"https://codeload.github.com/asjadnaqvi/stata-sankey/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243806709,"owners_count":20350895,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["ado","package","sankey","stata"],"created_at":"2025-03-16T00:19:03.795Z","updated_at":"2026-01-02T15:42:49.937Z","avatar_url":"https://github.com/asjadnaqvi.png","language":"Stata","funding_links":["https://github.com/sponsors/asjadnaqvi"],"categories":[],"sub_categories":[],"readme":"\n\n![StataMin](https://img.shields.io/badge/stata-2015-blue) ![issues](https://img.shields.io/github/issues/asjadnaqvi/stata-sankey) ![license](https://img.shields.io/github/license/asjadnaqvi/stata-sankey) ![Stars](https://img.shields.io/github/stars/asjadnaqvi/stata-sankey) ![version](https://img.shields.io/github/v/release/asjadnaqvi/stata-sankey) ![release](https://img.shields.io/github/release-date/asjadnaqvi/stata-sankey)\n\n[Installation](#Installation) | [Syntax](#Syntax) | [Citation guidelines](#Citation-guidelines) | [Examples](#Examples) | [Feedback](#Feedback) | [Change log](#Change-log)\n\n---\n\n\n![sankey-1](https://github.com/asjadnaqvi/stata-sankey/assets/38498046/b019b070-64c5-4d92-abdd-7774e1cefea6)\n\n\n\n# sankey v1.9\n(24 Jun 2025)\n\nThis package allows users to draw Sankey plots in Stata. It is based on the [Sankey Guide](https://medium.com/the-stata-guide/stata-graphs-sankey-diagram-ecddd112aca1) published on [the Stata Guide](https://medium.com/the-stata-guide) on Medium on October 2021.\n\n\n## Installation\n\nThe package can be installed via SSC or GitHub. The GitHub version, *might* be more recent due to bug fixes, feature updates etc, and *may* contain syntax improvements and changes in *default* values. See version numbers below. Eventually the GitHub version is published on SSC.\n\nSSC (**v1.9**):\n\n```\nssc install sankey, replace\n```\n\nGitHub (**v1.9**):\n\n```\nnet install sankey, from(\"https://raw.githubusercontent.com/asjadnaqvi/stata-sankey/main/installation/\") replace\n```\n\n\n\nThe `palettes` package is required to run this command:\n\n```\nssc install palettes, replace\nssc install colrspace, replace\nssc install graphfunctions, replace\n```\n\nEven if you have these packages installed, please check for updates: `ado update, update`.\n\nIf you want to make a clean figure, then it is advisable to load a clean scheme. These are several available and I personally use the following:\n\n```\nssc install schemepack, replace\nset scheme white_tableau  \n```\n\nYou can also push the scheme directly into the graph using the `scheme(schemename)` option. See the help file for details or the example below.\n\nI also prefer narrow fonts in figures with long labels. You can change this as follows:\n\n```\ngraph set window fontface \"Arial Narrow\"\n```\n\n\n## Syntax\n\nThe syntax for the latest version is as follows:\n\n```stata\nsankey value [if] [in] [weight], from(var) to(var) \n            [ by(var) palette(str) colorby(layer|level) colorvar(var) stock stock2 colorvarmiss(str) colorboxmiss(str)\n              smooth(1-8) gap(num) recenter(mid|bot|top) ctitles(list) ctgap(num) ctsize(num) ctposition(bot|top) \n              ctcolor(str) ctwrap(num) labangle(str) labsize(str) labposition(str) labgap(str) showtotal labprop labscale(num) \n              valsize(str) valcondition(num) format(str) valgap(str) novalues valprop valscale(num)\n              novalright novalleft nolabels sort1(value|name[, reverse]) sort2(value|order[, reverse]) align fill \n              lwidth(str) lcolor(str) alpha(num) offset(num) boxwidth(str) percent wrap(num) * ]\n```\n\nSee the help file `help sankey` for details.\n\nThe most basic use is as follows:\n\n```\nsankey value, from(var1) to(var2) [by(level)]\n```\n\nwhere `var1` and `var2` are source and destination variables respectively against which the `value` variable is plotted. The `by()` variable defines the levels and is optional since v1.72.\n\n\n## Citation guidelines\n\nSoftware packages take countless hours of programming, testing, and bug fixing. If you use this package, then a citation would be highly appreciated. \n\nThe [SSC citation](https://ideas.repec.org/c/boc/bocode/s459154.html) is recommended. Please note that the GitHub version might be newer than the SSC version.\n\n\n\n## Examples\n\nGet the example data from GitHub:\n\n```stata\nimport excel using \"https://github.com/asjadnaqvi/stata-sankey/blob/main/data/sankey_example2.xlsx?raw=true\", clear first\n```\n\nLet's test the `sankey` command:\n\n\n```stata\nsankey value, from(source) to(destination) by(layer)\n```\n\n\u003cimg src=\"/figures/sankey1.png\" width=\"100%\"\u003e\n\n\n### Smooth \n\n```\nsankey value, from(source) to(destination) by(layer) smooth(2)\n```\n\n\u003cimg src=\"/figures/sankey2_1.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) smooth(8)\n```\n\n\u003cimg src=\"/figures/sankey2_2.png\" width=\"100%\"\u003e\n\n\n### Re-center\n\n```\nsankey value, from(source) to(destination) by(layer) recenter(bot)\n```\n\n\u003cimg src=\"/figures/sankey3_1.png\" width=\"100%\"\u003e\n\n\n```\nsankey value, from(source) to(destination) by(layer) recenter(top)\n```\n\n\u003cimg src=\"/figures/sankey3_2.png\" width=\"100%\"\u003e\n\n### Gaps\n\n```\nsankey value, from(source) to(destination) by(layer) gap(0)\n```\n\n\u003cimg src=\"/figures/sankey4_1.png\" width=\"100%\"\u003e\n\n\n```\nsankey value, from(source) to(destination) by(layer) gap(20)\n```\n\n\u003cimg src=\"/figures/sankey4_2.png\" width=\"100%\"\u003e\n\n### Values\n\n```\nsankey value, from(source) to(destination) by(layer) noval showtot\n```\n\n\u003cimg src=\"/figures/sankey5.png\" width=\"100%\"\u003e\n\n\n### Sort (v1.6)\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(name)\n```\n\n\u003cimg src=\"/figures/sankey5_1.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(value)\n```\n\n\u003cimg src=\"/figures/sankey5_2.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(value) sort2(value)\n```\n\n\u003cimg src=\"/figures/sankey5_2_1.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(name, reverse) sort2(value)\n```\n\n\u003cimg src=\"/figures/sankey5_2_2.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(name, reverse) sort2(value, reverse) \n```\n\n\u003cimg src=\"/figures/sankey5_2_3.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(name, reverse) sort2(order) \n```\n\n\u003cimg src=\"/figures/sankey5_2_4.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) sort1(name, reverse) sort2(order, reverse) \n```\n\n\u003cimg src=\"/figures/sankey5_2_5.png\" width=\"100%\"\u003e\n\n\nCustom sorting on a value:\n\n```stata\ngen source2 = .\ngen destination2 = .\n\nforeach x in source destination {\n\treplace `x'2 = 1 if `x'==\"Blog\"\n\treplace `x'2 = 2 if `x'==\"LinkedIn\"\n\treplace `x'2 = 3 if `x'==\"Twitter\"\n\treplace `x'2 = 4 if `x'==\"Direct\"\n\treplace `x'2 = 5 if `x'==\"App\"\n\treplace `x'2 = 6 if `x'==\"Medium\"\t\n\treplace `x'2 = 7 if `x'==\"Website\"\n\treplace `x'2 = 8 if `x'==\"Homepage\"\n\treplace `x'2 = 9 if `x'==\"Total\"\n\treplace `x'2 = 10 if `x'==\"Google\"\n\treplace `x'2 = 11 if `x'==\"Facebook\"\n}\n\n\nlab de labels 1 \"Blog\" 2 \"LinkedIn\" 3 \"Twitter\" 4 \"Direct\" 5 \"App\" 6 \"Medium\" 7 \"Website\" 8 \"Homepage\" 9 \"Total\" 10 \"Google\" 11 \"Facebook\", replace\n\nlab val source2 labels\nlab val destination2 labels\n\n\n\nsankey value, from(source2) to(destination2) by(layer) \n```\n\n\u003cimg src=\"/figures/sankey5_2_6.png\" width=\"100%\"\u003e\n\n\n### boxwidth\n\n```\nsankey value, from(source) to(destination) by(layer) boxwid(5)\n```\n\n\u003cimg src=\"/figures/sankey5_3.png\" width=\"100%\"\u003e\n\n\n### valcond\n\n```\nsankey value, from(source) to(destination) by(layer) valcond(200)\n```\n\n\u003cimg src=\"/figures/sankey5_4.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) valcond(300)\n```\n\n\u003cimg src=\"/figures/sankey5_5.png\" width=\"100%\"\u003e\n\n\n### Palettes\n\n```\nsankey value, from(source) to(destination) by(layer) palette(CET C6)\n```\n\n\u003cimg src=\"/figures/sankey6.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) colorby(level)\n```\n\n\u003cimg src=\"/figures/sankey6_1.png\" width=\"100%\"\u003e\n\n\n### color by variable (v1.4)\n\n```\ngen trace1 = 1 if source==\"App\"\n\nsankey value, from(source) to(destination) by(layer) colorvar(trace1)\n```\n\n\u003cimg src=\"/figures/sankey6_2.png\" width=\"100%\"\u003e\n\n```\ncap drop trace2\ngen trace2 = .\nreplace trace2 = 1 if  source==\"App\" \u0026 destination==\"App\" \u0026 layer==0\nreplace trace2 = 2 if  source==\"App\" \u0026 destination==\"App\" \u0026 layer==1\nreplace trace2 = 3 if  source==\"App\" \u0026 destination==\"App\" \u0026 layer==2\nreplace trace2 = 4 if  source==\"App\" \u0026 destination==\"Total\" \u0026 layer==3\n\nsankey value, from(source) to(destination) by(layer) colorvar(trace2)\n```\n\n\u003cimg src=\"/figures/sankey6_3.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) colorvar(trace2) palette(Oranges)\n```\n\n\u003cimg src=\"/figures/sankey6_4.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) colorvar(trace2) palette(Blues) ///\n colorvarmiss(gs13) colorboxmiss(gs13)\n```\n\n\u003cimg src=\"/figures/sankey6_5.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) colorvar(trace2) ///\npalette(blue*0.1 blue*0.3 blue*0.5 blue*0.7) colorvarmiss(gs13) colorboxmiss(gs13)\n```\n\n\u003cimg src=\"/figures/sankey6_6.png\" width=\"100%\"\u003e\n\n### column titles (v1.4)\n\n```\nsankey value, from(source) to(destination) by(layer) ctitles(Cat1 Cat2 Cat3 Cat4 Cat5)\n```\n\n\u003cimg src=\"/figures/sankey6_7.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) ctitles(Cat1 Cat2 Cat3 Cat4 Cat5) ctg(-100)\n```\n\n\u003cimg src=\"/figures/sankey6_8.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) ctitles(\"Cat 1\" \"Cat 2\" \"Cat 3\" \"Cat 4\" \"Cat 5\") ctg(-100)\n```\n\n\u003cimg src=\"/figures/sankey6_9.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) ctitles(\"Cat 1\" \"Cat 2\" \"Cat 3\" \"Cat 4\" \"Cat 5\") ctpos(top) ctg(100) recenter(top)\n```\n\n\u003cimg src=\"/figures/sankey6_9_1.png\" width=\"100%\"\u003e\n\n\n### label rotation and offset\n\n```\nsankey value, from(source) to(destination) by(layer) noval showtot palette(CET C6) ///\n\tlaba(0) labpos(3) labg(-1) offset(10)\n```\n\n\u003cimg src=\"/figures/sankey6_10.png\" width=\"100%\"\u003e\n\n\n### hide values and labels (v1.5)\n\n```\nsankey value, from(source) to(destination) by(layer) novalleft\n```\n\n\u003cimg src=\"/figures/sankey8_1.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) novalright\n```\n\n\u003cimg src=\"/figures/sankey8_2.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) noval\n```\n\n\u003cimg src=\"/figures/sankey8_3.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) nolabels\n```\n\n\u003cimg src=\"/figures/sankey8_4.png\" width=\"100%\"\u003e\n\n\n### proportional values and labels (v1.5)\n\n\n```\nsankey value, from(source) to(destination) by(layer) valprop vals(2) \n```\n\n\u003cimg src=\"/figures/sankey9_1.png\" width=\"100%\"\u003e\n\n```\nsankey value, from(source) to(destination) by(layer) labprop labs(2)\n```\n\n\u003cimg src=\"/figures/sankey9_2.png\" width=\"100%\"\u003e\n\n\n\u003cimg src=\"/figures/sankey10.png\" width=\"100%\"\u003e\n\n\n### All together\n\n```\nsankey value, from(source) to(destination) by(layer) palette(CET C6) alpha(60) ///\n\tlabs(2.5) laba(0) labpos(3) labg(-1) offset(5)  noval showtot ///\n\tctitles(\"Cat 1\" \"Cat 2\" \"Cat 3\" \"Cat 4\" \"Cat 5\") ctg(-100) cts(3) ///\n\ttitle(\"My sankey plot\", size(6)) note(\"Made with the #sankey package.\", size(2.2)) ///\n\txsize(2) ysize(1)\n```\n\n\u003cimg src=\"/figures/sankey7.png\" width=\"100%\"\u003e\n\n\n### stocks (v1.6+)\n\n```stata\nimport excel using \"https://github.com/asjadnaqvi/stata-sankey/blob/main/data/sankey_stocks.xlsx?raw=true\", clear first\n```\n\n```\nsankey value, from(source) to(destination) by(layer) xsize(2) ysize(1) showtotal \nsankey value, from(source) to(destination) by(layer) xsize(2) ysize(1) showtotal stock\nsankey value, from(source) to(destination) by(layer) xsize(2) ysize(1) showtotal stock2\n```\n\u003cimg src=\"/figures/sankey_stock1.png\" width=\"100%\"\u003e\n\u003cimg src=\"/figures/sankey_stock2.png\" width=\"100%\"\u003e\n\u003cimg src=\"/figures/sankey_stock3.png\" width=\"100%\"\u003e\n\n\n### v1.9\n\nLoad trade data by regions:\n\n```stata\nuse \"https://github.com/asjadnaqvi/stata-sankey/blob/main/data/trade_sankey_example.dta?raw=true\", clear\n```\n\nGenerate the default Sankey: \n\n\n```stata\nsankey value, from(ex_region) to(im_region)  \n```\n\n\u003cimg src=\"/figures/sankey10_1.png\" width=\"100%\"\u003e\n\n\nAdd better styling using the new options in v1.9:\n\n\n```stata\nsankey value, from(ex_region) to(im_region)    ///\n\tformat(%15.1fc) labprop smooth(8) palette(HCL intense) sort1(value) sort2(value)\t///\n\tlabs(2.4)  laba(0) labpos(9 3) labg(2) gap(5) noval showtot lw(none) ///\n\ttitle(\"{fontface Merriweather Bold:Global trade in 2022 (USD millions)}\", size(4)) ///\n\tnote(\"Source: COMTRADE BACI HS07 2022.\", size(2)) ///\n\tplotregion(margin(l+16 r+16 b+5)) ///\n\tctitle(\"{bf:Exporting region}\" \"{bf:Importing region}\") ctwrap(8) ctgap(5) ///\n\txsize(2) ysize(1)\n```\n\n\n\u003cimg src=\"/figures/sankey10_2.png\" width=\"100%\"\u003e\n\n\n## Feedback\n\nPlease open an [issue](https://github.com/asjadnaqvi/stata-sankey/issues) to report errors, feature enhancements, and/or other requests.\n\n\n## Change log\n\n\n**v1.9 (24 Jun 2025)**\n- Option `ctwrap()` added to wrap title labels.\n- Option `ctgap()` now takes on values based on percentage of total height. This makes it easier to relatively displace the title labels.\n- Option `labpos()` now accepts lists of positions for each layer.\n- X-axis was sometimes adding additional space due to some internal tolerance limit. This has been fixed.\n- Minor bug fixes.\n\n**v1.81 (16 Oct 2024)**\n- Weights are now allowed. It is still advisable to prepare the data beforehand.\n- `wrap()` now requires [graphfunctions](https://github.com/asjadnaqvi/stata-graphfunctions) for label wrapping the respects word boundaries.\n- Option `stock2` added that collapses stocks on the right (incoming) and removes own flows. In contrast, `stock` collapses stocks on the left (out-going).\n- Various code fixes should remove additional small bugs.\n\n**v1.8 (22 Sep 2024)**\n- Added option `align` to align flows. Works only if there is just one parent (still beta).\n- Added option `fill` to extrapolate missing flows. Works only if there is just one parent (still beta).\n- Added option `n()` to allow users to increase the number of points for generating the arcs. Default is 30.\n- Quite a large code clean up so the command should run a bit faster.\n\n**v1.74 (11 Jun 2024)**\n- Added `wrap()` option for wrapping labels.\n- Minor code cleanups.\n\n**v1.73 (16 Mar 2024)**\n- If the `from()` and `to()` variables have value labels, then the order of the value labels is respected. This allows the users to have full control of the order of the drawing of the layers through value labels (requested by Katie Naylor + others).\n- The command now throws an error if `from()` and `to()` have different format types. Both have to be either string or numeric variables. This was necessary to implement in order to implement the above change.\n- Minor code cleanups.\n\n**v1.72 (12 Feb 2024)**\n- Fixed `labprop` from wrong calculation the label sizes.\n- `valcond()` now passes on to box labels. Was removed but has been put back in.\n- `by()` changed to optional. Assumes one layer if not specified. This is mostly a quality of life improvement. A warning message is displayed to ensure that `by()` is not left out by mistake.\n- `ctsize()` converted to string allow size names.\n- `ctcolor()` added.\n- Help file improved.\n- Minor code cleanups\n\n**v1.71 (15 Jan 2024)**\n- Fixed a bug where numerical `from()` and `to()` variables with value labels were messing up the labels in the final figure (reported by Ian White).\n\n**v1.7 (06 Nov 2023)**\n- Fixed `valcond()` dropping bar values.\n- Fixed `ctitles()` getting random colors. It now defaults to black.\n- Added `ctpos()` option to change column title position.\n- Added `percent` option which is still beta. Convert flows to percent values.\n\n**v1.61 (22 Jul 2023)**\n- `saving()` option added (requested by Anirban Basu).\n- Minor fixes.\n\n**v1.6 (11 Jun 2023)**\n- Complete rewrite of the base routines. The code is 30% smaller but several times faster.\n- The option `sortby()` split into `sort1()` and `sort2()` for clarity.\n- Added support for numerical variables with value labels.\n- Option `stock` added to collapse own flows (source = destination) to box heights (requested by Oras Alabas).\n- Several code optimizations and minor bug fixes.\n\n**v1.51 (25 May 2023)**\n- Added background checks for `from()` and `to()` variable. This ensures that the code runs regardless of the variable types. Ideally both should be strings.\n\n**v1.5 (30 Apr 2023)**\n- Added `laprop`, `titleprop`, and `labscale()` for scaling values and labels.\n- Added `novalright`, `novalleft`, `nolabels` options.\n- Added `sortby(., reverse)` option.\n- Help file improved in its layout.\n\n**v1.4 (23 Apr 2023)**\n- Fixed major bugs with unbalanced panels.\n- Added column title options.\n- Added option to draw colors by variables.\n- Several bug fixes and improvements to the code.\n\n**v1.31 (04 Apr 2023)**\n- Fixed the color of categories. Previous version was resulting in wrong color assignments.\n\n**v1.3 (26 Feb 2023)**\n- Node bundling added which align nodes in front of each other. This looks better especially if flows are passing through certain nodes.\n- Option `sortby()` added that allows alphabetical sorting (`sortby(name)`) or numerical sorting `sortby(value)` (Thanks to Fabian Unterlass for detailed feedback).\n- Option `boxwdith()` added to allow adjusting the width of node boxes.\n\n**v1.21 (15 Feb 2023)**\n- `valcond()` fixed.\n- Error in gaps fixed.\n\n**v1.2 (02 Feb 2023)**\n- Unbalanced Sankey's are now allowed. This means that incoming and outgoing layers do not necessarily have to be equal. Outgoing can be larger than incoming.\n- A category can now also start in the middle.\n- Various bug fixes.\n\n**v1.1 (13 Dec 2022)**\n- Option `valformat()` renamed to just `format`. This aligns it with standard Stata usages.\n- A new option `offset()` added to displace x-axis on the right-hand side. Offset is given in percentage share of x-axis range. This allows rotated labels to be displaced properly.\n- Checks for missing bilateral flow combinations. Hitting a non-flow combo was causing the code to crash.\n\n**v1.0 (08 Dec 2022)**\n- Public release.\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasjadnaqvi%2Fstata-sankey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasjadnaqvi%2Fstata-sankey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasjadnaqvi%2Fstata-sankey/lists"}