py2ls 0.1.6.1__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 (149) hide show
  1. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/PKG-INFO +1 -1
  2. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/ips.py +17 -3
  3. py2ls-0.1.6.2/py2ls/plot/catplot.py +437 -0
  4. py2ls-0.1.6.1/py2ls/plot.py → py2ls-0.1.6.2/py2ls/plot/figsets.py +39 -319
  5. py2ls-0.1.6.2/py2ls/plot/get_color.py +68 -0
  6. py2ls-0.1.6.2/py2ls/plot/stdshade.py +227 -0
  7. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/pyproject.toml +1 -1
  8. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/README.md +0 -0
  9. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.DS_Store +0 -0
  10. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/COMMIT_EDITMSG +0 -0
  11. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/FETCH_HEAD +0 -0
  12. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/HEAD +0 -0
  13. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/config +0 -0
  14. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/description +0 -0
  15. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/applypatch-msg.sample +0 -0
  16. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/commit-msg.sample +0 -0
  17. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/fsmonitor-watchman.sample +0 -0
  18. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/post-update.sample +0 -0
  19. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-applypatch.sample +0 -0
  20. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-commit.sample +0 -0
  21. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-merge-commit.sample +0 -0
  22. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-push.sample +0 -0
  23. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-rebase.sample +0 -0
  24. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/pre-receive.sample +0 -0
  25. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/prepare-commit-msg.sample +0 -0
  26. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/push-to-checkout.sample +0 -0
  27. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/hooks/update.sample +0 -0
  28. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/index +0 -0
  29. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/info/exclude +0 -0
  30. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/logs/HEAD +0 -0
  31. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/logs/refs/heads/main +0 -0
  32. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/logs/refs/remotes/origin/HEAD +0 -0
  33. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/logs/refs/remotes/origin/main +0 -0
  34. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/01/d5bd8065e6860c0bd23ff9fa57161806a099e1 +0 -0
  35. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/09/08da26de58c114225ad81f484b80bf5d351b34 +0 -0
  36. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/0b/409e1bc918277010f5679b402d1d1dda53e15c +0 -0
  37. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/14/449a0e6ba4ea2f1a73acf63ef91c9c6193f9ed +0 -0
  38. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/15/a8e468aacfcb440e090020f36d0b985d45da23 +0 -0
  39. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/1a/b4585881a6a42889f01aa0cfe25fd5acfaf46f +0 -0
  40. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/1c/3f92adda34344bcbbbf9d409c79855ae2aaea8 +0 -0
  41. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/1d/fe9d9633b24ea560354f4f93d39c6e5f163ea0 +0 -0
  42. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/20/72c28e83f4347959d29f7b3a6c1fc3e4ee6b59 +0 -0
  43. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/24/6b368b986f758630c46dc02b7fa512b53422f7 +0 -0
  44. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/25/b796accd261b9135fd32a2c00785f68edf6c46 +0 -0
  45. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/30/a2f8da47ee947811dc8d993f5a06a45de374f4 +0 -0
  46. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/32/fd627b62fad7cf3b2f9e34ab9777126a0987ad +0 -0
  47. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/36/b4a1b7403abc6c360f8fe2cb656ab945254971 +0 -0
  48. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/36/e56a361f526eafa59c5235a5c990bf288b5f9c +0 -0
  49. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/36/ef43e50009e59db11812c258846d9e38718173 +0 -0
  50. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/39/7ead045fbbcfb17c62019eb18fe21ed05dbee5 +0 -0
  51. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/3b/bd972aa7ad680858f8dfbd0f7fcd97756f0d6f +0 -0
  52. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/3c/bbe5f4173d165127b9ad96119f1ec24c306ffc +0 -0
  53. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/3f/d6561300938afbb3d11976cf9c8f29549280d9 +0 -0
  54. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/41/dcf4b3bf0460946b2da93776cf9e836d62178f +0 -0
  55. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/43/dbd49b2ee367c5434dd545e3b5795434f2ef0b +0 -0
  56. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/48/a88fc5806305d0bb0755ee6801161b79696972 +0 -0
  57. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/4f/7afb40dff2153d857fc85748c2eecb85125042 +0 -0
  58. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/50/08ddfcf53c02e82d7eee2e57c38e5672ef89f6 +0 -0
  59. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/53/e0deb1cb4c2c606bced6e7f9a66b0fda60980d +0 -0
  60. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/56/e4e8b2d5545e0256090f45aa8fc42c5fe067d0 +0 -0
  61. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/57/bd1c0199483ab316235b094543b85edec6c35e +0 -0
  62. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/58/20a729045d4dc7e37ccaf8aa8eec126850afe2 +0 -0
  63. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/5a/192565abf89c9d765af846ce6d53a92b1ce7ad +0 -0
  64. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/60/f273eb1c412d916fa3f11318a7da7a9911b52a +0 -0
  65. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/61/570cec8c061abe74121f27f5face6c69b98f99 +0 -0
  66. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/62/4488173ed2c8936fa5cea3cf5dd3f26a30b86e +0 -0
  67. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/62/7c81b23b4e56e87b042b650b0103653cc9e34a +0 -0
  68. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/62/d90ccf8cbefdc2e4fd475e7c6f4f76e9fdf801 +0 -0
  69. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/63/100154b27846e8010e55b6bf4b3d7762c14c5f +0 -0
  70. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/64/27a4edff08f93d98f511418423f09f2ab90bcd +0 -0
  71. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/68/6df3072c8b025fb18106ed2df505994ad062a9 +0 -0
  72. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/69/13c452ca319f7cbf6a0836dc10a5bb033c84e4 +0 -0
  73. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/6a/52e747a2b349b128d1490d9e896d2323818eb7 +0 -0
  74. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/6b/7fde264d93a7a0986d394c46c7650d0ce2ab92 +0 -0
  75. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/6c/cebb29b7f3f5b0c889f6dadbf9ff066554587d +0 -0
  76. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/6d/ee29dbdcc84edeeacede105110446f3ccac963 +0 -0
  77. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/71/36b2074a2754be8b58127d82250e5b37e3c373 +0 -0
  78. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/78/3d4167bc95c9d2175e0df03ef1c1c880ba75ab +0 -0
  79. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/79/7ae089b2212a937840e215276005ce76881307 +0 -0
  80. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/7e/5956c806b5edc344d46dab599dec337891ba1f +0 -0
  81. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/81/8f26b7bf042269729020cf944fc362d66ba27e +0 -0
  82. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/84/59071b722a255b774a80b27746033f8141ab39 +0 -0
  83. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/87/ef1fc3f7f1ddc4d0ab9b3e65381ce9f3388621 +0 -0
  84. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/8b/84f56978e1de8f2ae82abce5f8b3e182d365cd +0 -0
  85. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/8e/55a7d2b96184030211f20c9b9af201eefcac82 +0 -0
  86. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/91/c69ad88fe0ba94aa7859fb5f7edac5e6f1a3f7 +0 -0
  87. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/94/74152b4b463d70ae5ad07f0c658be3e296026b +0 -0
  88. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/97/1aef09ea939f46b60b9646f8d524c78a9220f4 +0 -0
  89. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/9d/0df52899fe95279059286d9c0ec42287edc168 +0 -0
  90. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/a1/5389729850729fc7bd78a54f26fce77f30be12 +0 -0
  91. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/a4/63fdd23e5efd713db8a71f316f3a1c7bd60916 +0 -0
  92. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/a5/ec8f74642fbba27f7ea78c53b372ae0c7dedce +0 -0
  93. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/a7/3e13eafee65c5b8d73ad2d3ea46d0eee82f0d3 +0 -0
  94. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/b0/56be4be89ba6b76949dd641df45bb7036050c8 +0 -0
  95. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/b0/9cd7856d58590578ee1a4f3ad45d1310a97f87 +0 -0
  96. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/b2/18e6a0f0f1c4df8cdefa9852058348abc713b7 +0 -0
  97. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/b5/61831c7dce8ea51e7ee6b6fa35745f14d8242d +0 -0
  98. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/b7/2c9e75ab7d0afe594664650aa8f6c772f5ac64 +0 -0
  99. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/bb/81ccc0513f18fc160b54a82861e9a80d23f4f6 +0 -0
  100. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/bb/934eb33bc1a8b85630bf680caffd99560c1b8f +0 -0
  101. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/bf/67907e337021ebff434e02b19b30a741c144af +0 -0
  102. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/c1/20fc812b9ad311c34a3608512d6a9d976bb48e +0 -0
  103. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/c4/cba65f1163661999ee4b8ed23342b63bc1300c +0 -0
  104. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/c6/7f17e5707313600efcb85e9a3fedea35dba591 +0 -0
  105. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/c6/f32aced880bd165a251cb52b26b0c1107e2141 +0 -0
  106. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/cd/822b3574a88ebdd1ed82fd6983f37e626d52b4 +0 -0
  107. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/cf/0c0d9c6fb09473aaeb7f7e2edbd770c3f2ef3d +0 -0
  108. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/d6/9ab1c4aadf279936dd778e8346ba60f74705b6 +0 -0
  109. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/d8/4688b54c0040a30976b3a6540bc47adf7ce680 +0 -0
  110. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/d9/005f2cc7fc4e65f14ed5518276007c08cf2fd0 +0 -0
  111. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/d9/c2403fd166ce791b4e9d0c6792ed8342c71fcd +0 -0
  112. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/d9/dfa5aee51e92a541b707e8e7baea6f06deff98 +0 -0
  113. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/db/141dbaa93594df2a8156182f361ee4db829359 +0 -0
  114. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/db/ffa8ea7bda721d0cee7b9e4ce5b2ef927733ff +0 -0
  115. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/dd/87fb5f606fe380d81e6fe3a2c98f9f99e3e09b +0 -0
  116. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/df/e0770424b2a19faf507a501ebfc23be8f54e7b +0 -0
  117. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/e3/1356f90ea6dd0577b5e0b40b206319adcbf085 +0 -0
  118. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/e3/5a4dafc50850cacac7bf76c56db2715cbda2c4 +0 -0
  119. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/e9/391ffe371f1cc43b42ef09b705d9c767c2e14f +0 -0
  120. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/f1/e50757fddc28b445545dc7e2759b54cdd0f42e +0 -0
  121. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/f4/b64d3107b39e3ad6f540c6607004ea34e6c024 +0 -0
  122. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/f7/c98ba5c2f903e603b1f5e63d49fbc8a43815cc +0 -0
  123. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/f9/045a08e96eb76848fc4d68e3e3e687cca39a2d +0 -0
  124. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/fa/147e6bb78a2e8db241d231295fd7f1ed061af8 +0 -0
  125. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/objects/fc/292e793ecfd42240ac43be407023bd731fa9e7 +0 -0
  126. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/refs/heads/main +0 -0
  127. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/refs/remotes/origin/HEAD +0 -0
  128. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.git/refs/remotes/origin/main +0 -0
  129. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.gitattributes +0 -0
  130. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/.gitignore +0 -0
  131. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/LICENSE +0 -0
  132. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/README.md +0 -0
  133. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/__init__.py +0 -0
  134. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/brain_atlas.py +0 -0
  135. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/chat.py +0 -0
  136. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/correlators.py +0 -0
  137. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/data/.DS_Store +0 -0
  138. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/data/db2ls_sql_chtsht.json +0 -0
  139. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/data/docs_links.json +0 -0
  140. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/data/lang_code_iso639.json +0 -0
  141. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/db2ls.py +0 -0
  142. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/doc.py +0 -0
  143. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/freqanalysis.py +0 -0
  144. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/netfinder.py +0 -0
  145. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/setuptools-70.1.0-py3-none-any.whl +0 -0
  146. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/sleep_events_detectors.py +0 -0
  147. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/stats.py +0 -0
  148. {py2ls-0.1.6.1 → py2ls-0.1.6.2}/py2ls/translator.py +0 -0
  149. {py2ls-0.1.6.1 → 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.1
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
@@ -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):
@@ -2169,9 +2170,22 @@ def figsets(*args,**kwargs):
2169
2170
  # rotation
2170
2171
  if "angle" in key.lower() or ("rot" in key.lower()):
2171
2172
  if "x" in key.lower():
2172
- 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')
2173
2185
  if "y" in key.lower():
2174
2186
  ax.tick_params(axis="y", rotation=value)
2187
+ for tick in ax.get_yticklabels():
2188
+ tick.set_horizontalalignment('right')
2175
2189
 
2176
2190
  if "bo" in key in key: # box setting, and ("p" in key or "l" in key):
2177
2191
  if isinstance(value, (str, list)):
@@ -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
+