Java Swing:jFreeChart。如何在条形图的图例中设置颜色框的颜色?

时间:2017-03-14 09:57:30

标签: java swing jframe bar-chart jfreechart

我创建了一个应用程序,它读取arduino的串行输入(人腿区域的压力和温度数据),并将其实时绘制到jfreechart条形图中。 我已创建它,以便当系列(压力或温度)中特定类别(腿部区域)的任何条形值超过特定阈值时,特定条形颜色从蓝色(压力)/绿色(温度)变为红色(表示该区域的该值太高)。当值降低到此阈值以下时,它也可以从红色变为蓝色/绿色。

压力阈值= 300 温度阈值= 37

以下是此流程和图表的图片:

低于阈值: All Sensor Outputs Below Threshold

高于门槛: Sensor Output Values Above Threshold

从上面的图片(在链接中)你可以看到这一切都运作良好,但这个系列的图例颜色框很疯狂(从图中可以看到)。它不断循环通过光谱中的所有颜色(蓝色,黑色,绿色,黄色等)。因为这是实时的,它每50ms就会发生变化。

我想知道是否有办法设置颜色框(对于图例中的每个系列)始终显示蓝色表示压力,绿色表示温度,(即使条形图可能会偶尔变为红色)

以下是我用来实现此目的的一些代码:

Paint[] colorsP = new Paint[dataP.length];   
Paint[] colorsT = new Paint[dataT.length];
for(int i = 0; i < colorsP.length; i++)
{
colorsP[i] = dataP[i] > 300 ? Color.red:Color.blue;  //Threshold decision
}

CategoryItemRenderer rendererP = new CustomRenderer(colorsP); //RendererP for Pressure series
        for(int i = 0; i < colorsT.length; i++)
            {
             colorsT[i] = dataT[i] > 37 ? Color.red:Color.green; //threshold        decision
            }           

CategoryItemRenderer rendererT = new CustomRenderer(colorsT); //Renderer for Temperature Series
//below is code for adding the value of each bar to the top of the bars.
ItemLabelPosition p = new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_CENTER,TextAnchor.TOP_CENTER,0);
rendererP.setPositiveItemLabelPosition(p);      
rendererP.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE5,TextAnchor.BOTTOM_RIGHT)); 
DecimalFormat NumberFormat = new DecimalFormat("##");
rendererP.setSeriesItemLabelGenerator(0, new StandardCategoryItemLabelGenerator("{2}",NumberFormat));                       
rendererP.setSeriesItemLabelsVisible(0, true);  
rendererT.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE5,TextAnchor.BOTTOM_RIGHT));
rendererT.setSeriesItemLabelGenerator(1, new StandardCategoryItemLabelGenerator("{2}",NumberFormat)); 
rendererT.setSeriesItemLabelsVisible(1, true);
                        ;

rendererP.setBasePositiveItemLabelPosition(p);
rendererT.setBasePositiveItemLabelPosition(p);
//assign each series of the plot its specific renderer
plot.setRenderer(0,rendererP);
plot.setRenderer(1,rendererT);          

0 个答案:

没有答案