def __init__(self, jsonObj):
     self.comment = jsonObj['comment']
     self.xLabel = jsonObj['xLabel']
     self.yLabel = jsonObj['yLabel']
     self.type = GraphTypes[jsonObj['type']]
     self.defaultSeries = DefaultSeries(
         jsonObj=(None if 'seriesDefault' not in
                  jsonObj else jsonObj['seriesDefault']))
     self.series = []
     seriesArray = jsonObj['series']
     for item in seriesArray:
         if self.type is GraphTypes.CATEGORY:
             self.series.append(SeriesCategory(item, self.defaultSeries))
         elif self.type is GraphTypes.XY:
             self.series.append(SeriesXy(item, self.defaultSeries))
         elif self.type is GraphTypes.LOG:
             self.series.append(SeriesLog(item, self.defaultSeries))
         else:
             raise RuntimeError('Unsupported series type.')
     self.plotlyLayout = {
         'title': self.GetInGraphTitle(),
         'legend': {
             'orientation': 'h',
             'y': -0.30
         },
         'yaxis': {
             'gridcolor': '#eee',
             'title': self.yLabel
         },
         'xaxis': {
             'gridcolor': '#eee',
             'title': self.xLabel,
             'type': self.type.plotyType
         },
         'width': 600,
         'height': 350,
         'margin': {
             'l': 0,
             'r': 0,
             't': 50,
             'b': 0
         },
         'plot_bgcolor': '#fff'
     }
     if 'PlotlyLayout' in jsonObj:
         ConfigParser.RecursiveUpdateDict(self.plotlyLayout,
                                          jsonObj['PlotlyLayout'])
    def GetScatter(self, sqlEngine, idx, markerSym=None):

        if markerSym is None and idx >= len(PLOTY_MARKER_SELECTED_SYMBOLS):
            raise RuntimeError(
                'The number of series is more than the selected marker symbols'
            )

        markerSym = markerSym if markerSym is not None else PLOTY_MARKER_SELECTED_SYMBOLS[
            idx]

        midXY = self.GetMidXY(sqlEngine)
        errorXY = self.GetPlotyErrorXY(sqlEngine)

        scatter = {}
        if 'X' in errorXY and 'Y' in errorXY:
            scatter = {
                'name': self.name,
                'mode': 'lines+markers',
                'marker': {
                    'symbol': markerSym,
                    'size': 13
                },
                'x': midXY['X'],
                'y': midXY['Y'],
                'error_x': errorXY['X'],
                'error_y': errorXY['Y']
            }
        elif 'X' in errorXY:
            scatter = {
                'name': self.name,
                'mode': 'lines+markers',
                'marker': {
                    'symbol': markerSym,
                    'size': 13
                },
                'x': midXY['X'],
                'y': midXY['Y'],
                'error_x': errorXY['X']
            }
        elif 'Y' in errorXY:
            scatter = {
                'name': self.name,
                'mode': 'lines+markers',
                'marker': {
                    'symbol': markerSym,
                    'size': 13
                },
                'x': midXY['X'],
                'y': midXY['Y'],
                'error_y': errorXY['Y']
            }
        else:
            scatter = {
                'name': self.name,
                'mode': 'lines+markers',
                'marker': {
                    'symbol': markerSym,
                    'size': 13
                },
                'x': midXY['X'],
                'y': midXY['Y']
            }

        ConfigParser.RecursiveUpdateDict(scatter, self.plotlyLayoutUpt)
        return go.Scatter(**scatter)