我创建了一个应用程序,它读取arduino的串行输入(人腿区域的压力和温度数据),并将其实时绘制到jfreechart条形图中。 我已创建它,以便当系列(压力或温度)中特定类别(腿部区域)的任何条形值超过特定阈值时,特定条形颜色从蓝色(压力)/绿色(温度)变为红色(表示该区域的该值太高)。当值降低到此阈值以下时,它也可以从红色变为蓝色/绿色。
压力阈值= 300 温度阈值= 37
以下是此流程和图表的图片:
低于阈值:
高于门槛:
从上面的图片(在链接中)你可以看到这一切都运作良好,但这个系列的图例颜色框很疯狂(从图中可以看到)。它不断循环通过光谱中的所有颜色(蓝色,黑色,绿色,黄色等)。因为这是实时的,它每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);