py2ls 0.1.6.0__tar.gz → 0.1.6.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/PKG-INFO +1 -1
  2. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.DS_Store +0 -0
  3. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/logs/refs/remotes/origin/HEAD +12 -0
  4. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/ips.py +38 -5
  5. py2ls-0.1.6.2/py2ls/plot/catplot.py +437 -0
  6. py2ls-0.1.6.2/py2ls/plot/figsets.py +372 -0
  7. py2ls-0.1.6.2/py2ls/plot/get_color.py +68 -0
  8. py2ls-0.1.6.2/py2ls/plot/stdshade.py +227 -0
  9. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/pyproject.toml +1 -1
  10. py2ls-0.1.6.0/py2ls/plot.py +0 -665
  11. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/README.md +0 -0
  12. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/COMMIT_EDITMSG +0 -0
  13. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/FETCH_HEAD +0 -0
  14. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/HEAD +0 -0
  15. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/config +0 -0
  16. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/description +0 -0
  17. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/applypatch-msg.sample +0 -0
  18. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/commit-msg.sample +0 -0
  19. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/fsmonitor-watchman.sample +0 -0
  20. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/post-update.sample +0 -0
  21. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-applypatch.sample +0 -0
  22. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-commit.sample +0 -0
  23. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-merge-commit.sample +0 -0
  24. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-push.sample +0 -0
  25. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-rebase.sample +0 -0
  26. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-receive.sample +0 -0
  27. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/prepare-commit-msg.sample +0 -0
  28. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/push-to-checkout.sample +0 -0
  29. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/hooks/update.sample +0 -0
  30. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/index +0 -0
  31. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/info/exclude +0 -0
  32. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/logs/HEAD +0 -0
  33. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/logs/refs/heads/main +0 -0
  34. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/logs/refs/remotes/origin/main +0 -0
  35. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1 +0 -0
  36. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34 +0 -0
  37. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c +0 -0
  38. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed +0 -0
  39. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23 +0 -0
  40. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f +0 -0
  41. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8 +0 -0
  42. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0 +0 -0
  43. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59 +0 -0
  44. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7 +0 -0
  45. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46 +0 -0
  46. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4 +0 -0
  47. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad +0 -0
  48. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971 +0 -0
  49. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c +0 -0
  50. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173 +0 -0
  51. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/39/7ead045fbbcfb17c62019eb18fe21ed05dbee5 +0 -0
  52. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/3b/bd972aa7ad680858f8dfbd0f7fcd97756f0d6f +0 -0
  53. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc +0 -0
  54. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9 +0 -0
  55. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f +0 -0
  56. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b +0 -0
  57. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972 +0 -0
  58. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042 +0 -0
  59. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6 +0 -0
  60. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d +0 -0
  61. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0 +0 -0
  62. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e +0 -0
  63. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2 +0 -0
  64. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad +0 -0
  65. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a +0 -0
  66. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99 +0 -0
  67. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/62/4488173ed2c8936fa5cea3cf5dd3f26a30b86e +0 -0
  68. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a +0 -0
  69. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801 +0 -0
  70. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f +0 -0
  71. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd +0 -0
  72. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9 +0 -0
  73. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4 +0 -0
  74. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7 +0 -0
  75. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92 +0 -0
  76. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d +0 -0
  77. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963 +0 -0
  78. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373 +0 -0
  79. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab +0 -0
  80. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307 +0 -0
  81. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f +0 -0
  82. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/81/8f26b7bf042269729020cf944fc362d66ba27e +0 -0
  83. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/84/59071b722a255b774a80b27746033f8141ab39 +0 -0
  84. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/87/ef1fc3f7f1ddc4d0ab9b3e65381ce9f3388621 +0 -0
  85. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/8b/84f56978e1de8f2ae82abce5f8b3e182d365cd +0 -0
  86. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/8e/55a7d2b96184030211f20c9b9af201eefcac82 +0 -0
  87. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/91/c69ad88fe0ba94aa7859fb5f7edac5e6f1a3f7 +0 -0
  88. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b +0 -0
  89. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4 +0 -0
  90. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168 +0 -0
  91. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12 +0 -0
  92. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916 +0 -0
  93. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce +0 -0
  94. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3 +0 -0
  95. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/b0/56be4be89ba6b76949dd641df45bb7036050c8 +0 -0
  96. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/b0/9cd7856d58590578ee1a4f3ad45d1310a97f87 +0 -0
  97. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/b2/18e6a0f0f1c4df8cdefa9852058348abc713b7 +0 -0
  98. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/b5/61831c7dce8ea51e7ee6b6fa35745f14d8242d +0 -0
  99. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/b7/2c9e75ab7d0afe594664650aa8f6c772f5ac64 +0 -0
  100. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/bb/81ccc0513f18fc160b54a82861e9a80d23f4f6 +0 -0
  101. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/bb/934eb33bc1a8b85630bf680caffd99560c1b8f +0 -0
  102. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/bf/67907e337021ebff434e02b19b30a741c144af +0 -0
  103. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/c1/20fc812b9ad311c34a3608512d6a9d976bb48e +0 -0
  104. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/c4/cba65f1163661999ee4b8ed23342b63bc1300c +0 -0
  105. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591 +0 -0
  106. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141 +0 -0
  107. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4 +0 -0
  108. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d +0 -0
  109. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6 +0 -0
  110. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680 +0 -0
  111. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0 +0 -0
  112. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd +0 -0
  113. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98 +0 -0
  114. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359 +0 -0
  115. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff +0 -0
  116. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b +0 -0
  117. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b +0 -0
  118. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085 +0 -0
  119. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4 +0 -0
  120. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f +0 -0
  121. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e +0 -0
  122. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024 +0 -0
  123. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc +0 -0
  124. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d +0 -0
  125. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8 +0 -0
  126. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7 +0 -0
  127. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/refs/heads/main +0 -0
  128. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/refs/remotes/origin/HEAD +0 -0
  129. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.git/refs/remotes/origin/main +0 -0
  130. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.gitattributes +0 -0
  131. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/.gitignore +0 -0
  132. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/LICENSE +0 -0
  133. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/README.md +0 -0
  134. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/__init__.py +0 -0
  135. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/brain_atlas.py +0 -0
  136. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/chat.py +0 -0
  137. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/correlators.py +0 -0
  138. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/data/.DS_Store +0 -0
  139. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/data/db2ls_sql_chtsht.json +0 -0
  140. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/data/docs_links.json +0 -0
  141. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/data/lang_code_iso639.json +0 -0
  142. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/db2ls.py +0 -0
  143. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/doc.py +0 -0
  144. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/freqanalysis.py +0 -0
  145. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/netfinder.py +0 -0
  146. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/setuptools-70.1.0-py3-none-any.whl +0 -0
  147. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/sleep_events_detectors.py +0 -0
  148. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/stats.py +0 -0
  149. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/translator.py +0 -0
  150. {py2ls-0.1.6.0 → py2ls-0.1.6.2}/py2ls/wb_detector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2ls
3
- Version: 0.1.6.0
3
+ Version: 0.1.6.2
4
4
  Summary: py(thon)2(too)ls
5
5
  Author: Jianfeng
6
6
  Author-email: Jianfeng.Liu0413@gmail.com
@@ -123,3 +123,15 @@ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be1
123
123
  a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721298434 +0200 remote set-head
124
124
  a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721300398 +0200 remote set-head
125
125
  a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721302501 +0200 remote set-head
126
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721304466 +0200 remote set-head
127
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721306430 +0200 remote set-head
128
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721308395 +0200 remote set-head
129
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721310359 +0200 remote set-head
130
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721312323 +0200 remote set-head
131
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721314287 +0200 remote set-head
132
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721316252 +0200 remote set-head
133
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721318216 +0200 remote set-head
134
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721320179 +0200 remote set-head
135
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721322143 +0200 remote set-head
136
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721324108 +0200 remote set-head
137
+ a15389729850729fc7bd78a54f26fce77f30be12 a15389729850729fc7bd78a54f26fce77f30be12 Jianfeng Liu <macjianfeng@JFLMBP.cin.medizin.uni-tuebingen.de> 1721326072 +0200 remote set-head
@@ -879,8 +879,9 @@ def fload(fpath, kind=None, **kwargs):
879
879
  root = tree.getroot()
880
880
  return etree.tostring(root, pretty_print=True).decode()
881
881
 
882
- def load_csv(fpath, **kwargs):
883
- df = pd.read_csv(fpath, **kwargs)
882
+ def load_csv(fpath, engine='pyarrow',**kwargs):
883
+ print(f"engine={engine}")
884
+ df = pd.read_csv(fpath, engine=engine, **kwargs)
884
885
  return df
885
886
 
886
887
  def load_xlsx(fpath, **kwargs):
@@ -2043,7 +2044,17 @@ def figsets(*args,**kwargs):
2043
2044
  box=['right','bottom'],
2044
2045
  xrot=-45,
2045
2046
  yangle=20,
2046
- font_sz = 2
2047
+ font_sz = 2,
2048
+ legend=dict(labels=['group_a','group_b'],
2049
+ loc='upper left',
2050
+ edgecolor='k',
2051
+ facecolor='r',
2052
+ title='title',
2053
+ fancybox=1,
2054
+ shadow=1,
2055
+ ncols=4,
2056
+ bbox_to_anchor=[-0.5,0.7],
2057
+ alignment='left')
2047
2058
  )
2048
2059
  """
2049
2060
  fig = plt.gcf()
@@ -2107,6 +2118,10 @@ def figsets(*args,**kwargs):
2107
2118
  "tic" not in key.lower() and "tk" not in key.lower()
2108
2119
  ):
2109
2120
  ax.set_zlabel(value, fontname=fontname)
2121
+ if key=='xlabel' and isinstance(value,dict):
2122
+ ax.set_xlabel(**value)
2123
+ if key=='ylabel' and isinstance(value,dict):
2124
+ ax.set_ylabel(**value)
2110
2125
  # tick location
2111
2126
  if "tic" in key.lower() or "tk" in key.lower():
2112
2127
  if ("loc" in key.lower()) or ("po" in key.lower()):
@@ -2155,9 +2170,22 @@ def figsets(*args,**kwargs):
2155
2170
  # rotation
2156
2171
  if "angle" in key.lower() or ("rot" in key.lower()):
2157
2172
  if "x" in key.lower():
2158
- ax.tick_params(axis="x", rotation=value)
2173
+ if value in [0,90,180,270]:
2174
+ ax.tick_params(axis="x", rotation=value)
2175
+ for tick in ax.get_xticklabels():
2176
+ tick.set_horizontalalignment('center')
2177
+ elif value >0:
2178
+ ax.tick_params(axis="x", rotation=value)
2179
+ for tick in ax.get_xticklabels():
2180
+ tick.set_horizontalalignment('right')
2181
+ elif value <0:
2182
+ ax.tick_params(axis='x', rotation=value)
2183
+ for tick in ax.get_xticklabels():
2184
+ tick.set_horizontalalignment('left')
2159
2185
  if "y" in key.lower():
2160
2186
  ax.tick_params(axis="y", rotation=value)
2187
+ for tick in ax.get_yticklabels():
2188
+ tick.set_horizontalalignment('right')
2161
2189
 
2162
2190
  if "bo" in key in key: # box setting, and ("p" in key or "l" in key):
2163
2191
  if isinstance(value, (str, list)):
@@ -2278,7 +2306,12 @@ def figsets(*args,**kwargs):
2278
2306
  if "c" in key.lower() and ("sp" in key.lower() or "ax" in key.lower()):# spine color
2279
2307
  for loc, spi in ax.spines.items():
2280
2308
  spi.set_color(value)
2281
-
2309
+ if 'leg' in key.lower(): # legend
2310
+ legend_kws = kwargs.get('legend', None)
2311
+ if legend_kws:
2312
+ # https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.legend.html
2313
+ ax.legend(**legend_kws)
2314
+
2282
2315
  for arg in args:
2283
2316
  if isinstance(arg,matplotlib.axes._axes.Axes):
2284
2317
  ax=arg
@@ -0,0 +1,437 @@
1
+ import matplotlib.pyplot as plt
2
+ import numpy as np
3
+ from matplotlib.colors import to_rgba
4
+ from scipy.stats import gaussian_kde
5
+
6
+ def catplot(data, *args, **kwargs):
7
+ """
8
+ catplot(data, opt=None, ax=None)
9
+
10
+ Args:
11
+ data (array): data matrix
12
+ """
13
+ def plot_bars(data_m, opt_b, xloc, ax):
14
+ bar_positions = get_positions(xloc, opt_b['loc'], opt_b['x_width'], data.shape[0])
15
+ bar_positions=np.nanmean(bar_positions,axis=0)
16
+ for i, (x, y) in enumerate(zip(bar_positions, data_m)):
17
+ color = to_rgba(opt_b['FaceColor'][i % len(opt_b['FaceColor'])])
18
+ ax.bar(x, y,
19
+ width=opt_b['x_width'],
20
+ color=color,
21
+ edgecolor=opt_b['EdgeColor'],
22
+ alpha=opt_b['FaceAlpha'])
23
+
24
+ def plot_errors(data, data_m, opt_e, xloc, ax):
25
+ error_positions = get_positions(xloc, opt_e['loc'], opt_e['x_width'], data.shape[0])
26
+ error_positions=np.nanmean(error_positions,axis=0)
27
+ errors = np.nanstd(data, axis=0)
28
+ if opt_e['error'] == 'sem':
29
+ errors /= np.sqrt(np.sum(~np.isnan(data),axis=0))
30
+
31
+ if not isinstance(opt_e['FaceColor'],list):
32
+ opt_e['FaceColor']=[opt_e['FaceColor']]
33
+ if not isinstance(opt_e['MarkerEdgeColor'],list):
34
+ opt_e['MarkerEdgeColor']=[opt_e['MarkerEdgeColor']]
35
+ for i, (x, y, err) in enumerate(zip(error_positions, data_m, errors)):
36
+ ax.errorbar(x, y, yerr=err,
37
+ fmt=opt_e['Marker'],
38
+ ecolor=opt_e['LineColor'],
39
+ elinewidth=opt_e['LineWidth'],
40
+ lw=opt_e['LineWidth'],
41
+ ls=opt_e['LineStyle'],
42
+ capsize=opt_e['CapSize'],
43
+ capthick=opt_e['CapLineWidth'],
44
+ markersize=opt_e['MarkerSize'],
45
+ mec=opt_e['MarkerEdgeColor'][i % len(opt_e['MarkerEdgeColor'])],
46
+ mfc=opt_e['FaceColor'][i % len(opt_e['FaceColor'])],
47
+ visible=opt_e['Visible']
48
+ )
49
+
50
+ def plot_scatter(data, opt_s, xloc, ax):
51
+ scatter_positions = get_positions(xloc, opt_s['loc'], opt_s['x_width'], data.shape[0])
52
+ for i, (x, y) in enumerate(zip(scatter_positions.T, data.T)):
53
+ color = to_rgba(opt_s['FaceColor'][i % len(opt_s['FaceColor'])])
54
+ ax.scatter(x, y,
55
+ color=color,
56
+ alpha=opt_s['FaceAlpha'],
57
+ edgecolor=opt_s['MarkerEdgeColor'],
58
+ s=opt_s['MarkerSize'],
59
+ marker=opt_s['Marker']
60
+ )
61
+
62
+ def plot_boxplot(data, bx_opt, xloc,ax):
63
+ if 'l' in bx_opt['loc']:
64
+ X_bx = xloc - bx_opt['x_width']
65
+ elif 'r' in bx_opt['loc']:
66
+ X_bx = xloc + bx_opt['x_width']
67
+ elif 'i' in bx_opt['loc']:
68
+ X_bx = xloc
69
+ X_bx[:, 0] += bx_opt['x_width']
70
+ X_bx[:, -1] -= bx_opt['x_width']
71
+ elif 'o' in bx_opt['loc']:
72
+ X_bx = xloc
73
+ X_bx[:, 0] -= bx_opt['x_width']
74
+ X_bx[:, -1] += bx_opt['x_width']
75
+ elif 'c' in bx_opt['loc'] or 'm' in bx_opt['loc']:
76
+ X_bx = xloc
77
+ else:
78
+ X_bx = xloc
79
+
80
+
81
+ boxprops = dict(color=bx_opt['EdgeColor'],
82
+ linewidth=bx_opt['BoxLineWidth'])
83
+ flierprops = dict(marker=bx_opt['OutlierMarker'],
84
+ markerfacecolor=bx_opt['OutlierColor'],
85
+ markersize=bx_opt['OutlierSize'])
86
+ whiskerprops = dict(linestyle=bx_opt['WhiskerLineStyle'],
87
+ color=bx_opt['WhiskerLineColor'],
88
+ linewidth=bx_opt['WhiskerLineWidth'])
89
+ capprops = dict(color=bx_opt['CapLineColor'],
90
+ linewidth=bx_opt['CapLineWidth'],)
91
+ medianprops = dict(linestyle=bx_opt['MedianLineStyle'],
92
+ color=bx_opt['MedianLineColor'],
93
+ linewidth=bx_opt['MedianLineWidth'])
94
+ meanprops = dict(linestyle=bx_opt['MeanLineStyle'],
95
+ color=bx_opt['MeanLineColor'],
96
+ linewidth=bx_opt['MeanLineWidth'])
97
+ bxp = ax.boxplot(data,
98
+ positions=X_bx,
99
+ notch=bx_opt['Notch'],
100
+ patch_artist=True,
101
+ boxprops=boxprops,
102
+ flierprops=flierprops,
103
+ whiskerprops=whiskerprops,
104
+ capwidths=bx_opt['CapSize'],
105
+ showfliers = bx_opt['Outliers'],
106
+ showcaps = bx_opt['Caps'],
107
+ capprops=capprops,
108
+ medianprops=medianprops,
109
+ meanline=bx_opt['MeanLine'],
110
+ showmeans=bx_opt['MeanLine'],
111
+ meanprops =meanprops,
112
+ widths=bx_opt['x_width'])
113
+
114
+ if bx_opt['BoxLineWidth'] < 0.1:
115
+ bx_opt['EdgeColor'] = 'none'
116
+ else:
117
+ bx_opt['EdgeColor'] = bx_opt['EdgeColor']
118
+
119
+ for patch, color in zip(bxp['boxes'], bx_opt['FaceColor']):
120
+ patch.set_facecolor(to_rgba(color, bx_opt['FaceAlpha']))
121
+
122
+ if bx_opt['MedianLineTop']:
123
+ ax.set_children(ax.get_children()[::-1]) # move median line forward
124
+
125
+ def plot_violin(data, opt_v, xloc, ax):
126
+ violin_positions = get_positions(xloc, opt_v['loc'], opt_v['x_width'], data.shape[0])
127
+ violin_positions = np.nanmean(violin_positions, axis=0)
128
+ for i, (x, ys) in enumerate(zip(violin_positions, data.T)):
129
+ ys = ys[~np.isnan(ys)]
130
+ if len(ys) > 1:
131
+ kde = gaussian_kde(ys, bw_method=opt_v['BandWidth'])
132
+ min_val, max_val = ys.min(), ys.max()
133
+ y_vals = np.linspace(min_val, max_val, opt_v['NumPoints'])
134
+ kde_vals = kde(y_vals)
135
+ kde_vals = kde_vals / kde_vals.max() * opt_v['x_width']
136
+ if 'r' in opt_v['loc'].lower():
137
+ ax.fill_betweenx(y_vals, x, x + kde_vals,
138
+ color=opt_v['FaceColor'][i % len(opt_v['FaceColor'])],
139
+ alpha=opt_v['FaceAlpha'],
140
+ edgecolor=opt_v['EdgeColor'])
141
+ elif 'l' in opt_v['loc'].lower() and not 'f' in opt_v['loc'].lower() :
142
+ ax.fill_betweenx(y_vals, x - kde_vals, x,
143
+ color=opt_v['FaceColor'][i % len(opt_v['FaceColor'])],
144
+ alpha=opt_v['FaceAlpha'],
145
+ edgecolor=opt_v['EdgeColor'])
146
+ elif 'o' in opt_v['loc'].lower() or 'both' in opt_v['loc'].lower() :
147
+ ax.fill_betweenx(y_vals, x - kde_vals, x + kde_vals,
148
+ color=opt_v['FaceColor'][i % len(opt_v['FaceColor'])],
149
+ alpha=opt_v['FaceAlpha'],
150
+ edgecolor=opt_v['EdgeColor'])
151
+ elif 'i' in opt_v['loc'].lower():
152
+ if i % 2 == 1: # odd number
153
+ ax.fill_betweenx(y_vals, x -kde_vals, x,
154
+ color=opt_v['FaceColor'][i % len(opt_v['FaceColor'])],
155
+ alpha=opt_v['FaceAlpha'],
156
+ edgecolor=opt_v['EdgeColor'])
157
+ else:
158
+ ax.fill_betweenx(y_vals, x, x+kde_vals,
159
+ color=opt_v['FaceColor'][i % len(opt_v['FaceColor'])],
160
+ alpha=opt_v['FaceAlpha'],
161
+ edgecolor=opt_v['EdgeColor'])
162
+ elif 'f' in opt_v['loc'].lower():
163
+ ax.fill_betweenx(y_vals, x - kde_vals, x + kde_vals,
164
+ color=opt_v['FaceColor'][i % len(opt_v['FaceColor'])],
165
+ alpha=opt_v['FaceAlpha'],
166
+ edgecolor=opt_v['EdgeColor'])
167
+
168
+ def plot_lines(data, opt_l, opt_s, ax):
169
+ scatter_positions = get_positions(xloc, opt_s['loc'], opt_s['x_width'], data.shape[0])
170
+ for incol in range(data.shape[1]-1):
171
+ for irow in range(data.shape[0]):
172
+ if not np.isnan(data[irow, incol]):
173
+ if opt_l['LineStyle'] is not None and not opt_l['LineStyle'] =='none':
174
+ x_data = [scatter_positions[irow, incol], scatter_positions[irow, incol + 1]]
175
+ y_data = [data[irow, incol], data[irow, incol + 1]]
176
+
177
+
178
+ ax.plot(x_data, y_data,
179
+ color=opt_l['LineColor'],
180
+ linestyle=opt_l['LineStyle'],
181
+ linewidth=opt_l['LineWidth'],
182
+ alpha=opt_l['LineAlpha'])
183
+
184
+ def get_positions(xloc, loc_type, x_width, n_row=None):
185
+ if 'rand' in loc_type:
186
+ scatter_positions = np.zeros((n_row, len(xloc)))
187
+ np.random.seed(111)
188
+ for i, x in enumerate(xloc):
189
+ scatter_positions[:, i] = np.random.uniform(x - x_width, x + x_width, n_row)
190
+ return scatter_positions
191
+ elif 'l' in loc_type:
192
+ return np.tile(xloc - x_width,(n_row,1))
193
+ elif 'r' in loc_type and not 'd' in loc_type:
194
+ return np.tile(xloc + x_width,(n_row,1))
195
+ elif 'i' in loc_type:
196
+ return np.tile(np.concatenate([xloc[:1] + x_width, xloc[1:-1], xloc[-1:] - x_width]),(n_row,1))
197
+ elif 'o' in loc_type:
198
+ return np.tile(np.concatenate([xloc[:1] - x_width, xloc[1:-1], xloc[-1:] + x_width]),(n_row,1))
199
+ else:
200
+ return np.tile(xloc,(n_row,1))
201
+
202
+ opt = kwargs.get('opt',{})
203
+ ax = kwargs.get('ax',None)
204
+ if 'ax' not in locals() or ax is None:
205
+ ax=plt.gca()
206
+
207
+ default_colors = np.array([
208
+ [0, 0, 0],
209
+ [234, 37, 46],
210
+ [0, 154, 222],
211
+ [175, 89, 186],
212
+ [255, 198, 37],
213
+ [242, 133, 34]
214
+ ]) / 255.0
215
+
216
+ opt.setdefault('c', default_colors)
217
+ if len(opt['c']) < data.shape[1]:
218
+ additional_colors = plt.cm.winter(np.linspace(0, 1, data.shape[1] - len(opt['c'])))
219
+ opt['c'] = np.vstack([opt['c'], additional_colors[:, :3]])
220
+
221
+ opt.setdefault('loc', {})
222
+ opt['loc'].setdefault('go', 0)
223
+ opt['loc'].setdefault('xloc', np.arange(1, data.shape[1] + 1))
224
+
225
+ # export setting
226
+ opt.setdefault('export', False)
227
+ opt['export'].setdefault('path', None)
228
+ print(opt['export'])
229
+
230
+ opt.setdefault('b', {})
231
+ opt['b'].setdefault('go', 0)
232
+ opt['b'].setdefault('EdgeColor', 'k')
233
+ opt['b'].setdefault('FaceAlpha', 1)
234
+ opt['b'].setdefault('EdgeAlpha', 1)
235
+ opt['b'].setdefault('LineStyle', '-')
236
+ opt['b'].setdefault('x_width', 0.5)
237
+ opt['b'].setdefault('ShowBaseLine', 'off')
238
+ opt['b'].setdefault('loc', 'c')
239
+ opt['b'].setdefault('FaceColor', opt['c'])
240
+
241
+ opt.setdefault('e', {})
242
+ opt['e'].setdefault('go', 1)
243
+ opt['e'].setdefault('LineWidth', 1)
244
+ opt['e'].setdefault('CapLineWidth', 1)
245
+ opt['e'].setdefault('CapSize', opt['b']['x_width'] * 100 * 0.1)
246
+ opt['e'].setdefault('Marker', 'none')
247
+ opt['e'].setdefault('LineStyle', 'none')
248
+ opt['e'].setdefault('LineColor', 'k')
249
+ opt['e'].setdefault('LineJoin', 'round')
250
+ opt['e'].setdefault('MarkerSize', 'auto')
251
+ opt['e'].setdefault('FaceColor', opt['c'])
252
+ opt['e'].setdefault('MarkerEdgeColor', 'none')
253
+ opt['e'].setdefault('Visible', True)
254
+ opt['e'].setdefault('Orientation', 'vertical')
255
+ opt['e'].setdefault('error', 'sem')
256
+ opt['e'].setdefault('loc', 'c')
257
+ opt['e'].setdefault('x_width', opt['b']['x_width'] / 5)
258
+ opt['e'].setdefault('cap_dir', 'b')
259
+
260
+ opt.setdefault('s', {})
261
+ opt['s'].setdefault('go', 1)
262
+ opt['s'].setdefault('x_width', opt['b']['x_width'] / 5)
263
+ opt['s'].setdefault('Marker', 'o')
264
+ opt['s'].setdefault('MarkerSize', 6) # Set default size for markers
265
+ opt['s'].setdefault('LineWidth', 1)
266
+ opt['s'].setdefault('FaceColor', opt['c'])
267
+ opt['s'].setdefault('FaceAlpha', 0.6)
268
+ opt['s'].setdefault('loc', 'random')
269
+ opt['s'].setdefault('MarkerEdgeColor', None)
270
+
271
+ opt.setdefault('bx', {})
272
+ opt['bx'].setdefault('go', 0)
273
+ opt['bx'].setdefault('EdgeColor', 'k')
274
+ opt['bx'].setdefault('FaceAlpha', 1)
275
+ opt['bx'].setdefault('EdgeAlpha', 1)
276
+ opt['bx'].setdefault('LineStyle', '-')
277
+ opt['bx'].setdefault('x_width', 0.5)
278
+ opt['bx'].setdefault('ShowBaseLine', 'off')
279
+ opt['bx'].setdefault('loc', 'c')
280
+ opt['bx'].setdefault('FaceColor', opt['c'])
281
+ opt['bx'].setdefault('Notch', False)
282
+ opt['bx'].setdefault('MedianStyle', 'line')
283
+ opt['bx'].setdefault('Outliers', 'on')
284
+ opt['bx'].setdefault('OutlierMarker', '+')
285
+ opt['bx'].setdefault('OutlierColor', 'r')
286
+ opt['bx'].setdefault('OutlierSize', 6)
287
+ opt['bx'].setdefault('PlotStyle', 'traditional')
288
+ opt['bx'].setdefault('FactorDirection', 'auto')
289
+ opt['bx'].setdefault('Whisker', 1.5)
290
+ opt['bx'].setdefault('Orientation', 'vertical')
291
+ opt['bx'].setdefault('BoxLineWidth', 1.5)
292
+ opt['bx'].setdefault('FaceColor', 'k')
293
+ opt['bx'].setdefault('WhiskerLineStyle', '-')
294
+ opt['bx'].setdefault('WhiskerLineColor', 'k')
295
+ opt['bx'].setdefault('WhiskerLineWidth', 1.5)
296
+ opt['bx'].setdefault('Caps', True)
297
+ opt['bx'].setdefault('CapLineColor', 'k')
298
+ opt['bx'].setdefault('CapLineWidth', 1.5)
299
+ opt['bx'].setdefault('CapSize', 0.35)
300
+ opt['bx'].setdefault('MedianLineStyle', '-')
301
+ opt['bx'].setdefault('MedianLineColor', 'k')
302
+ opt['bx'].setdefault('MedianLineWidth', 1.5)
303
+ opt['bx'].setdefault('MedianLineTop', False)
304
+ opt['bx'].setdefault('MeanLine', False)
305
+ opt['bx'].setdefault('showmeans', opt['bx']['MeanLine'])
306
+ opt['bx'].setdefault('MeanLineStyle', '-')
307
+ opt['bx'].setdefault('MeanLineColor', 'b')
308
+ opt['bx'].setdefault('MeanLineWidth', 1.5)
309
+
310
+ # Violin plot options
311
+ opt.setdefault('v', {})
312
+ opt['v'].setdefault('go', 1)
313
+ opt['v'].setdefault('x_width', 0.3)
314
+ opt['v'].setdefault('loc', 'r')
315
+ opt['v'].setdefault('EdgeColor', 'none')
316
+ opt['v'].setdefault('FaceColor', opt['c'])
317
+ opt['v'].setdefault('FaceAlpha', 0.3)
318
+ opt['v'].setdefault('BandWidth', 'scott')
319
+ opt['v'].setdefault('Function', 'pdf')
320
+ opt['v'].setdefault('Kernel', 'gau')
321
+ opt['v'].setdefault('NumPoints', 500)
322
+ opt['v'].setdefault('BoundaryCorrection', 'reflection')
323
+
324
+ # line plot options
325
+ opt.setdefault('l', {})
326
+ opt['l'].setdefault('go', 0)
327
+ opt['l'].setdefault('LineStyle', '-')
328
+ opt['l'].setdefault('LineColor', 'k')
329
+ opt['l'].setdefault('LineWidth', 0.5)
330
+ opt['l'].setdefault('LineAlpha', 0.5)
331
+
332
+ data_m = np.nanmean(data, axis=0)
333
+ nr, nc = data.shape
334
+
335
+ xloc = opt['loc']['xloc']
336
+
337
+ if opt['b']['go']:
338
+ plot_bars(data_m, opt['b'], xloc, ax)
339
+
340
+ if opt['e']['go']:
341
+ plot_errors(data, data_m, opt['e'], xloc, ax)
342
+
343
+ if opt['s']['go']:
344
+ plot_scatter(data, opt['s'], xloc, ax)
345
+
346
+ if opt['bx']['go']:
347
+ plot_boxplot(data, opt['bx'], xloc, ax)
348
+ if opt['v']['go']:
349
+ plot_violin(data, opt['v'], xloc, ax)
350
+ if opt['l']['go'] and opt['s']['go']:
351
+ plot_lines(data, opt['l'], opt['s'], ax)
352
+
353
+ return ax
354
+
355
+ # from py2ls.ips import get_color,figsets
356
+ # opt={}
357
+ # opt = {
358
+ # 'export':{'path':get_cwd()},
359
+ # 'c': get_color(5,cmap='jet',by='linspace'), # Custom colors for 3 categories
360
+ # 'b': {
361
+ # 'go': 0,
362
+ # 'x_width': 0.85,
363
+ # 'FaceAlpha': 0.7,
364
+ # 'EdgeColor':'none'
365
+ # },
366
+ # 'e': {
367
+ # 'loc':'r',
368
+ # 'go': 1,
369
+ # 'error': 'sem',
370
+ # 'Marker':'d',
371
+ # 'CapSize': 1,
372
+ # 'LineWidth':1,
373
+ # 'CapLineWidth':8,
374
+ # 'LineStyle':'--',
375
+ # 'MarkerSize':6,
376
+ # 'LineColor':'k',
377
+ # 'FaceColor':get_color(10),
378
+ # 'MarkerEdgeColor':'none',
379
+ # 'Visible':True
380
+ # },
381
+ # 's': {
382
+ # 'go': 1,
383
+ # 'x_width':0.2,
384
+ # 'loc':'random',
385
+ # 'Marker': 'o',
386
+ # # 'MarkerSize': 20,
387
+ # 'FaceAlpha': 1,
388
+ # 'FaceColor':'k',
389
+ # 'LineWidth':1
390
+
391
+ # },
392
+ # 'bx':{
393
+ # 'go':1,
394
+ # 'FaceAlpha':0.8,
395
+ # 'EdgeColor':'none',
396
+ # 'loc':'c',
397
+ # 'x_width':0.2,
398
+ # 'WhiskerLineWidth':1,
399
+ # 'MedianLineWidth':2,
400
+ # # 'MedianLineColor':'r',
401
+ # 'OutlierMarker':'+',
402
+ # 'OutlierColor':'r',
403
+ # 'CapSize':.2,
404
+ # # 'Caps':False,
405
+ # # 'CapLineColor':'r',
406
+ # # 'CapLineWidth':8,
407
+ # # 'MeanLine':True,
408
+ # # 'FaceColor':['r','g','b','m','c']
409
+ # },
410
+ # 'v':{
411
+ # 'go':0,
412
+ # 'loc':'r',
413
+ # 'x_width':0.2,
414
+ # 'FaceAlpha':0.51,
415
+ # },
416
+ # 'l':{
417
+ # 'go':1,
418
+ # 'LineColor':'k'
419
+ # }
420
+ # }
421
+ # data1 = np.random.rand(10, 5)
422
+ # data2 = np.random.rand(10, 5)
423
+ # fig, axs=plt.subplots(1,2,figsize=(6,2.5))
424
+ # catplot(data1, opt=opt,ax=axs[0])
425
+ # catplot(data2, opt=opt,ax=axs[1])
426
+ # figsets(sp=5,
427
+ # ax=axs[0],
428
+ # xticks=np.arange(1,6,1),
429
+ # xtickslabel=['glua1','glua2','a','b','c'],
430
+ # xlabel='proteins',
431
+ # xangle=90,
432
+ # yticks=np.arange(0,2,0.5),
433
+ # xlim=[0.75, 5.1],
434
+ # ticks=dict(pad=1,c='k'))
435
+
436
+ # figsave("/Users/macjianfeng/Dropbox/Downloads/",'test.pdf')
437
+