class_docstr: The PlateViewer class lets the user view the files associated with plates
  
  The idea here is that the PlateViewer is given a list of image files
  with plate, well and site metadata. The plate viewer organizes the
  files and lets the user browse individual plates.
class_docstr_tok: ["The","PlateViewer","class","lets","the","user","view","the","files","associated","with","plates","The","idea","here","is","that","the","PlateViewer","is","given","a","list","of","image","files","with","plate",",","well","and","site","metadata",".","The","plate","viewer","organizes","the","files","and","lets","the","user","browse","individual","plates","."]
code: def draw_plate(self):
      if self.plate_bitmap is not None:
          self.plate_bitmap.Destroy()
          self.plate_bitmap = None
      self.plate_panel.Refresh()
      width, height = [
          max(x, 1) for x in self.plate_panel.GetClientSize()
      ]
      self.plate_bitmap = wx.Bitmap(width, height, 32)
      dc = wx.MemoryDC(self.plate_bitmap)
      dc.SetBackground(wx.Brush(self.plate_panel.GetBackgroundColour()))
      dc.Clear()
      gc = wx.GraphicsContext.Create(dc)
      gc.SetFont(self.plate_panel.GetFont(), wx.Colour("black"))
      if self.plate_data is None:
          return
      side = self.get_well_side()
      radius = self.get_radius()
      gc.SetPen(wx.BLACK_PEN)
      for row in range(self.data.plate_layout[0]):
          text = well_row_name(row)
          w, h = gc.GetTextExtent(text)
          y = self.get_center(row, 0, side)[1] - int(h / 2)
          gc.DrawText(text, 3, y)
  
      for col in range(self.data.plate_layout[1]):
          text = "%02d" % (col + 1)
          w, h, descent, leading = gc.GetFullTextExtent(text)
          x = self.get_center(0, col, side)[0] - w / 2
          gc.DrawText(text, x, 3)
  
      for row in range(self.data.plate_layout[0]):
          for col in range(self.data.plate_layout[1]):
              x, y = self.get_center(row, col, side)
              if (
                  row < self.plate_data.shape[0]
                  and col < self.plate_data.shape[1]
              ):
                  well = self.plate_data[row, col]
                  if well is None:
                      brush = wx.NullBrush
                  else:
                      brush = wx.Brush(self.get_fill(well))
                  gc.SetBrush(brush)
                  gc.DrawEllipse(
                      x - radius, y - radius, radius * 2, radius * 2
                  )
  
imports: import multiprocessing
  import threading
  import traceback
  import matplotlib
  import matplotlib.backends.backend_wx
  import matplotlib.backends.backend_wxagg
  import matplotlib.cm
  import matplotlib.figure
  import numpy
  import wx
  import wx.grid
  import scyjava
label_desc: Use image node_id 19 for calling the PlateViewer obj's underlying member method code with example usage: obj.draw_plate() without return types