wxmplot 2026.2.0__tar.gz → 2026.2.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 (85) hide show
  1. {wxmplot-2026.2.0/wxmplot.egg-info → wxmplot-2026.2.2}/PKG-INFO +1 -1
  2. wxmplot-2026.2.2/examples/simple.py +8 -0
  3. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/colors.py +7 -3
  4. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/config.py +48 -24
  5. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/image_canvas.py +1 -3
  6. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/imageconf.py +79 -29
  7. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/imageframe.py +17 -19
  8. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/line_plot.py +2 -2
  9. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/plotconfigframe.py +7 -38
  10. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/version.py +3 -3
  11. {wxmplot-2026.2.0 → wxmplot-2026.2.2/wxmplot.egg-info}/PKG-INFO +1 -1
  12. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot.egg-info/scm_file_list.json +121 -121
  13. wxmplot-2026.2.2/wxmplot.egg-info/scm_version.json +8 -0
  14. wxmplot-2026.2.0/examples/simple.py +0 -6
  15. wxmplot-2026.2.0/wxmplot.egg-info/scm_version.json +0 -8
  16. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/ChangeLog +0 -0
  17. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/LICENSE +0 -0
  18. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/MANIFEST.in +0 -0
  19. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/README.md +0 -0
  20. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/BasicExamples.ipynb +0 -0
  21. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/DynamicExamples.ipynb +0 -0
  22. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/basic_screenshot.py +0 -0
  23. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/compare_dislin_mpl.py +0 -0
  24. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/compare_plplot.py +0 -0
  25. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/contour.py +0 -0
  26. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/demo.py +0 -0
  27. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/discrete_data.py +0 -0
  28. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/errorbar.py +0 -0
  29. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/extra_marker_and_line_reporting.py +0 -0
  30. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/fill_to_zero.py +0 -0
  31. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/fill_uncertainties.py +0 -0
  32. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/floatcontrol.py +0 -0
  33. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/histogram.py +0 -0
  34. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/image.py +0 -0
  35. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/image_canvas_ex.py +0 -0
  36. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/image_scroll.py +0 -0
  37. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/imagematrix.py +0 -0
  38. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/interactive_multiplewindows.py +0 -0
  39. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/leftright.py +0 -0
  40. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/multiple_yaxes.py +0 -0
  41. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/multiplot.py +0 -0
  42. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/pilatus_display.py +0 -0
  43. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/plot_fromdatafile.py +0 -0
  44. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/plot_many_traces.py +0 -0
  45. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/plotapp.py +0 -0
  46. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/rgb_image.py +0 -0
  47. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/scatterplot.py +0 -0
  48. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/scope_mode_function.py +0 -0
  49. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/scope_mode_generator.py +0 -0
  50. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/scope_mode_mpl_compare.py +0 -0
  51. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/stackedplot.py +0 -0
  52. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/stripchart.py +0 -0
  53. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/theme_compare.py +0 -0
  54. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/tiff_display.py +0 -0
  55. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/tifffile.py +0 -0
  56. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/time.dat +0 -0
  57. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/time_update.py +0 -0
  58. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/timedata.py +0 -0
  59. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/wxmplot_jupyter.ipynb +0 -0
  60. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/examples/xafs.dat +0 -0
  61. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/pyproject.toml +0 -0
  62. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/setup.cfg +0 -0
  63. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/setup.py +0 -0
  64. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/tests/basic_test.py +0 -0
  65. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/__init__.py +0 -0
  66. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/allow_idle_macosx.py +0 -0
  67. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/baseframe.py +0 -0
  68. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/basepanel.py +0 -0
  69. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/histogram.py +0 -0
  70. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/imagematrixframe.py +0 -0
  71. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/imagepanel.py +0 -0
  72. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/inputhook.py +0 -0
  73. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/interactive.py +0 -0
  74. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/multiframe.py +0 -0
  75. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/plotapp.py +0 -0
  76. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/plotframe.py +0 -0
  77. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/plotpanel.py +0 -0
  78. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/residualplotframe.py +0 -0
  79. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/stackedplotframe.py +0 -0
  80. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/utils.py +0 -0
  81. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot/vispy_utils.py +0 -0
  82. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot.egg-info/SOURCES.txt +0 -0
  83. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot.egg-info/dependency_links.txt +0 -0
  84. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot.egg-info/requires.txt +0 -0
  85. {wxmplot-2026.2.0 → wxmplot-2026.2.2}/wxmplot.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wxmplot
3
- Version: 2026.2.0
3
+ Version: 2026.2.2
4
4
  Summary: wxPython plotting widgets using matplotlib
5
5
  Author-email: Matthew Newville <matt.newville@gmail.com>
6
6
  License-Expression: MIT
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/python
2
+ import numpy as np
3
+ import wxmplot.interactive as wi
4
+
5
+ x = np.linspace(0.0, 20.0, 201)
6
+ wi.plot(x, np.sin(x)/(x+1),
7
+ title='Titles can include latex: $\\chi^2/\\epsilon $ \n and newlines',
8
+ ylabel='unicde can also be used [\u03c7] (\u212B)', xlabel='T (sec)')
@@ -56,10 +56,14 @@ def hexcolor(color):
56
56
 
57
57
  # now, get color to an rgba tuple
58
58
  cvals = (0, 0, 0)
59
- if isinstance(color, tuple):
60
- cvals = color
61
- elif isinstance(color, list):
59
+ if isinstance(color, list):
62
60
  cvals = tuple(color)
61
+
62
+ if isinstance(color, tuple):
63
+ cvals = (min(255, max(0, c)) for c in color)
64
+ if isinstance(color[0], float) and color[0] < 2.0:
65
+ cvals = [int(255*c) for c in color]
66
+
63
67
  elif isinstance(color, str):
64
68
  c = color.lower().replace(' ', '').replace('gray', 'grey')
65
69
  if c in X11_COLORS:
@@ -222,6 +222,36 @@ def ifnot_none(val, default):
222
222
  return val if val is not None else default
223
223
 
224
224
 
225
+ def clean_texmath(text):
226
+ """
227
+ clean a string with mixed TeX math and control strings
228
+
229
+ inside of TeX dollar signs, the text is preserved.
230
+
231
+ outsde of TeX dollar signs '\\n' will be replaced in '\n', and `\\t' with '\t'
232
+ """
233
+ def clean_escape(s):
234
+ s = s.replace('\\n', '\n').replace('\\t', '\t').replace('\\r', '\r')
235
+ if '\\N{' in s or '\\u' in s:
236
+ s = s.encode("utf-8").decode("unicode_escape")
237
+ return s
238
+
239
+ if '$' not in text:
240
+ return clean_escape(text)
241
+
242
+ ndollar = text.count('$')
243
+ if ndollar == 0 or ndollar % 2 == 1:
244
+ return clean_escape(text)
245
+
246
+ sections = []
247
+ for isect, sect in enumerate(text.split('$')):
248
+ if isect % 2 == 0:
249
+ sect = clean_escape(sect)
250
+ sections.append(sect)
251
+ return '$'.join(sections)
252
+
253
+
254
+
225
255
  class LineProps:
226
256
  """ abstraction for Line2D properties, closely related to a
227
257
  MatPlotlib Line2D. used to set internal line properties, and
@@ -246,7 +276,7 @@ class LineProps:
246
276
  if markercolor is None:
247
277
  markercolor = color
248
278
  self.markercolor= markercolor
249
- self.label = label
279
+ self.label = clean_texmath(label)
250
280
  self.zorder = zorder
251
281
  self.mpline = mpline
252
282
  self.yaxes = yaxes
@@ -267,7 +297,7 @@ class LineProps:
267
297
  self.marker = ifnot_none(marker, self.marker)
268
298
  self.markersize = ifnot_none(markersize, self.markersize)
269
299
  self.markercolor= ifnot_none(markercolor,self.markercolor)
270
- self.label = ifnot_none(label, self.label)
300
+ self.label = ifnot_none(clean_texmath(label), self.label)
271
301
  self.zorder = ifnot_none(zorder, self.zorder)
272
302
  self.alpha = ifnot_none(alpha, self.alpha)
273
303
  self.yaxes = ifnot_none(yaxes, self.yaxes)
@@ -425,12 +455,10 @@ class PlotConfig:
425
455
  elif attr in conf:
426
456
  setattr(self, attr, conf[attr])
427
457
 
428
- l, r, t, b = self.margins
429
- self.set_margins(l, r, t, b, delay_draw=True)
458
+ self.set_margins(*self.margins, delay_draw=True)
430
459
  if self.auto_margins:
431
460
  self.panel.autoset_margins()
432
461
 
433
- ntrace = self.ntrace
434
462
  self.reset_trace_properties()
435
463
 
436
464
  if 'traces' in conf:
@@ -547,17 +575,17 @@ class PlotConfig:
547
575
  rcParams['xtick.labelsize'] = rcParams['ytick.labelsize'] = n
548
576
 
549
577
  if xlabel is not None:
550
- self.xlabel = xlabel
578
+ self.xlabel = clean_texmath(xlabel)
551
579
  if ylabel is not None:
552
- self.ylabel = ylabel
580
+ self.ylabel = clean_texmath(ylabel)
553
581
  if y2label is not None:
554
- self.y2label = y2label
582
+ self.y2label = clean_texmath(y2label)
555
583
  if y3label is not None:
556
- self.y3label = y3label
584
+ self.y3label = clean_texmath(y3label)
557
585
  if y4label is not None:
558
- self.y4label = y4label
586
+ self.y4label = clean_texmath(y4label)
559
587
  if title is not None:
560
- self.title = title
588
+ self.title = clean_texmath(title)
561
589
  if self.canvas is None:
562
590
  return
563
591
  axes = self.canvas.figure.get_axes()
@@ -928,8 +956,7 @@ class PlotConfig:
928
956
  if yaxes_tracecolor is not None:
929
957
  self.yaxes_tracecolor = bool(yaxes_tracecolor)
930
958
 
931
- cur_theme = self.themes[self.current_theme]
932
- tcolor = mpl2hexcolor(self.textcolor) # cur_theme['ytick.color'])
959
+ tcolor = mpl2hexcolor(self.textcolor)
933
960
 
934
961
  axes = self.canvas.figure.get_axes()
935
962
  colors = [tcolor]*(len(axes)+2)
@@ -1096,7 +1123,7 @@ class PlotConfig:
1096
1123
  for trace, lines in enumerate(ax.get_lines()):
1097
1124
  try:
1098
1125
  dats = copy(self.data_save[ax][trace])
1099
- except:
1126
+ except Exception:
1100
1127
  return
1101
1128
  xd, yd = np.asarray(dats[0][:]), np.asarray(dats[1][:])
1102
1129
  if expr == 'Y*X':
@@ -1152,7 +1179,7 @@ class PlotConfig:
1152
1179
  x_minpos= min(x[np.where(x>0)])
1153
1180
  else:
1154
1181
  x_minpos= min(x_minpos, min(x[np.where(x>0)]))
1155
- except:
1182
+ except Exception:
1156
1183
  pass
1157
1184
  if limits == [None, None, None, None]:
1158
1185
  limits = [min(x), max(x), min(y), max(y)]
@@ -1177,14 +1204,14 @@ class PlotConfig:
1177
1204
  try:
1178
1205
  if xrange < 1.e-10:
1179
1206
  xrange = max(1.e-10, (limits[1] + limits[0] )/2.0)
1180
- except:
1207
+ except Exception:
1181
1208
  pass
1182
1209
 
1183
1210
  yrange = limits[3] - limits[2]
1184
1211
  try:
1185
1212
  if yrange < 1.e-10:
1186
1213
  yrange = max(1.e-10, (limits[3] + limits[2] )/2.0)
1187
- except:
1214
+ except Exception:
1188
1215
  pass
1189
1216
 
1190
1217
  limits[0] = limits[0] - xrange * self.viewpad /100.0
@@ -1208,11 +1235,11 @@ class PlotConfig:
1208
1235
  all_limits.append(limits)
1209
1236
  try:
1210
1237
  ax.set_xlim((limits[0], limits[1]), emit=True)
1211
- except:
1238
+ except Exception:
1212
1239
  pass
1213
1240
  try:
1214
1241
  ax.set_ylim((limits[2], limits[3]), emit=True)
1215
- except:
1242
+ except Exception:
1216
1243
  pass
1217
1244
  return all_limits
1218
1245
 
@@ -1235,11 +1262,11 @@ class PlotConfig:
1235
1262
  if i in (1, 2, 3):
1236
1263
  ys = getattr(self, f'y{i+1}scale', 'linear')
1237
1264
  axes.set_yscale(ys)
1238
- except:
1265
+ except Exception:
1239
1266
  axes.set_yscale('linear')
1240
1267
  try:
1241
1268
  axes.set_xscale(self.xscale)
1242
- except:
1269
+ except Exception:
1243
1270
  axes.set_xscale('linear')
1244
1271
  if not delay_draw:
1245
1272
  self.process_data()
@@ -1255,10 +1282,7 @@ class PlotConfig:
1255
1282
  """make keywords for axes.hist()"""
1256
1283
  kwargs = {}
1257
1284
 
1258
- # print("make hist kwargs")
1259
1285
  trace = self.get_trace(trace)
1260
- prop = self.traces[trace]
1261
- # print("L Trace ", prop)
1262
1286
 
1263
1287
  for key in ('bins', 'density', 'cumulative', 'histtype',
1264
1288
  'orientation', 'align', 'stacked', 'rwidth'):
@@ -16,8 +16,6 @@ from wxmplot.colors import lookup_colormap
16
16
  from wxutils.themes import get_theme
17
17
  from wxutils.colors import get_color, register_darkdetect
18
18
 
19
- vispy_init()
20
-
21
19
  from vispy import scene # noqa: E402
22
20
 
23
21
  __all__ = ["ImageCanvas", "BinMethod"]
@@ -78,7 +76,7 @@ class ImageCanvas(wx.Panel):
78
76
  def __init__(self, parent: wx.Window) -> None:
79
77
  """Initializes the ImageCanvas."""
80
78
  super().__init__(parent)
81
-
79
+ vispy_init()
82
80
  self._canvas = scene.SceneCanvas(
83
81
  keys=None,
84
82
  parent=self,
@@ -1,6 +1,7 @@
1
1
  import wx
2
2
  import wx.lib.colourselect as csel
3
3
  import wx.lib.scrolledpanel as scrolled
4
+ import wx.dataview as dv
4
5
 
5
6
  from math import log10
6
7
 
@@ -11,13 +12,15 @@ import yaml
11
12
  from matplotlib.ticker import FuncFormatter
12
13
 
13
14
  from wxutils import (get_cwd, LabeledTextCtrl, SimpleText,
14
- Check, Choice, HLine, FloatSpin, MenuItem,
15
+ Button, Check, Choice, HLine, FloatSpin, MenuItem,
15
16
  flatnotebook, get_color, set_color)
16
17
 
17
18
  from .colors import register_custom_colormaps, hexcolor, hex2rgb, mpl_color
18
19
  from .config import ifnot_none
19
20
  from .plotconfigframe import autopack
20
21
 
22
+ DVSTYLE = dv.DV_SINGLE|dv.DV_VERT_RULES|dv.DV_ROW_LINES
23
+
21
24
  def get_mpl_cmaps():
22
25
  try:
23
26
  from matplotlib import colormaps
@@ -41,33 +44,33 @@ def get_mpl_cmaps():
41
44
  _cmaps = register_custom_colormaps()
42
45
  _cmaps.update(get_mpl_cmaps())
43
46
 
44
- ColorMaps = {} # dict of all colormaps, including reversed
45
- ColorMap_Names = [] # names of colormaps, not including '_r'
46
-
47
- for cname in ('gray', 'coolwarm', 'viridis', 'inferno', 'plasma', 'magma',
48
- 'cividis', 'Greys', 'Purples', 'Blues', 'Greens', 'Oranges', 'Reds',
49
- 'YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu', 'BuPu', 'GnBu', 'PuBu',
50
- 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn' 'PiYG', 'PRGn', 'RdBu', 'RdPu',
51
- 'RdYlBu', 'RdYlGn', 'PiYG', 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu',
52
- 'RdYlBu', 'RdYlGn', 'Spectral', 'coolwarm', 'bwr', 'seismic',
53
- 'binary', 'gist_yarg', 'gist_gray', 'gray', 'bone', 'pink',
54
- 'spring', 'summer', 'autumn', 'winter', 'cool', 'Wistia', 'hot',
55
- 'afmhot', 'gist_heat', 'copper', 'red', 'green', 'blue', 'magenta',
56
- 'yellow', 'cyan', 'red_heat', 'green_heat', 'blue_heat', 'ocean',
57
- 'terrain', 'jet', 'stdgamma', 'hsv', 'twilight', 'twilight_shifted',
58
- 'Accent', 'Spectral', 'Pastel1', 'Pastel2', 'Paired', 'Accent',
59
- 'Dark2', 'Set1', 'Set2', 'Set3', 'tab10', 'tab20', 'tab20b',
60
- 'tab20c', 'flag', 'prism', 'ocean', 'gist_earth', 'terrain',
61
- 'gist_stern', 'gnuplot', 'gnuplot2', 'CMRmap', 'cubehelix', 'brg',
62
- 'gist_rainbow', 'rainbow', 'jet', 'turbo', 'nipy_spectral',
63
- 'gist_ncar' ):
64
- if cname in _cmaps:
47
+ ColorMaps = {} # dict of all colormaps, including reversed
48
+
49
+
50
+ for cname in ('gray', 'coolwarm', 'viridis', 'civids', 'inferno', 'plasma',
51
+ 'magma', 'cividis', 'berlin', 'managua', 'vanimo', 'turbo',
52
+ 'cool', 'hot', 'bone', 'Wistia', 'Grays', 'Purples', 'Blues',
53
+ 'Greens', 'Oranges', 'Reds', 'red_white', 'green_white',
54
+ 'blue_white','YlOrBr', 'YlOrRd', 'OrRd', 'PuRd', 'RdPu',
55
+ 'BuPu', 'GnBu', 'PuBu', 'YlGnBu', 'PuBuGn', 'BuGn', 'YlGn',
56
+ 'PiYG', 'PRGn', 'RdBu', 'RdPu', 'RdYlBu', 'RdYlGn', 'PiYG',
57
+ 'PRGn', 'BrBG', 'PuOr', 'RdGy', 'RdBu', 'RdYlBu', 'RdYlGn',
58
+ 'Spectral', 'bwr','brg', 'seismic', 'pink', 'spring', 'summer',
59
+ 'autumn', 'winter', 'afmhot', 'copper', 'red', 'green', 'blue',
60
+ 'magenta', 'yellow', 'cyan', 'red_heat', 'green_heat',
61
+ 'blue_heat', 'ocean', 'terrain', 'jet', 'stdgamma', 'Accent',
62
+ 'Spectral', 'ocean', 'terrain', 'gnuplot', 'gnuplot2',
63
+ 'CMRmap', 'cubehelix', 'rainbow'):
64
+ if cname in _cmaps and cname not in ColorMaps:
65
65
  ColorMaps[cname] = _cmaps[cname]
66
- ColorMap_Names.append(cname)
67
66
  rname = f'{cname}_r'
68
- if rname in _cmaps:
67
+ if rname in _cmaps and rname not in ColorMaps:
69
68
  ColorMaps[rname] = _cmaps[rname]
70
69
 
70
+ # curated list of default of colormap names (not including '_r')
71
+ ColorMap_List = ['gray', 'coolwarm', 'viridis', 'cividis',
72
+ 'inferno', 'plasma', 'magma', 'berlin',
73
+ 'managua', 'vanimo', 'turbo', 'hot', 'cool', 'bone', 'Wistia']
71
74
 
72
75
  Contrast_Levels = ('0', '0.00010', '0.00015', '0.00020', '0.0003', '0.0005',
73
76
  '0.0007', '0.0010', '0.0015', '0.0020', '0.003', '0.005',
@@ -528,6 +531,36 @@ class ImageConfigFrame(wx.Frame):
528
531
 
529
532
  return self.finish_subpanel(panel, sizer)
530
533
 
534
+ def make_colormap_panel(self, parent, font=None):
535
+ panel, sizer = self.begin_subpanel(parent, font=font)
536
+
537
+ label = SimpleText(panel, "ColorMaps:")
538
+ cmap_apply = Button(panel, 'Apply', size=(125, -1),
539
+ action=self.onColorMaps)
540
+
541
+ self.cmap_view = cview = dv.DataViewListCtrl(panel, style=DVSTYLE)
542
+ cview.SetMinSize((400, 450))
543
+ cview.AppendToggleColumn(' Use ', width=75, mode=dv.DATAVIEW_CELL_ACTIVATABLE)
544
+ cview.AppendTextColumn(' Color Map ', width=175)
545
+ for col in range(2):
546
+ this = cview.Columns[col]
547
+ this.Sortable = True
548
+ this.Alignment = this.Renderer.Alignment = wx.ALIGN_LEFT
549
+
550
+ self.cmap_view.DeleteAllItems()
551
+ for name in ColorMaps:
552
+ if not name.endswith('_r'):
553
+ self.cmap_view.AppendItem((name in ColorMap_List, name))
554
+
555
+ irow = 0
556
+ sizer.Add(label, (irow, 0), (1, 1), labstyle, 2)
557
+ sizer.Add(cmap_apply, (irow, 1), (1, 1), labstyle, 2)
558
+ irow += 1
559
+ sizer.Add(self.cmap_view, (irow, 0), (5, 3), labstyle, 2)
560
+
561
+ return self.finish_subpanel(panel, sizer)
562
+
563
+
531
564
  def make_slice_panel(self, parent, font=None):
532
565
  panel, sizer = self.begin_subpanel(parent, font=font)
533
566
 
@@ -724,18 +757,20 @@ class ImageConfigFrame(wx.Frame):
724
757
  self.SetFont(font)
725
758
 
726
759
  self.nb = flatnotebook(self, with_nav_buttons=True, with_smart_tabs=True)
727
- self.nb.AddPage(self.make_contour_panel(parent=self.nb, font=font),
728
- 'Contours', True)
729
-
760
+ self.nb.AddPage(self.make_scalebar_panel(parent=self.nb, font=font),
761
+ 'Scalebar', True)
730
762
  self.nb.AddPage(self.make_grid_panel(parent=self.nb, font=font),
731
763
  'Grid Overlay', True)
732
764
 
733
765
  self.nb.AddPage(self.make_slice_panel(parent=self.nb, font=font),
734
766
  'X/Y Slices', True)
735
767
 
736
- self.nb.AddPage(self.make_scalebar_panel(parent=self.nb, font=font),
737
- 'Scalebar', True)
768
+ self.nb.AddPage(self.make_colormap_panel(parent=self.nb, font=font),
769
+ 'Color Maps', True)
738
770
 
771
+ self.nb.AddPage(self.make_contour_panel(parent=self.nb, font=font),
772
+ 'Contours', True)
773
+ self.nb.SetSelection(0)
739
774
  sizer = wx.BoxSizer(wx.VERTICAL)
740
775
  sizer.Add(self.nb, 1, wx.GROW|wx.ALIGN_LEFT|wx.LEFT|wx.TOP|wx.BOTTOM|wx.EXPAND, 3)
741
776
  autopack(self, sizer)
@@ -746,6 +781,21 @@ class ImageConfigFrame(wx.Frame):
746
781
  self.Show()
747
782
  self.Raise()
748
783
 
784
+ def onColorMaps(self, event=None):
785
+ selected = []
786
+ for row in range(self.cmap_view.GetItemCount()):
787
+ sel = self.cmap_view.GetValue(row, 0)
788
+ name = self.cmap_view.GetValue(row, 1)
789
+ if sel:
790
+ selected.append(name)
791
+
792
+ global ColorMap_List
793
+ ColorMap_List = selected
794
+ if len(self.parent.cmap_panels) == 1:
795
+ cmap_choice = self.parent.cmap_panels[0].cmap_choice
796
+ cmap_choice.Clear()
797
+ cmap_choice.AppendItems(selected)
798
+
749
799
  def onGridEvents(self, event=None):
750
800
  self.conf.show_grid = self.show_grid.IsChecked()
751
801
  self.conf.grid_color = hexcolor(self.grid_color.GetValue()[:3])
@@ -18,7 +18,7 @@ from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
18
18
  from wxutils import get_cwd
19
19
 
20
20
  from .imagepanel import ImagePanel
21
- from .imageconf import (ColorMaps, ColorMap_Names, Interp_List, Contrast_Levels,
21
+ from .imageconf import (ColorMaps, ColorMap_List, Interp_List, Contrast_Levels,
22
22
  Slices_List, RGB_COLORS, ImageConfigFrame)
23
23
  from .baseframe import BaseFrame
24
24
  from .plotframe import PlotFrame
@@ -54,27 +54,25 @@ class ColorMapPanel(wx.Panel):
54
54
  reverse = False
55
55
  cmapname = default
56
56
 
57
- if colormap_list is None or len(colormap_list) < 1:
58
- colormap_list = ColorMap_Names
57
+ if colormap_list is not None:
58
+ cmap_choice = wx.Choice(self, size=(90, -1), choices=colormap_list)
59
+ cmap_choice.Bind(wx.EVT_CHOICE, self.onCMap)
60
+ self.cmap_choice = cmap_choice
59
61
 
60
- cmap_choice = wx.Choice(self, size=(90, -1), choices=colormap_list)
61
- cmap_choice.Bind(wx.EVT_CHOICE, self.onCMap)
62
- self.cmap_choice = cmap_choice
62
+ if cmapname not in colormap_list:
63
+ cmapname = colormap_list[0]
63
64
 
64
- if cmapname not in colormap_list:
65
- cmapname = colormap_list[0]
65
+ if cmapname.endswith('_r'):
66
+ reverse = True
67
+ cmapname = cmapname[:-2]
68
+ cmap_choice.SetStringSelection(cmapname)
69
+ self.imgpanel.conf.cmap[color] = ColorMaps.get(cmapname, ColorMaps['gray'])
66
70
 
67
- if cmapname.endswith('_r'):
68
- reverse = True
69
- cmapname = cmapname[:-2]
70
- cmap_choice.SetStringSelection(cmapname)
71
+ cmap_reverse = wx.CheckBox(self, label='Reverse', size=(60, -1))
72
+ cmap_reverse.Bind(wx.EVT_CHECKBOX, self.onCMapReverse)
73
+ cmap_reverse.SetValue(reverse)
74
+ self.cmap_reverse = cmap_reverse
71
75
 
72
- cmap_reverse = wx.CheckBox(self, label='Reverse', size=(60, -1))
73
- cmap_reverse.Bind(wx.EVT_CHECKBOX, self.onCMapReverse)
74
- cmap_reverse.SetValue(reverse)
75
- self.cmap_reverse = cmap_reverse
76
-
77
- self.imgpanel.conf.cmap[color] = ColorMaps.get(cmapname, ColorMaps['gray'])
78
76
 
79
77
  maxval = self.imgpanel.conf.cmap_range
80
78
  wd, ht = 1.0, 0.15
@@ -678,7 +676,7 @@ Keyboard Shortcuts: (For Mac OSX, replace 'Ctrl' with 'Apple')
678
676
  else:
679
677
  self.cmap_panels[0] = ColorMapPanel(panel, self.panel,
680
678
  default='gray',
681
- colormap_list=ColorMap_Names)
679
+ colormap_list=ColorMap_List)
682
680
 
683
681
  sizer.Add(self.cmap_panels[0], 0, lsty, 1)
684
682
 
@@ -16,7 +16,6 @@ from wxutils.themes import get_theme
16
16
 
17
17
  from wxmplot.vispy_utils import vispy_colour, vispy_init, vsync_for_platform
18
18
 
19
- vispy_init()
20
19
 
21
20
  from vispy import scene # noqa: E402
22
21
 
@@ -36,6 +35,8 @@ class LinePlot(wx.Panel):
36
35
  ) -> None:
37
36
  """Initialise the LinePlot panel."""
38
37
  super().__init__(parent, style=wx.BORDER_NONE)
38
+ vispy_init()
39
+
39
40
  self.SetMinSize((-1, 160))
40
41
  self.SetBackgroundStyle(wx.BG_STYLE_PAINT)
41
42
 
@@ -624,4 +625,3 @@ class LinePlot(wx.Panel):
624
625
  result = axes_rgb.copy()
625
626
  result[mt:mt + ph, ml:ml + pw] = canvas_rgb
626
627
  return result
627
-
@@ -3,14 +3,12 @@
3
3
  # wxmplott GUI to Configure Line Plots
4
4
 
5
5
  from functools import partial
6
- import yaml
7
6
  import numpy as np
8
7
  import wx
9
8
  import wx.lib.colourselect as csel
10
9
  import wx.lib.scrolledpanel as scrolled
11
10
 
12
- from wxutils import (flatnotebook, get_color, set_color,
13
- SimpleText, TextCtrl)
11
+ from wxutils import (flatnotebook, get_color)
14
12
 
15
13
  from .utils import LabeledTextCtrl, MenuItem, Choice, FloatSpin
16
14
  from .config import PlotConfig
@@ -29,39 +27,10 @@ def ffmt(val):
29
27
  if val is not None:
30
28
  try:
31
29
  return "%.5g" % val
32
- except:
30
+ except Exception:
33
31
  pass
34
32
  return repr(val)
35
33
 
36
- def clean_texmath(txt):
37
- """
38
- clean tex math string, preserving control sequences
39
- (incluing \n, so also '\nu') inside $ $, while allowing
40
- \n and \t to be meaningful in the text string
41
- """
42
- s = "%s " % txt
43
- out = []
44
- i = 0
45
- while i < len(s)-1:
46
- if s[i] == '\\' and s[i+1] in ('n', 't'):
47
- if s[i+1] == 'n':
48
- out.append('\n')
49
- elif s[i+1] == 't':
50
- out.append('\t')
51
- i += 1
52
- elif s[i] == '$':
53
- j = s[i+1:].find('$')
54
- if j < 0:
55
- j = len(s)
56
- out.append(s[i:j+2])
57
- i += j+2
58
- else:
59
- out.append(s[i])
60
- i += 1
61
- if i > 5000:
62
- break
63
- return ''.join(out).strip()
64
-
65
34
  ############################################################
66
35
  # monkey-patch of ColourSelect text setting
67
36
  # yes, a PR has been submitted to wx, no it is not merged or released.
@@ -245,13 +214,13 @@ class PlotConfigFrame(wx.Frame):
245
214
  raxes = axes[1]
246
215
  try:
247
216
  user_lims = self.conf.user_limits[laxes]
248
- except:
217
+ except Exception:
249
218
  user_lims = 4*[None]
250
219
  auto_b = wx.CheckBox(panel,-1, ' From Data ', (-1, -1), (-1, -1))
251
220
  auto_b.Bind(wx.EVT_CHECKBOX,self.onAutoBounds)
252
221
  try:
253
222
  auto_b.SetValue(self.conf.user_limits[laxes] == 4*[None])
254
- except:
223
+ except Exception:
255
224
  pass
256
225
 
257
226
  self.vpad_val = FloatSpin(panel, value=2.5, min_val=0, max_val=100,
@@ -962,7 +931,7 @@ class PlotConfigFrame(wx.Frame):
962
931
  return None
963
932
  try:
964
933
  return float(v)
965
- except:
934
+ except Exception:
966
935
  return None
967
936
 
968
937
  axes = self.canvas.figure.get_axes()
@@ -1096,7 +1065,7 @@ class PlotConfigFrame(wx.Frame):
1096
1065
  self.conf.relabel(**kws)
1097
1066
  wid.SetBackgroundColour(get_color('text_bg'))
1098
1067
  wid.SetForegroundColour(get_color('text'))
1099
- except: # as from latex error
1068
+ except Exception: # as from latex error
1100
1069
  print("invalid text for item ", item, s)
1101
1070
 
1102
1071
  wid.SetBackgroundColour(get_color('text_invalid_bg'))
@@ -1104,7 +1073,7 @@ class PlotConfigFrame(wx.Frame):
1104
1073
  elif item == 'trace':
1105
1074
  try:
1106
1075
  self.conf.set_trace_label(s, trace=trace)
1107
- except:
1076
+ except Exception:
1108
1077
  pass
1109
1078
 
1110
1079
  def onShowGrid(self,event):
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '2026.2.0'
22
- __version_tuple__ = version_tuple = (2026, 2, 0)
21
+ __version__ = version = '2026.2.2'
22
+ __version_tuple__ = version_tuple = (2026, 2, 2)
23
23
 
24
- __commit_id__ = commit_id = 'g37f101e64'
24
+ __commit_id__ = commit_id = 'gbb23702e8'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wxmplot
3
- Version: 2026.2.0
3
+ Version: 2026.2.2
4
4
  Summary: wxPython plotting widgets using matplotlib
5
5
  Author-email: Matthew Newville <matt.newville@gmail.com>
6
6
  License-Expression: MIT
@@ -1,149 +1,149 @@
1
1
  {
2
2
  "files": [
3
- "LICENSE",
4
- "ChangeLog",
5
- "pyproject.toml",
6
- "MANIFEST.in",
7
- "README.md",
8
- "setup.py",
9
- ".gitignore",
10
3
  ".gitattributes",
11
- "tests/basic_test.py",
12
- "wxmplot/config.py",
13
- "wxmplot/baseframe.py",
14
- "wxmplot/vispy_utils.py",
15
- "wxmplot/histogram.py",
16
- "wxmplot/multiframe.py",
17
- "wxmplot/basepanel.py",
18
- "wxmplot/imagematrixframe.py",
19
- "wxmplot/residualplotframe.py",
20
- "wxmplot/plotapp.py",
21
- "wxmplot/__init__.py",
22
- "wxmplot/stackedplotframe.py",
23
- "wxmplot/allow_idle_macosx.py",
24
- "wxmplot/utils.py",
25
- "wxmplot/imageframe.py",
26
- "wxmplot/plotpanel.py",
27
- "wxmplot/interactive.py",
28
- "wxmplot/inputhook.py",
29
- "wxmplot/image_canvas.py",
30
- "wxmplot/plotframe.py",
31
- "wxmplot/imageconf.py",
32
- "wxmplot/line_plot.py",
33
- "wxmplot/imagepanel.py",
34
- "wxmplot/plotconfigframe.py",
35
- "wxmplot/colors.py",
36
- "examples/stackedplot.py",
37
- "examples/scope_mode_generator.py",
38
- "examples/time_update.py",
39
- "examples/extra_marker_and_line_reporting.py",
40
- "examples/time.dat",
41
- "examples/scope_mode_mpl_compare.py",
42
- "examples/rgb_image.py",
43
- "examples/scatterplot.py",
44
- "examples/pilatus_display.py",
45
- "examples/image_canvas_ex.py",
46
- "examples/tifffile.py",
47
- "examples/histogram.py",
48
- "examples/leftright.py",
49
- "examples/wxmplot_jupyter.ipynb",
50
- "examples/BasicExamples.ipynb",
51
- "examples/DynamicExamples.ipynb",
52
- "examples/plotapp.py",
53
- "examples/scope_mode_function.py",
54
- "examples/discrete_data.py",
55
- "examples/basic_screenshot.py",
56
- "examples/image_scroll.py",
57
- "examples/compare_dislin_mpl.py",
58
- "examples/Pilatus.tiff",
59
- "examples/timedata.py",
60
- "examples/fill_uncertainties.py",
61
- "examples/ceo2.tiff",
62
- "examples/plot_many_traces.py",
63
- "examples/floatcontrol.py",
64
- "examples/multiple_yaxes.py",
65
- "examples/xafs.dat",
66
- "examples/interactive_multiplewindows.py",
67
- "examples/stripchart.py",
68
- "examples/tiff_display.py",
69
- "examples/fill_to_zero.py",
70
- "examples/theme_compare.py",
71
- "examples/demo.py",
72
- "examples/compare_plplot.py",
73
- "examples/simple.py",
74
- "examples/errorbar.py",
75
- "examples/contour.py",
76
- "examples/imagematrix.py",
77
- "examples/image.py",
78
- "examples/multiplot.py",
79
- "examples/plot_fromdatafile.py",
80
4
  ".github/dependabot.yml",
81
5
  ".github/workflows/test_wxmplot_install.yml",
82
- "doc/index.rst",
6
+ ".gitignore",
7
+ "ChangeLog",
8
+ "LICENSE",
9
+ "MANIFEST.in",
10
+ "README.md",
83
11
  "doc/Makefile",
12
+ "doc/_static/empty",
13
+ "doc/_static/scope_mode_function.mp4",
14
+ "doc/_static/scope_mode_generator.mp4",
15
+ "doc/_static/scope_mode_mpl_compare.mp4",
16
+ "doc/_templates/indexsidebar.html",
84
17
  "doc/comparisons.rst",
85
18
  "doc/conf.py",
86
19
  "doc/examples.rst",
87
20
  "doc/imagepanel.rst",
88
- "doc/overview.rst",
89
- "doc/interactive.rst",
90
- "doc/installation.rst",
91
- "doc/other.rst",
92
- "doc/plotpanel.rst",
93
- "doc/images/plot_compare_wxplot_wx.png",
94
- "doc/images/imagedisplay.png",
95
- "doc/images/wxmplot_dislin.png",
96
- "doc/images/contour_wxmplot.png",
97
- "doc/images/plot_alphafill_config.png",
98
- "doc/images/plot_compare_plotly.png",
21
+ "doc/images/ImageConfig.png",
99
22
  "doc/images/PlotConfig_LineProps.png",
100
23
  "doc/images/PlotConfig_LinePropsAlphaFill.png",
24
+ "doc/images/PlotConfig_Ranges.png",
25
+ "doc/images/PlotConfig_Scatter.png",
101
26
  "doc/images/PlotConfig_Text.png",
102
- "doc/images/multiplot.png",
103
- "doc/images/wxmplot_leftright.png",
104
- "doc/images/discrete_data.png",
105
- "doc/images/imshow_wxmplot.png",
27
+ "doc/images/basic_screenshot.png",
106
28
  "doc/images/contour.png",
107
- "doc/images/plot_compare_dislin.png",
108
- "doc/images/imshow_no_contrast.png",
109
- "doc/images/imshow_scalebar.png",
110
- "doc/images/two_axes.png",
111
- "doc/images/image_3color_white.png",
112
- "doc/images/PlotConfig_Scatter.png",
113
- "doc/images/plot_alphafill_to_dy.png",
114
- "doc/images/plot_alphafill_to_zero.png",
29
+ "doc/images/contour_wxmplot.png",
30
+ "doc/images/datafile_plot.png",
31
+ "doc/images/discrete_data.png",
115
32
  "doc/images/errorbar.png",
116
33
  "doc/images/histogram.png",
117
- "doc/images/plot_compare_qttutorial1_qt.png",
34
+ "doc/images/image_3color.png",
35
+ "doc/images/image_3color_white.png",
36
+ "doc/images/imagedisplay.png",
37
+ "doc/images/imagematrix.png",
38
+ "doc/images/imshow_high_contrast.png",
39
+ "doc/images/imshow_low_contrast.png",
118
40
  "doc/images/imshow_mpl.png",
41
+ "doc/images/imshow_no_contrast.png",
42
+ "doc/images/imshow_scalebar.png",
43
+ "doc/images/imshow_wxmplot.png",
44
+ "doc/images/interactive1.png",
45
+ "doc/images/interactive2.png",
119
46
  "doc/images/multiple_yaxes.png",
120
- "doc/images/wxmplot_composite.png",
47
+ "doc/images/multiplot.png",
48
+ "doc/images/plot_alphafill_config.png",
49
+ "doc/images/plot_alphafill_to_dy.png",
50
+ "doc/images/plot_alphafill_to_zero.png",
51
+ "doc/images/plot_compare_dislin.png",
52
+ "doc/images/plot_compare_plotly.png",
121
53
  "doc/images/plot_compare_plplot.png",
54
+ "doc/images/plot_compare_qt.png",
122
55
  "doc/images/plot_compare_qttutorial1.png",
56
+ "doc/images/plot_compare_qttutorial1_qt.png",
57
+ "doc/images/plot_compare_wxplot_wx.png",
58
+ "doc/images/plot_compare_wxplot_wxmplot.png",
123
59
  "doc/images/plot_mpl.png",
124
- "doc/images/scatterplot.png",
125
- "doc/images/PlotConfig_Ranges.png",
126
60
  "doc/images/plot_wxmplot.png",
127
- "doc/images/plot_compare_wxplot_wxmplot.png",
128
- "doc/images/imagematrix.png",
129
- "doc/images/plot_compare_qt.png",
130
- "doc/images/wxmplot_histogram.png",
61
+ "doc/images/scatterplot.png",
131
62
  "doc/images/stackedplot.png",
132
- "doc/images/ImageConfig.png",
133
63
  "doc/images/tiff_display.png",
134
- "doc/images/imshow_low_contrast.png",
135
64
  "doc/images/tifffile_image.png",
65
+ "doc/images/two_axes.png",
66
+ "doc/images/wxmplot_composite.png",
67
+ "doc/images/wxmplot_dislin.png",
68
+ "doc/images/wxmplot_histogram.png",
69
+ "doc/images/wxmplot_leftright.png",
136
70
  "doc/images/wxmplot_plplot.png",
137
- "doc/images/interactive1.png",
138
- "doc/images/image_3color.png",
139
- "doc/images/datafile_plot.png",
140
- "doc/images/basic_screenshot.png",
141
- "doc/images/interactive2.png",
142
- "doc/images/imshow_high_contrast.png",
143
- "doc/_templates/indexsidebar.html",
144
- "doc/_static/scope_mode_function.mp4",
145
- "doc/_static/empty",
146
- "doc/_static/scope_mode_generator.mp4",
147
- "doc/_static/scope_mode_mpl_compare.mp4"
71
+ "doc/index.rst",
72
+ "doc/installation.rst",
73
+ "doc/interactive.rst",
74
+ "doc/other.rst",
75
+ "doc/overview.rst",
76
+ "doc/plotpanel.rst",
77
+ "examples/BasicExamples.ipynb",
78
+ "examples/DynamicExamples.ipynb",
79
+ "examples/Pilatus.tiff",
80
+ "examples/basic_screenshot.py",
81
+ "examples/ceo2.tiff",
82
+ "examples/compare_dislin_mpl.py",
83
+ "examples/compare_plplot.py",
84
+ "examples/contour.py",
85
+ "examples/demo.py",
86
+ "examples/discrete_data.py",
87
+ "examples/errorbar.py",
88
+ "examples/extra_marker_and_line_reporting.py",
89
+ "examples/fill_to_zero.py",
90
+ "examples/fill_uncertainties.py",
91
+ "examples/floatcontrol.py",
92
+ "examples/histogram.py",
93
+ "examples/image.py",
94
+ "examples/image_canvas_ex.py",
95
+ "examples/image_scroll.py",
96
+ "examples/imagematrix.py",
97
+ "examples/interactive_multiplewindows.py",
98
+ "examples/leftright.py",
99
+ "examples/multiple_yaxes.py",
100
+ "examples/multiplot.py",
101
+ "examples/pilatus_display.py",
102
+ "examples/plot_fromdatafile.py",
103
+ "examples/plot_many_traces.py",
104
+ "examples/plotapp.py",
105
+ "examples/rgb_image.py",
106
+ "examples/scatterplot.py",
107
+ "examples/scope_mode_function.py",
108
+ "examples/scope_mode_generator.py",
109
+ "examples/scope_mode_mpl_compare.py",
110
+ "examples/simple.py",
111
+ "examples/stackedplot.py",
112
+ "examples/stripchart.py",
113
+ "examples/theme_compare.py",
114
+ "examples/tiff_display.py",
115
+ "examples/tifffile.py",
116
+ "examples/time.dat",
117
+ "examples/time_update.py",
118
+ "examples/timedata.py",
119
+ "examples/wxmplot_jupyter.ipynb",
120
+ "examples/xafs.dat",
121
+ "pyproject.toml",
122
+ "setup.py",
123
+ "tests/basic_test.py",
124
+ "wxmplot/__init__.py",
125
+ "wxmplot/allow_idle_macosx.py",
126
+ "wxmplot/baseframe.py",
127
+ "wxmplot/basepanel.py",
128
+ "wxmplot/colors.py",
129
+ "wxmplot/config.py",
130
+ "wxmplot/histogram.py",
131
+ "wxmplot/image_canvas.py",
132
+ "wxmplot/imageconf.py",
133
+ "wxmplot/imageframe.py",
134
+ "wxmplot/imagematrixframe.py",
135
+ "wxmplot/imagepanel.py",
136
+ "wxmplot/inputhook.py",
137
+ "wxmplot/interactive.py",
138
+ "wxmplot/line_plot.py",
139
+ "wxmplot/multiframe.py",
140
+ "wxmplot/plotapp.py",
141
+ "wxmplot/plotconfigframe.py",
142
+ "wxmplot/plotframe.py",
143
+ "wxmplot/plotpanel.py",
144
+ "wxmplot/residualplotframe.py",
145
+ "wxmplot/stackedplotframe.py",
146
+ "wxmplot/utils.py",
147
+ "wxmplot/vispy_utils.py"
148
148
  ]
149
149
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2026.2.2",
3
+ "distance": 0,
4
+ "node": "gbb23702e8d55a50452dc722de6db921762942571",
5
+ "dirty": false,
6
+ "branch": "master",
7
+ "node_date": "2026-08-09"
8
+ }
@@ -1,6 +0,0 @@
1
- #!/usr/bin/python
2
- import numpy as np
3
- import wxmplot.interactive as wi
4
-
5
- x = np.linspace(0.0, 20.0, 201)
6
- wi.plot(x, np.sin(x)/(x+1), ylabel='response', xlabel='T (sec)')
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "2026.2.0",
3
- "distance": 0,
4
- "node": "g37f101e641881ef0a7e5ee7598af4ab26db635d9",
5
- "dirty": false,
6
- "branch": "master",
7
- "node_date": "2026-07-26"
8
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes