【问题标题】:How to plot two data series on bar chart with separate range axes如何在具有单独范围轴的条形图上绘制两个数据系列
【发布时间】:2019-04-26 22:25:57
【问题描述】:

我想知道是否可以在 JFreeChart 中绘制 (XYPlot) 数据集,其中数据集中包含的系列是针对单独的 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())

目前,我得到了这个:

任何想法/帮助将不胜感激。

【问题讨论】:

    标签: python jfreechart ignition


    【解决方案1】:

    这是点火报告开发环境中的时间序列图。

    这个完全是使用图表选项设置的,只需要一点点 JFreeChart 脚本。应该类似于设计条形图。希望对您有所帮助。

    JFreeChart 脚本 -

        #Import Java classes - Color & JFreeChart
    from java.awt import Color
    from org.jfree.chart.plot import CategoryPlot
    
    #get Plot of Current Chart
    plot = chart.getPlot()
    
    #Set color of domain and range gridlines
    plot.setDomainGridlinePaint(Color.black)
    plot.setRangeGridlinePaint(Color.black)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      相关资源
      最近更新 更多