Как нанести два ряда данных на гистограмму с отдельными осями диапазона - PullRequest
0 голосов
/ 27 апреля 2019

Мне было интересно, возможно ли построить (XYPlot) набор данных в JFreeChart, где серии, содержащиеся в наборе данных, нанесены на отдельные диапазоны по оси Y. Дата группируется по категории / метке времени, например, если бы мой набор данных был таким:

Timestamp        Val1        Val2
2019-04-26       0.6         603
2019-04-25       2.1         1040
2019-04-24       4.1         255

Невозможно нанести оба ряда значений на одну и ту же ось диапазона.

Я попытался извлечь каждую серию в отдельный набор данных, чтобы я мог позвонить plot.mapDataSetToRangeAxis(); но когда я добавляю на график несколько наборов данных, столбцы, как правило, отображаются друг над другом. Возможно, я упускаю что-то простое?

Есть несколько постов, которые касаются отдельных элементов того, что я ищу, но думаю, что мне нужно что-то, что объединяет эти два:

Вот код , который я сейчас использую - внутри модуля отчетности по индуктивной автоматизации / зажиганию; они позволяют вам настроить JFreeChart перед рендерингом.

def configureChart(chart):
    from org.jfree.chart.axis import DateAxis
    from org.jfree.data.xy import XYSeries, XYSeriesCollection
    from org.jfree.chart.renderer.xy import ClusteredXYBarRenderer
    from java.awt import Color
    from java.text import NumberFormat

    class mins_to_str(NumberFormat):
        def format(self,*args,**kwargs):
            r = ''
            number = args[0]
            hrs = number//60
            mins = number%60
            r = '%02i:%02i' %(hrs,mins)
            if len(args)>1:
                toAppendTo = args[1]
                pos = args[2].getField()
                r = toAppendTo.insert(pos,r)
            return r

    plt = chart.getPlot()

    renderer = ClusteredXYBarRenderer
    xax = DateAxis()
    plt.setDomainAxis(xax)

    for i in range(plt.getDatasetCount()):
        d = plt.getDataset(i)
        dsc = XYSeriesCollection()
        series = XYSeries(d.getSeriesKey(0))
        print('SERIES [%s]' %series)
        for r in range(d.getItemCount(0)):
            xv = d.getXValue(0,r)
            yv = d.getYValue(0,r)
            print('  X: %s (%s)' %(xv,type(xv)))
            print('  Y: %s (%s)' %(yv,type(yv)))
            series.add(xv,yv)
        dsc.addSeries(series)
        plt.setDataset(i,dsc) # assuming all of my series need to be in the same dsc for this to work...
        plt.setRenderer(i,renderer)

        if i > 0:
            plt.mapDatasetToRangeAxis(i,1)
        else:
            plt.mapDatasetToRangeAxis(i,0)  

    plt.getRangeAxis(0).setNumberFormatOverride(mins_to_str())

В настоящее время я получаю это:

Chart Screenshot

Любые идеи / помощь будет принята с благодарностью.

...