cf-plot 3.5.0__tar.gz → 3.6.0__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 (263) hide show
  1. {cf_plot-3.5.0 → cf_plot-3.6.0}/PKG-INFO +58 -6
  2. cf_plot-3.5.0/cf_plot.egg-info/PKG-INFO → cf_plot-3.6.0/README.md +39 -31
  3. cf_plot-3.6.0/cf_plot.egg-info/PKG-INFO +169 -0
  4. {cf_plot-3.5.0 → cf_plot-3.6.0}/cf_plot.egg-info/requires.txt +0 -1
  5. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/__init__.py +42 -10
  6. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/blockfill.py +14 -11
  7. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colorbar.py +6 -2
  8. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colour.py +6 -2
  9. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/contour.py +352 -169
  10. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/layout_runtime.py +206 -30
  11. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/line.py +151 -60
  12. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/map_runtime.py +47 -10
  13. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot.py-allissuesfixedyay +2 -2
  14. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot.py-fixesslb14 +2 -2
  15. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot.py-maskedwhitedoubles +2 -2
  16. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/stipple.py +34 -21
  17. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/stream.py +49 -1
  18. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/trajectory.py +146 -80
  19. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/utility.py +7 -5
  20. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/validate.py +1 -1
  21. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/vector.py +107 -64
  22. {cf_plot-3.5.0 → cf_plot-3.6.0}/pyproject.toml +41 -8
  23. cf_plot-3.5.0/README.md +0 -86
  24. {cf_plot-3.5.0 → cf_plot-3.6.0}/LICENSE.txt +0 -0
  25. {cf_plot-3.5.0 → cf_plot-3.6.0}/MANIFEST.in +0 -0
  26. {cf_plot-3.5.0 → cf_plot-3.6.0}/cf_plot.egg-info/SOURCES.txt +0 -0
  27. {cf_plot-3.5.0 → cf_plot-3.6.0}/cf_plot.egg-info/dependency_links.txt +0 -0
  28. {cf_plot-3.5.0 → cf_plot-3.6.0}/cf_plot.egg-info/top_level.txt +0 -0
  29. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/__init__.py +0 -0
  30. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/3gauss.rgb +0 -0
  31. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/3saw.rgb +0 -0
  32. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BkBlAqGrYeOrReViWh200.rgb +0 -0
  33. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlAqGrYeOrRe.rgb +0 -0
  34. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlAqGrYeOrReVi200.rgb +0 -0
  35. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlGrYeOrReVi200.rgb +0 -0
  36. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlRe.rgb +0 -0
  37. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlWhRe.rgb +0 -0
  38. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueDarkOrange18.rgb +0 -0
  39. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueDarkRed18.rgb +0 -0
  40. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueGreen14.rgb +0 -0
  41. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueRed.rgb +0 -0
  42. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueRedGray.rgb +0 -0
  43. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueWhiteOrangeRed.rgb +0 -0
  44. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BlueYellowRed.rgb +0 -0
  45. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BrBG.rgb +0 -0
  46. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/BrownBlue12.rgb +0 -0
  47. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/Cat12.rgb +0 -0
  48. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/GHRSST_anomaly.rgb +0 -0
  49. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/GrayWhiteGray.rgb +0 -0
  50. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/GreenMagenta16.rgb +0 -0
  51. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/GreenYellow.rgb +0 -0
  52. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/OceanLakeLandSnow.rgb +0 -0
  53. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/StepSeq25.rgb +0 -0
  54. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/ViBlGrWhYeOrRe.rgb +0 -0
  55. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhBlGrYeRe.rgb +0 -0
  56. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhBlReWh.rgb +0 -0
  57. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhViBlGrYeOrRe.rgb +0 -0
  58. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhViBlGrYeOrReWh.rgb +0 -0
  59. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhiteBlue.rgb +0 -0
  60. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhiteBlueGreenYellowRed.rgb +0 -0
  61. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhiteGreen.rgb +0 -0
  62. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/WhiteYellowOrangeRed.rgb +0 -0
  63. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/__init__.py +0 -0
  64. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/amwg.rgb +0 -0
  65. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/amwg256.rgb +0 -0
  66. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/amwg_blueyellowred.rgb +0 -0
  67. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/arctic.rgb +0 -0
  68. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/cmp_b2r.rgb +0 -0
  69. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/cmp_flux.rgb +0 -0
  70. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/cmp_haxby.rgb +0 -0
  71. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/colombia.rgb +0 -0
  72. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/colournames.txt +0 -0
  73. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/cosam.rgb +0 -0
  74. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/cosam12.rgb +0 -0
  75. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/default.rgb +0 -0
  76. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/detail.rgb +0 -0
  77. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/extrema.rgb +0 -0
  78. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/gray.rgb +0 -0
  79. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/gui_default.rgb +0 -0
  80. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/helix.rgb +0 -0
  81. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/helix1.rgb +0 -0
  82. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/hlu_default.rgb +0 -0
  83. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/hotcold_18lev.rgb +0 -0
  84. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/hotcolr_19lev.rgb +0 -0
  85. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/hotres.rgb +0 -0
  86. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl0.rgb +0 -0
  87. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl1.rgb +0 -0
  88. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl10.rgb +0 -0
  89. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl11.rgb +0 -0
  90. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl12.rgb +0 -0
  91. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl13.rgb +0 -0
  92. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl14.rgb +0 -0
  93. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl15.rgb +0 -0
  94. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl16.rgb +0 -0
  95. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl17.rgb +0 -0
  96. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl18.rgb +0 -0
  97. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl19.rgb +0 -0
  98. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl2.rgb +0 -0
  99. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl20.rgb +0 -0
  100. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl21.rgb +0 -0
  101. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl22.rgb +0 -0
  102. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl23.rgb +0 -0
  103. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl24.rgb +0 -0
  104. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl25.rgb +0 -0
  105. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl26.rgb +0 -0
  106. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl27.rgb +0 -0
  107. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl28.rgb +0 -0
  108. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl29.rgb +0 -0
  109. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl3.rgb +0 -0
  110. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl30.rgb +0 -0
  111. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl31.rgb +0 -0
  112. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl32.rgb +0 -0
  113. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl33.rgb +0 -0
  114. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl34.rgb +0 -0
  115. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl35.rgb +0 -0
  116. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl36.rgb +0 -0
  117. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl37.rgb +0 -0
  118. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl38.rgb +0 -0
  119. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl39.rgb +0 -0
  120. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl4.rgb +0 -0
  121. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl5.rgb +0 -0
  122. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl6.rgb +0 -0
  123. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl7.rgb +0 -0
  124. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl8.rgb +0 -0
  125. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/idl9.rgb +0 -0
  126. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/inferno.rgb +0 -0
  127. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/magma.rgb +0 -0
  128. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/matlab_hot.rgb +0 -0
  129. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/matlab_hsv.rgb +0 -0
  130. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/matlab_jet.rgb +0 -0
  131. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/matlab_lines.rgb +0 -0
  132. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/mch_default.rgb +0 -0
  133. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/ncl_default.rgb +0 -0
  134. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/ncview_default.rgb +0 -0
  135. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/nrl_sirkes.rgb +0 -0
  136. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/nrl_sirkes_nowhite.rgb +0 -0
  137. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/nrwc.rgb +0 -0
  138. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/os250kmetres.rgb +0 -0
  139. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/parula.rgb +0 -0
  140. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/perc2_9lev.rgb +0 -0
  141. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/percent_11lev.rgb +0 -0
  142. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/plasma.rgb +0 -0
  143. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/posneg_1.rgb +0 -0
  144. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/posneg_2.rgb +0 -0
  145. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/prcp_1.rgb +0 -0
  146. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/prcp_2.rgb +0 -0
  147. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/prcp_3.rgb +0 -0
  148. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip2_15lev.rgb +0 -0
  149. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip2_17lev.rgb +0 -0
  150. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip3_16lev.rgb +0 -0
  151. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip4_11lev.rgb +0 -0
  152. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip4_diff_19lev.rgb +0 -0
  153. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip_11lev.rgb +0 -0
  154. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip_diff_12lev.rgb +0 -0
  155. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/precip_diff_1lev.rgb +0 -0
  156. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/radar.rgb +0 -0
  157. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/radar_1.rgb +0 -0
  158. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/rainbow.rgb +0 -0
  159. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/rainbow_gray.rgb +0 -0
  160. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/rainbow_white.rgb +0 -0
  161. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/rainbow_white_gray.rgb +0 -0
  162. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/rh_19lev.rgb +0 -0
  163. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale1.rgb +0 -0
  164. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale10.rgb +0 -0
  165. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale11.rgb +0 -0
  166. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale12.rgb +0 -0
  167. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale13.rgb +0 -0
  168. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale14.rgb +0 -0
  169. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale15.rgb +0 -0
  170. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale16.rgb +0 -0
  171. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale17.rgb +0 -0
  172. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale18.rgb +0 -0
  173. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale19.rgb +0 -0
  174. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale2.rgb +0 -0
  175. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale20.rgb +0 -0
  176. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale21.rgb +0 -0
  177. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale22.rgb +0 -0
  178. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale23.rgb +0 -0
  179. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale24.rgb +0 -0
  180. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale25.rgb +0 -0
  181. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale26.rgb +0 -0
  182. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale27.rgb +0 -0
  183. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale28.rgb +0 -0
  184. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale29.rgb +0 -0
  185. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale3.rgb +0 -0
  186. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale30.rgb +0 -0
  187. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale31.rgb +0 -0
  188. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale32.rgb +0 -0
  189. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale33.rgb +0 -0
  190. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale34.rgb +0 -0
  191. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale35.rgb +0 -0
  192. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale36.rgb +0 -0
  193. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale37.rgb +0 -0
  194. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale38.rgb +0 -0
  195. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale39.rgb +0 -0
  196. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale4.rgb +0 -0
  197. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale40.rgb +0 -0
  198. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale41.rgb +0 -0
  199. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale42.rgb +0 -0
  200. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale43.rgb +0 -0
  201. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale44.rgb +0 -0
  202. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale5.rgb +0 -0
  203. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale6.rgb +0 -0
  204. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale7.rgb +0 -0
  205. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale8.rgb +0 -0
  206. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/scale9.rgb +0 -0
  207. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/seaice_1.rgb +0 -0
  208. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/seaice_2.rgb +0 -0
  209. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/so4_21.rgb +0 -0
  210. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/so4_23.rgb +0 -0
  211. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/spread_15lev.rgb +0 -0
  212. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/sunshine_9lev.rgb +0 -0
  213. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/sunshine_diff_12lev.rgb +0 -0
  214. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/t2m_29lev.rgb +0 -0
  215. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/tbrAvg1.rgb +0 -0
  216. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/tbrStd1.rgb +0 -0
  217. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/tbrVar1.rgb +0 -0
  218. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/tbr_240_300.rgb +0 -0
  219. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/tbr_stdev_0_30.rgb +0 -0
  220. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/tbr_var_0_500.rgb +0 -0
  221. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/temp_19lev.rgb +0 -0
  222. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/temp_diff_18lev.rgb +0 -0
  223. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/temp_diff_1lev.rgb +0 -0
  224. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/testcmap.rgb +0 -0
  225. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/thelix.rgb +0 -0
  226. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/topo_15lev.rgb +0 -0
  227. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/vcs.rgb +0 -0
  228. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/viridis.rgb +0 -0
  229. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wgne15.rgb +0 -0
  230. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wh_bl_gr_ye_re.rgb +0 -0
  231. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wiki_1_0_2.rgb +0 -0
  232. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wiki_1_0_3.rgb +0 -0
  233. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wiki_2_0.rgb +0 -0
  234. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wiki_2_0_reduced.rgb +0 -0
  235. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wind_17lev.rgb +0 -0
  236. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour/colourmaps/wxpEnIR.rgb +0 -0
  237. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/colour.py +0 -0
  238. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/classes_cfplot-afterrejig.png +0 -0
  239. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/classes_cfplot-finalpr.png +0 -0
  240. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/classes_cfplot-vis-postupdate.png +0 -0
  241. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/classes_cfplot-vis-postupdate2.png +0 -0
  242. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/classes_cfplot-vis-postupdate3.png +0 -0
  243. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/classes_cfplot-vis.png +0 -0
  244. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/packages_cfplot-afterrejig.png +0 -0
  245. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/packages_cfplot-finalpr.png +0 -0
  246. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/packages_cfplot-vis-postupdate.png +0 -0
  247. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/packages_cfplot-vis-postupdate2.png +0 -0
  248. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/packages_cfplot-vis-postupdate3.png +0 -0
  249. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot-vis-new-and-old/packages_cfplot-vis.png +0 -0
  250. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot_a001.png +0 -0
  251. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot_a002.png +0 -0
  252. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/cfplot_a003.png +0 -0
  253. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/era5_mon_sur_post1979.land.ant.timmean.nc +0 -0
  254. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/era_test_script.py-sadie +0 -0
  255. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/latest-traj-one.diff +0 -0
  256. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/mapping/__init__.py +0 -0
  257. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/old_backup/mapping/mapping.py +0 -0
  258. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/rotated_runtime.py +0 -0
  259. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/state.py +0 -0
  260. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/stream.oldpre123pr.py +0 -0
  261. {cf_plot-3.5.0 → cf_plot-3.6.0}/cfplot/trajectory.py-fixatt +0 -0
  262. {cf_plot-3.5.0 → cf_plot-3.6.0}/setup.cfg +0 -0
  263. {cf_plot-3.5.0 → cf_plot-3.6.0}/tests/test_realdata.py +0 -0
@@ -1,31 +1,44 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cf-plot
3
- Version: 3.5.0
3
+ Version: 3.6.0
4
4
  Summary: Code-light plotting for earth science and aligned research
5
- Author-email: Andy Heaps <andy.heaps@ncas.ac.uk>
5
+ Author: Andy Heaps, Bryan Lawrence
6
+ Author-email: Sadie Bartholomew <sadie.bartholomew@ncas.ac.uk>
6
7
  Maintainer-email: Sadie Bartholomew <sadie.bartholomew@ncas.ac.uk>
7
8
  License-Expression: MIT
8
9
  Project-URL: Homepage, https://ncas-cms.github.io/cf-plot/
10
+ Project-URL: Documentation, https://ncas-cms.github.io/cf-plot/
11
+ Project-URL: Source, https://github.com/NCAS-CMS/cf-plot
12
+ Project-URL: Download, https://pypi.org/project/cf-plot/
13
+ Project-URL: Installation, https://ncas-cms.github.io/cf-plot/installation.html
14
+ Project-URL: Release Notes, https://github.com/NCAS-CMS/cf-plot/blob/main/CHANGELOG.md
15
+ Project-URL: Issues, https://github.com/NCAS-CMS/cf-plot/issues
16
+ Keywords: visualisation,visualization,scientific-visualisation,scientific-visualization,atmospheric-science,meteorology,earth-science,climate-science,geoscience,oceanography,cartography,cf-conventions,cf,data-analysis,netcdf,zarr
9
17
  Classifier: Development Status :: 5 - Production/Stable
10
18
  Classifier: Operating System :: Unix
11
19
  Classifier: Operating System :: POSIX
12
20
  Classifier: Operating System :: POSIX :: Linux
13
21
  Classifier: Operating System :: MacOS :: MacOS X
14
22
  Classifier: Programming Language :: Python
15
- Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Programming Language :: Python :: 3 :: Only
16
25
  Classifier: Programming Language :: Python :: 3.11
17
26
  Classifier: Programming Language :: Python :: 3.12
18
27
  Classifier: Programming Language :: Python :: 3.13
19
28
  Classifier: Programming Language :: Python :: 3.14
20
- Classifier: Programming Language :: Python :: 3 :: Only
29
+ Classifier: Intended Audience :: Developers
30
+ Classifier: Intended Audience :: Science/Research
21
31
  Classifier: Topic :: Scientific/Engineering
22
32
  Classifier: Topic :: Scientific/Engineering :: Visualization
23
33
  Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
24
- Requires-Python: >=3.10
34
+ Classifier: Topic :: Scientific/Engineering :: Oceanography
35
+ Classifier: Topic :: Scientific/Engineering :: Hydrology
36
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
37
+ Classifier: Topic :: Scientific/Engineering :: Physics
38
+ Requires-Python: >=3.11
25
39
  Description-Content-Type: text/markdown
26
40
  License-File: LICENSE.txt
27
41
  Requires-Dist: cf-python>=3.17.0
28
- Requires-Dist: scipy>=1.4.0
29
42
  Requires-Dist: cartopy>=0.22.0
30
43
  Dynamic: license-file
31
44
 
@@ -100,6 +113,45 @@ More detail about installation is provided on the
100
113
  (`https://ncas-cms.github.io/cf-plot/installation.html`)
101
114
  of the documentation.
102
115
 
116
+ ### Testing
117
+
118
+ To run the full test suite, call from the repo root:
119
+
120
+ ``` bash
121
+ $ pytest tests
122
+ ```
123
+
124
+ Note however this calls image comparison testing on plot outputs and exact
125
+ image comparison depends on the environment (libraries and versions) used.
126
+ So they may fail if your environment differs from that which was used to
127
+ generate the reference images. Therefore, to allow like-for-like comparison,
128
+ a specific testing conda environment is provided, ``cfplot-test-env.yml``.
129
+ With this environment enabled, the image comparison should pass. Note we
130
+ recommend use of `mamba` for environment creation/solving, but `conda`
131
+ will also work.
132
+
133
+ ```console
134
+ $ # Deactivate all other environments present first
135
+ $ mamba env create --file cfplot-test-env.yml --name cfplot-test-env
136
+ $ conda activate cfplot-test-env
137
+ $ pytest tests
138
+ ```
139
+
140
+ However you can disable this aspect with the ``--skip-image-comparison``
141
+ or equivalently ``-I`` option to the cf-plot test suite run with `pytest`,
142
+ so that only the functional tests run. This is advised when you use any
143
+ environment other than the above, except where some library version
144
+ differs for the purpose of regression testing on that versioning change.
145
+
146
+ ```console
147
+ $ pytest tests -I
148
+ ```
149
+
150
+ > [!NOTE]
151
+ > More comprehensive testing across different environments is under development
152
+ > but is not yet available. For now, use the reference environment to test with.
153
+
154
+
103
155
  ### Contributing
104
156
 
105
157
  Everyone is welcome to contribute to cf-plot in the form
@@ -1,34 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: cf-plot
3
- Version: 3.5.0
4
- Summary: Code-light plotting for earth science and aligned research
5
- Author-email: Andy Heaps <andy.heaps@ncas.ac.uk>
6
- Maintainer-email: Sadie Bartholomew <sadie.bartholomew@ncas.ac.uk>
7
- License-Expression: MIT
8
- Project-URL: Homepage, https://ncas-cms.github.io/cf-plot/
9
- Classifier: Development Status :: 5 - Production/Stable
10
- Classifier: Operating System :: Unix
11
- Classifier: Operating System :: POSIX
12
- Classifier: Operating System :: POSIX :: Linux
13
- Classifier: Operating System :: MacOS :: MacOS X
14
- Classifier: Programming Language :: Python
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Programming Language :: Python :: 3.11
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Programming Language :: Python :: 3.13
19
- Classifier: Programming Language :: Python :: 3.14
20
- Classifier: Programming Language :: Python :: 3 :: Only
21
- Classifier: Topic :: Scientific/Engineering
22
- Classifier: Topic :: Scientific/Engineering :: Visualization
23
- Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
24
- Requires-Python: >=3.10
25
- Description-Content-Type: text/markdown
26
- License-File: LICENSE.txt
27
- Requires-Dist: cf-python>=3.17.0
28
- Requires-Dist: scipy>=1.4.0
29
- Requires-Dist: cartopy>=0.22.0
30
- Dynamic: license-file
31
-
32
1
  # cf-plot
33
2
 
34
3
  ## Code-light plotting for earth science and aligned research
@@ -100,6 +69,45 @@ More detail about installation is provided on the
100
69
  (`https://ncas-cms.github.io/cf-plot/installation.html`)
101
70
  of the documentation.
102
71
 
72
+ ### Testing
73
+
74
+ To run the full test suite, call from the repo root:
75
+
76
+ ``` bash
77
+ $ pytest tests
78
+ ```
79
+
80
+ Note however this calls image comparison testing on plot outputs and exact
81
+ image comparison depends on the environment (libraries and versions) used.
82
+ So they may fail if your environment differs from that which was used to
83
+ generate the reference images. Therefore, to allow like-for-like comparison,
84
+ a specific testing conda environment is provided, ``cfplot-test-env.yml``.
85
+ With this environment enabled, the image comparison should pass. Note we
86
+ recommend use of `mamba` for environment creation/solving, but `conda`
87
+ will also work.
88
+
89
+ ```console
90
+ $ # Deactivate all other environments present first
91
+ $ mamba env create --file cfplot-test-env.yml --name cfplot-test-env
92
+ $ conda activate cfplot-test-env
93
+ $ pytest tests
94
+ ```
95
+
96
+ However you can disable this aspect with the ``--skip-image-comparison``
97
+ or equivalently ``-I`` option to the cf-plot test suite run with `pytest`,
98
+ so that only the functional tests run. This is advised when you use any
99
+ environment other than the above, except where some library version
100
+ differs for the purpose of regression testing on that versioning change.
101
+
102
+ ```console
103
+ $ pytest tests -I
104
+ ```
105
+
106
+ > [!NOTE]
107
+ > More comprehensive testing across different environments is under development
108
+ > but is not yet available. For now, use the reference environment to test with.
109
+
110
+
103
111
  ### Contributing
104
112
 
105
113
  Everyone is welcome to contribute to cf-plot in the form
@@ -0,0 +1,169 @@
1
+ Metadata-Version: 2.4
2
+ Name: cf-plot
3
+ Version: 3.6.0
4
+ Summary: Code-light plotting for earth science and aligned research
5
+ Author: Andy Heaps, Bryan Lawrence
6
+ Author-email: Sadie Bartholomew <sadie.bartholomew@ncas.ac.uk>
7
+ Maintainer-email: Sadie Bartholomew <sadie.bartholomew@ncas.ac.uk>
8
+ License-Expression: MIT
9
+ Project-URL: Homepage, https://ncas-cms.github.io/cf-plot/
10
+ Project-URL: Documentation, https://ncas-cms.github.io/cf-plot/
11
+ Project-URL: Source, https://github.com/NCAS-CMS/cf-plot
12
+ Project-URL: Download, https://pypi.org/project/cf-plot/
13
+ Project-URL: Installation, https://ncas-cms.github.io/cf-plot/installation.html
14
+ Project-URL: Release Notes, https://github.com/NCAS-CMS/cf-plot/blob/main/CHANGELOG.md
15
+ Project-URL: Issues, https://github.com/NCAS-CMS/cf-plot/issues
16
+ Keywords: visualisation,visualization,scientific-visualisation,scientific-visualization,atmospheric-science,meteorology,earth-science,climate-science,geoscience,oceanography,cartography,cf-conventions,cf,data-analysis,netcdf,zarr
17
+ Classifier: Development Status :: 5 - Production/Stable
18
+ Classifier: Operating System :: Unix
19
+ Classifier: Operating System :: POSIX
20
+ Classifier: Operating System :: POSIX :: Linux
21
+ Classifier: Operating System :: MacOS :: MacOS X
22
+ Classifier: Programming Language :: Python
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Programming Language :: Python :: 3 :: Only
25
+ Classifier: Programming Language :: Python :: 3.11
26
+ Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
28
+ Classifier: Programming Language :: Python :: 3.14
29
+ Classifier: Intended Audience :: Developers
30
+ Classifier: Intended Audience :: Science/Research
31
+ Classifier: Topic :: Scientific/Engineering
32
+ Classifier: Topic :: Scientific/Engineering :: Visualization
33
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
34
+ Classifier: Topic :: Scientific/Engineering :: Oceanography
35
+ Classifier: Topic :: Scientific/Engineering :: Hydrology
36
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
37
+ Classifier: Topic :: Scientific/Engineering :: Physics
38
+ Requires-Python: >=3.11
39
+ Description-Content-Type: text/markdown
40
+ License-File: LICENSE.txt
41
+ Requires-Dist: cf-python>=3.17.0
42
+ Requires-Dist: cartopy>=0.22.0
43
+ Dynamic: license-file
44
+
45
+ # cf-plot
46
+
47
+ ## Code-light plotting for earth science and aligned research
48
+
49
+ ### Overview
50
+
51
+ ![cf-plot example gallery of plots](docs/source/images/new_gallery_view.png "Examples Gallery of plots made with the cf-plot library")
52
+
53
+ **cf-plot allows you to produce and customise publication-quality contour,
54
+ vector, line and more plots with the power of Python,
55
+ [matplotlib](https://matplotlib.org/),
56
+ [Cartopy](https://scitools.org.uk/cartopy/docs/latest/) and
57
+ [cf-python](https://ncas-cms.github.io/cf-python/), in as few lines of code
58
+ as possible.**
59
+
60
+ It is designed to be a useful visualisation tool for environmental, earth
61
+ and aligned sciences, for example to facilitate climate and meteorological
62
+ research. cf-plot is developed and maintained by the
63
+ [NCAS-CMS](https://cms.ncas.ac.uk/index.html) group, part of
64
+ [NCAS](https://ncas.ac.uk/).
65
+
66
+
67
+ ### Brief Demonstration
68
+
69
+ In as little as four lines of Python including imports and file reading,
70
+ using `cf-plot` you can for example produce a contour plot showing a 2D
71
+ subspace of a netCDF dataset:
72
+
73
+ ```python
74
+ import cf
75
+ import cfplot as cfp
76
+ f = cf.read('<dataset name>.nc')[0] # picks out a read-in field of the dataset
77
+ cfp.con(f.subspace(time=<chosen time value>)) # creates a contour plot of the field at that time value
78
+ ```
79
+
80
+
81
+ ### Examples Gallery
82
+
83
+ A gallery of outputs made with cf-plot, showcasing a range of plotting
84
+ possibilities with links to relevant documentation pages and to example code,
85
+ can be found
86
+ [on this dedicated page within the documentation](https://ncas-cms.github.io/cf-plot/gallery_of_examples.html),
87
+ as illustrated in the (static) image at the top of this document.
88
+
89
+
90
+ ### Documentation
91
+
92
+ See [the cf-plot homepage](https://ncas-cms.github.io/cf-plot/)
93
+ (`https://ncas-cms.github.io/cf-plot`) for the full online documentation.
94
+
95
+
96
+ ### Installation
97
+
98
+ To install cf-plot with its required dependencies, you can use `pip`:
99
+
100
+ ```bash
101
+ pip install cf-python cf-plot
102
+ ```
103
+
104
+ or you can use `conda` (or similar package managers such
105
+ as `mamba`) as follows (or equivalent):
106
+
107
+ ```bash
108
+ conda install -c ncas -c conda-forge cf-python cf-plot udunits2
109
+ ```
110
+
111
+ More detail about installation is provided on the
112
+ [installation page](https://ncas-cms.github.io/cf-plot/installation.html)
113
+ (`https://ncas-cms.github.io/cf-plot/installation.html`)
114
+ of the documentation.
115
+
116
+ ### Testing
117
+
118
+ To run the full test suite, call from the repo root:
119
+
120
+ ``` bash
121
+ $ pytest tests
122
+ ```
123
+
124
+ Note however this calls image comparison testing on plot outputs and exact
125
+ image comparison depends on the environment (libraries and versions) used.
126
+ So they may fail if your environment differs from that which was used to
127
+ generate the reference images. Therefore, to allow like-for-like comparison,
128
+ a specific testing conda environment is provided, ``cfplot-test-env.yml``.
129
+ With this environment enabled, the image comparison should pass. Note we
130
+ recommend use of `mamba` for environment creation/solving, but `conda`
131
+ will also work.
132
+
133
+ ```console
134
+ $ # Deactivate all other environments present first
135
+ $ mamba env create --file cfplot-test-env.yml --name cfplot-test-env
136
+ $ conda activate cfplot-test-env
137
+ $ pytest tests
138
+ ```
139
+
140
+ However you can disable this aspect with the ``--skip-image-comparison``
141
+ or equivalently ``-I`` option to the cf-plot test suite run with `pytest`,
142
+ so that only the functional tests run. This is advised when you use any
143
+ environment other than the above, except where some library version
144
+ differs for the purpose of regression testing on that versioning change.
145
+
146
+ ```console
147
+ $ pytest tests -I
148
+ ```
149
+
150
+ > [!NOTE]
151
+ > More comprehensive testing across different environments is under development
152
+ > but is not yet available. For now, use the reference environment to test with.
153
+
154
+
155
+ ### Contributing
156
+
157
+ Everyone is welcome to contribute to cf-plot in the form
158
+ of bug reports, documentation, code, design proposals, and more.
159
+
160
+ Contributing guidelines are available in a
161
+ [dedicated document](https://github.com/NCAS-CMS/cf-plot/blob/main/.github/CONTRIBUTING.md) which is
162
+ copied into the [documentation here](https://ncas-cms.github.io/cf-plot/support.html#contributing-to-cf-plot).
163
+
164
+
165
+ ### Help: Issues, Questions, Feature Requests, etc.
166
+
167
+ For any queries, see the
168
+ [guidance page](https://ncas-cms.github.io/cf-plot/support.html)
169
+ (`https://ncas-cms.github.io/cf-plot/support.html`).
@@ -1,3 +1,2 @@
1
1
  cf-python>=3.17.0
2
- scipy>=1.4.0
3
2
  cartopy>=0.22.0
@@ -7,22 +7,33 @@ Documentation is hosted and found at: https://ncas-cms.github.io/cf-plot/
7
7
  from .colorbar import cbar
8
8
  from .colour import cscale
9
9
  from .contour import con, levs
10
- from .layout_runtime import gclose, gopen, gpos, gset
11
- from .line import lineplot
10
+ from .layout_runtime import axes, gclose, gfigure, gopen, gpos, gset
11
+ from .line import lineplot, scatter
12
12
  from .map_runtime import mapset
13
13
  from .rotated_runtime import _render_rotated_grid_axes
14
14
  from .state import plotvars, reset_runtime_state, setvars
15
15
  from .stipple import stipple
16
16
  from .stream import stream
17
17
  from .trajectory import traj
18
+ from .utility import (
19
+ add_cyclic,
20
+ calculate_levels,
21
+ cf_var_name,
22
+ cf_var_name_titles,
23
+ find_dim_names,
24
+ find_z,
25
+ fix_floats,
26
+ generate_titles,
27
+ )
18
28
  from .utility import gvals as _gvals_impl
19
29
  from .utility import mapaxis as _mapaxis_impl
20
- from .utility import regrid
21
- from .vector import vect
30
+ from .utility import ndecs, polar_regular_grid, regrid, stipple_points
31
+ from .validate import check_well_formed, orca_check
32
+ from .vector import axes_plot, vect
22
33
 
23
34
  __author__ = "Andy Heaps, Sadie Bartholomew, Bryan Lawrence"
24
- __maintainer__ ="Sadie Bartholomew"
25
- __date__ = "2026-10-09"
35
+ __maintainer__ = "Sadie Bartholomew"
36
+ __date__ = "2026-11-10"
26
37
 
27
38
 
28
39
  from importlib.metadata import PackageNotFoundError
@@ -33,7 +44,7 @@ from pathlib import Path
33
44
  def _version_from_pyproject():
34
45
  pyproject = Path(__file__).resolve().parent.parent / "pyproject.toml"
35
46
  if not pyproject.exists():
36
- return None
47
+ return
37
48
 
38
49
  in_project = False
39
50
  for raw_line in pyproject.read_text(encoding="utf-8").splitlines():
@@ -47,7 +58,7 @@ def _version_from_pyproject():
47
58
  _, _, value = line.partition("=")
48
59
  return value.strip().strip('"').strip("'")
49
60
 
50
- return None
61
+ return
51
62
 
52
63
 
53
64
  def _resolve_version():
@@ -67,6 +78,7 @@ __version__ = _resolve_version()
67
78
 
68
79
 
69
80
  def reset():
81
+ """Reset plotting state to the default configuration."""
70
82
  gset()
71
83
  cscale()
72
84
  levs()
@@ -76,6 +88,7 @@ def reset():
76
88
 
77
89
 
78
90
  def _gvals(*args, **kwargs):
91
+ """Work out a sensible set of values between two limits."""
79
92
  return _gvals_impl(*args, **kwargs)
80
93
 
81
94
 
@@ -95,6 +108,7 @@ def rgaxes(
95
108
  xlabel=None,
96
109
  ylabel=None,
97
110
  ):
111
+ """Label rotated grid plots."""
98
112
  return _render_rotated_grid_axes(
99
113
  xpole=xpole,
100
114
  ypole=ypole,
@@ -113,6 +127,7 @@ def rgaxes(
113
127
 
114
128
 
115
129
  def _mapaxis(min=None, max=None, type=None):
130
+ """Work out a sensible set of lon-lat tick marks and labels."""
116
131
  return _mapaxis_impl(
117
132
  min_val=min,
118
133
  max_val=max,
@@ -122,25 +137,42 @@ def _mapaxis(min=None, max=None, type=None):
122
137
 
123
138
 
124
139
  __all__ = [
140
+ "_gvals", # Req'd for public API?
141
+ "_mapaxis", # Req'd for public API?
142
+ "add_cyclic",
143
+ "axes",
144
+ "axes_plot",
145
+ "calculate_levels",
125
146
  "cbar",
147
+ "cf_var_name",
148
+ "cf_var_name_titles",
149
+ "check_well_formed",
126
150
  "con",
127
151
  "cscale",
152
+ "find_dim_names",
153
+ "find_z",
154
+ "fix_floats",
128
155
  "gclose",
156
+ "generate_titles",
157
+ "gfigure",
129
158
  "gopen",
130
159
  "gpos",
131
160
  "gset",
132
161
  "levs",
133
162
  "lineplot",
134
163
  "mapset",
164
+ "ndecs",
165
+ "orca_check",
135
166
  "plotvars",
167
+ "polar_regular_grid",
136
168
  "regrid",
137
169
  "reset",
138
170
  "rgaxes",
171
+ "scatter",
139
172
  "setvars",
140
173
  "stipple",
174
+ "stipple_points",
141
175
  "stream",
142
176
  "traj",
143
177
  "vect",
144
- "_gvals",
145
- "_mapaxis",
146
178
  ]
@@ -63,19 +63,20 @@ def _bfill(
63
63
  colmap = get_colour_scale_map()
64
64
  cmap = matplotlib.colors.ListedColormap(colmap)
65
65
  fill_colors = list(colmap)
66
- if plotvars.levels_extend in ["min", "both"]:
67
- cmap.set_under(plotvars.cs[0])
68
- if plotvars.levels_extend in ["max", "both"]:
69
- cmap.set_over(plotvars.cs[-1])
70
66
 
71
- under_index = None
72
- over_index = None
67
+ extremes = {}
73
68
  if plotvars.levels_extend in ["min", "both"]:
69
+ extremes["under"] = plotvars.cs[0]
74
70
  under_index = len(fill_colors)
75
71
  fill_colors.append(plotvars.cs[0])
76
72
  if plotvars.levels_extend in ["max", "both"]:
73
+ extremes["over"] = plotvars.cs[-1]
77
74
  over_index = len(fill_colors)
78
75
  fill_colors.append(plotvars.cs[-1])
76
+
77
+ if extremes:
78
+ cmap = cmap.with_extremes(**extremes)
79
+
79
80
  else:
80
81
  cols = single_fill_color
81
82
  cmap = matplotlib.colors.ListedColormap(cols)
@@ -107,9 +108,11 @@ def _bfill(
107
108
  colarr[pts] = np.size(levels) - 2
108
109
 
109
110
  if isinstance(field, np.ma.MaskedArray):
110
- pts = np.ma.where(field.mask)
111
- if np.size(pts) > 0:
112
- colarr[pts] = -1
111
+ # np.ma.where on a scalar False mask raises on newer NumPy.
112
+ # Use a normalized boolean mask array instead.
113
+ mask = np.ma.getmaskarray(field)
114
+ if np.any(mask):
115
+ colarr[mask] = -1
113
116
 
114
117
  norm = matplotlib.colors.BoundaryNorm(levels, cmap.N)
115
118
 
@@ -447,10 +450,10 @@ def _bfill_ugrid(
447
450
 
448
451
  levs = deepcopy(np.array(clevs))
449
452
 
450
- if plotvars.levels_extend == "min" or plotvars.levels_extend == "both":
453
+ if plotvars.levels_extend in ("min", "both"):
451
454
  levs = np.concatenate([[-1e20], levs])
452
455
  ilevs_max = np.size(levs)
453
- if plotvars.levels_extend == "max" or plotvars.levels_extend == "both":
456
+ if plotvars.levels_extend in ("max", "both"):
454
457
  levs = np.concatenate([levs, [1e20]])
455
458
  else:
456
459
  ilevs_max = ilevs_max - 1
@@ -204,15 +204,19 @@ def cbar(
204
204
  )
205
205
 
206
206
  boundaries = levs.astype(float)
207
+ extremes = {}
207
208
  if extend in ("both", "min"):
208
- cmap.set_under(plotvars.cs[0])
209
+ extremes["under"] = plotvars.cs[0]
209
210
  boundaries = np.insert(boundaries, 0, boundaries[0] - 1)
210
211
  if extend in ("both", "max"):
211
- cmap.set_over(plotvars.cs[-1])
212
+ extremes["over"] = plotvars.cs[-1]
212
213
  boundaries = np.insert(
213
214
  boundaries, len(boundaries), boundaries[-1] + 1
214
215
  )
215
216
 
217
+ if extremes:
218
+ cmap = cmap.with_extremes(**extremes)
219
+
216
220
  if not isinstance(levs, list):
217
221
  lbot = None
218
222
 
@@ -668,15 +668,19 @@ def cbar(
668
668
  # Add colorbar extensions if definded by levs. Using boundaries[0]-1
669
669
  # for the lower and boundaries[-1]+1 is just for the colorbar and
670
670
  # has no meaning for the plot.
671
+ extremes = {}
671
672
  if extend in ("both", "min"):
672
- cmap.set_under(plotvars.cs[0])
673
+ extremes["under"] = plotvars.cs[0]
673
674
  boundaries = np.insert(boundaries, 0, boundaries[0] - 1)
674
675
  if extend in ("both", "max"):
675
- cmap.set_over(plotvars.cs[-1])
676
+ extremes["over"] = plotvars.cs[-1]
676
677
  boundaries = np.insert(
677
678
  boundaries, len(boundaries), boundaries[-1] + 1
678
679
  )
679
680
 
681
+ if extremes:
682
+ cmap = cmap.with_extremes(**extremes)
683
+
680
684
  if not isinstance(levs, list):
681
685
  lbot = None
682
686