code: def after_qc_bad_reads_chart(self):
          
          # Specify the order of the different possible categories
          keys = OrderedDict()
          keys['good_reads'] =                     { 'name': 'Good Reads' }
          keys['bad_reads_with_bad_barcode'] =     { 'name': 'Bad Barcode' }
          keys['bad_reads_with_bad_overlap'] =     { 'name': 'Bad Overlap' }
          keys['bad_reads_with_bad_read_length'] = { 'name': 'Bad Read Length' }
          keys['bad_reads_with_low_quality'] =     { 'name': 'Low Quality' }
          keys['bad_reads_with_polyX'] =           { 'name': 'PolyX' }
          keys['bad_reads_with_reads_in_bubble'] = { 'name': 'Reads In Bubble' }
          keys['bad_reads_with_too_many_N'] =      { 'name': 'Too many N' }
  
          # Config for the plot
          pconfig = {
              'id': 'afterqc_bad_reads_plot',
              'title': 'AfterQC: Filtered Reads',
              'ylab': '# Reads',
              'cpswitch_counts_label': 'Number of Reads',
              'hide_zero_cats': False,
          }
          return bargraph.plot(self.afterqc_data, keys, pconfig)
docs: Function to generate the AfterQC bad reads bar plot