Axis can be set to be scrollable. This is very useful, when there are many elements or BoxZoomer plug-in is used. This can be enabled using setScrollable() method.
Enabling scroll ability:
1 | // setting mapper MathAxisMapper xMapper = new MathAxisMapper(0, 40); // setting axis Axis2DX axisX = new Axis2DX(xMapper); // enabling scrolling axisX.setScrollable(true); |
There is a possibility to stack more than one axis on chart. This can be achieved using addBottomXAxis(), addTopXAxis(), addLeftYAxis() or addRightYAxis() methods.
1 | Axis2DY axisY2 = new Axis2DY(new MathAxisMapper(0, 17)); //creating axis axisY2.setTitle("Number of Values"); //... Chart2D chart = new Chart2D(); //creating chart //.. chart.addRightYAxis(axisY2); //stacking y axis to right with title "Number of Values" |
Figure 5.2.2.2 Stacked Axes on Chart Demonstration
1 | import java.awt.*; import java.text.DecimalFormat; import java.util.ArrayList; import javax.swing.JFrame; import lt.monarch.chart.chart2D.*; import lt.monarch.chart.chart2D.axis.*; import lt.monarch.chart.chart2D.axis.layouters.SimpleLinearLabelLayouter; import lt.monarch.chart.chart2D.engine.PlaneMapper2D; import lt.monarch.chart.chart2D.series.*; import lt.monarch.chart.engine.*; import lt.monarch.chart.legend.Legend; import lt.monarch.chart.mapper.*; import lt.monarch.chart.marker.*; import lt.monarch.chart.models.*; import lt.monarch.chart.style.Styles; import lt.monarch.chart.style.enums.*; import lt.monarch.chart.style.tags.SeriesPaintTags; import lt.monarch.chart.swing.JChartPanel; import lt.monarch.chart.view.LabeledChart; public class StackedAxisDemo extends JFrame { private JChartPanel m_chartPanel; public StackedAxisDemo () { setLayout(new BorderLayout()); initChart(); add(m_chartPanel, BorderLayout.CENTER); } public static float Round(float Rval, int Rpl) { float p = (float)Math.pow(10, Rpl); Rval = Rval * p; float tmp = Math.round(Rval); return tmp / p; } private void initChart() { /* * Creating data models */ ChartDataModel modelZ = generateZModel(); int inIntervalZ = getInt(modelZ, -5.5, -4.5); int lessThanIntervalZ = getLess(modelZ, -5.5, 0.05); int moreThanIntervalZ = getMore(modelZ, -4.5, 0.05); int nullZ = getNull(modelZ); ChartDataModel modelA = generateAModel(); int inIntervalA = getInt(modelA, -0.3, 0.3); int lessThanIntervalA = getLess(modelA, -0.3, 0.1); int moreThanIntervalA = getMore(modelA, 0.3, 0.1); int nullA = getNull(modelA); ChartDataModel modelX = generateXModel(); int inIntervalX = getInt(modelX, -0.3, 0.3); int lessThanIntervalX = getLess(modelX, -0.3, 0.1); int moreThanIntervalX = getMore(modelX, 0.3, 0.1); int nullX = getNull(modelX); Styles<SeriesPaintTags> style = new Styles<SeriesPaintTags>(); style.getPaintStyle().setForeground(null); /* * Creating meta data model */ MetaDataModel meta1 = new MetaDataModel(); meta1.setData(MetaDataType.STYLE, style); meta1.setData(MetaDataType.LABEL, 0, Round((float)(inIntervalZ * 100.0 / 17), 2) + " %"); meta1.setData(MetaDataType.LABEL, 1, Round((float)(inIntervalA * 100.0 / 17), 2) + " %"); meta1.setData(MetaDataType.LABEL, 2, Round((float)(inIntervalX * 100.0 / 17), 2) + " %"); MetaDataModel meta2 = new MetaDataModel(); meta2.setData(MetaDataType.STYLE, style); meta2.setData(MetaDataType.LABEL, 0, Round((float)(lessThanIntervalZ * 100.0 / 17), 2) + " %"); meta2.setData(MetaDataType.LABEL, 1, Round((float)(lessThanIntervalA * 100.0 / 17), 2) + " %"); MetaDataModel meta3 = new MetaDataModel(); meta3.setData(MetaDataType.STYLE, style); meta3.setData(MetaDataType.LABEL, 0, Round((float)(moreThanIntervalZ * 100.0 / 17), 2) + " %"); meta3.setData(MetaDataType.LABEL, 1, Round((float)(moreThanIntervalA * 100.0 / 17), 2) + " %"); meta3.setData(MetaDataType.LABEL, 2, Round((float)(moreThanIntervalX * 100.0 / 17), 2) + " %"); MetaDataModel meta4 = new MetaDataModel(); meta4.setData(MetaDataType.STYLE, style); meta4.setData(MetaDataType.LABEL, 1, Round((float)(nullA * 100.0 / 17), 2) + " %"); meta4.setData(MetaDataType.LABEL, 2, Round((float)(nullX * 100.0 / 17), 2) + " %"); LabeledMarker m1 = new LabeledMarker(new NullMarker(), meta1); m1.getPaintStyle().setBackground(null); m1.getPaintStyle().setForeground(null); LabeledMarker m2 = new LabeledMarker(new NullMarker(), meta2); m2.getPaintStyle().setBackground(null); m2.getPaintStyle().setForeground(null); LabeledMarker m3 = new LabeledMarker(new NullMarker(), meta3); m3.getPaintStyle().setBackground(null); m3.getPaintStyle().setForeground(null); LabeledMarker m4 = new LabeledMarker(new NullMarker(), meta4); m4.getPaintStyle().setBackground(null); m4.getPaintStyle().setForeground(null); // in interval ArrayList<Object[]> list = new ArrayList<Object[]>(); list.add(new Object[] { "Z", new Double(inIntervalZ) }); list.add(new Object[] { "A", new Double(inIntervalA) }); list.add(new Object[] { "X", new Double(inIntervalX) }); // less ChartDataModel dataModel1 = new ChartDataModel(DataModelUtil.convert(list)); list = new ArrayList<Object[]>(); list.add(new Object[] { "Z", new Double(lessThanIntervalZ) }); list.add(new Object[] { "A", new Double(lessThanIntervalA) }); list.add(new Object[] { "X", new Double(lessThanIntervalX) }); // more ChartDataModel dataModel2 = new ChartDataModel(DataModelUtil.convert(list)); // null list = new ArrayList<Object[]>(); list.add(new Object[] { "Z", new Double(moreThanIntervalZ) }); list.add(new Object[] { "A", new Double(moreThanIntervalA) }); list.add(new Object[] { "X", new Double(moreThanIntervalX) }); ChartDataModel dataModel3 = new ChartDataModel(DataModelUtil.convert(list)); list = new ArrayList<Object[]>(); list.add(new Object[] { "Z", new Double(nullZ) }); list.add(new Object[] { "A", new Double(nullA) }); list.add(new Object[] { "X", new Double(nullX) }); ChartDataModel dataModel4 = new ChartDataModel(DataModelUtil.convert(list)); /* * Creating stacked data models */ StackedDataModel dm1 = new StackedDataModel(dataModel1); StackedDataModel dm2 = dm1.setStackedModel(dataModel2); StackedDataModel dm3 = dm2.setStackedModel(dataModel3); StackedDataModel dm4 = dm3.setStackedModel(dataModel4); /* * Creating mappers */ String labels[] = { "Z", "A", "X" }; LabelAxisMapper xMapper = new LabelAxisMapper(labels); MathAxisMapper yMapper = new MathAxisMapper(0, 1); DecimalFormat df = new DecimalFormat("##0.## %"); yMapper.setNumberFormat(df); /* * Creating and setting series */ BarSeries bar1 = new BarSeries(dm1, xMapper, yMapper); bar1.setName("Within tolerance"); bar1.getPaintStyle().setBackground(new Color(51, 102, 0)); bar1.getPaintStyle().setForeground(null); bar1.setStrategy(BarStrategies.PERCENTAGE_AREA_BAR_STRATEGY); bar1.addMarker(m1, Alignment.CENTER); bar1.getPaintStyle().setTransparencyValue(200); BarSeries bar2 = new BarSeries(dm2, xMapper, yMapper); bar2.setName("Close to critical"); bar2.getPaintStyle().setBackground(new Color(251, 178, 47)); bar2.getPaintStyle().setForeground(null); bar2.getPaintStyle().setTransparencyValue(200); bar2.setStrategy(BarStrategies.PERCENTAGE_AREA_BAR_STRATEGY); bar2.addMarker(m2, Alignment.CENTER); BarSeries bar3 = new BarSeries(dm3, xMapper, yMapper); bar3.setName("Out of tolerance"); bar3.style.setBackground(new Color(219, 67, 47)); bar3.style.setForeground(null); bar3.getPaintStyle().setTransparencyValue(200); bar3.setStrategy(BarStrategies.PERCENTAGE_AREA_BAR_STRATEGY); bar3.addMarker(m3, Alignment.CENTER); BarSeries bar4 = new BarSeries(dm4, xMapper, yMapper); bar4.setName("Invalid values"); bar4.getPaintStyle().setBackground(new Color(75, 146, 188)); bar4.getPaintStyle().setForeground(null); bar4.getPaintStyle().setTransparencyValue(230); bar4.setStrategy(BarStrategies.PERCENTAGE_AREA_BAR_STRATEGY); bar4.addMarker(m4, Alignment.CENTER); /* * Creating grid */ Grid grid = new Grid(new PlaneMapper2D(), null, yMapper); /* * Creating Axes */ Axis2DX axisX = new Axis2DX(xMapper); axisX.getTitleSettings().setHorizontalAlignment(Alignment.RIGHT); axisX.getTitleSettings().setPosition(TitlePosition.INLINE); axisX.setTitle("Axis"); Axis2DY axisY = new Axis2DY(yMapper); axisY.setTitle("Percentage"); axisY.getLabelSettings().setLabelLayouter(new SimpleLinearLabelLayouter()); Axis2DY axisY2 = new Axis2DY(new MathAxisMapper(0, 17)); axisY2.setTitle("Number of Values"); /* * Creating chart */ Chart2D chart = new Chart2D(); chart.setObjects(new ChartObject[] { grid, bar1, bar2, bar3, bar4 }); chart.setXAxis(axisX); chart.setYAxis(axisY); chart.addRightYAxis(axisY2); /* * Creating labeled chart and setting title */ LabeledChart m_chart = new LabeledChart(chart); m_chart.setTitle("Measurement Statistics"); /* * Creating legend */ Legend legend = new Legend(chart); legend.setMaxColumns(4); m_chart.setBottomView(legend); m_chartPanel = new JChartPanel(m_chart); m_chartPanel.setHotSpotMap(new SimpleHotSpotMap()); } public static void main(String[] args) { StackedAxisDemo frame = new StackedAxisDemo(); frame.setSize(new Dimension(600, 400)); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setTitle("Measurement Statistics"); frame.setVisible(true); } /* * Counts how many values are in interval [min;max] */ private int getInt(ChartDataModel model, double min, double max) { int sk = 0; for (int i = 0; i < model.getPointCount(); i++) { Object x = model.getValueAt(DataColumnType.VALUE, i); if (x != null) { Double tmp = (Double)x; if (tmp >= min && tmp <= max) { sk++; } } } return sk; } /* * Counts how many values are in interval [min-delta;min] */ private int getLess(ChartDataModel model, double min, double delta) { int sk = 0; for (int i = 0; i < model.getPointCount(); i++) { Object x = model.getValueAt(DataColumnType.VALUE, i); if (x != null) { Double tmp = (Double)x; if ((tmp < min) && (Math.abs(min - tmp) <= delta)) { sk++; } } } return sk; } /* * Counts how many values are in interval [max;max+delta] */ private int getMore(ChartDataModel model, double max, double delta) { int sk = 0; for (int i = 0; i < model.getPointCount(); i++) { Object x = model.getValueAt(DataColumnType.VALUE, i); if (x != null) { Double tmp = (Double)x; if ((tmp > max) && (Math.abs(tmp - max) <= delta)) { sk++; } } } return sk; } /* * Counts how many values are null */ private int getNull(ChartDataModel model) { int sk = 0; for (int i = 0; i < model.getPointCount(); i++) { Object x = model.getValueAt(DataColumnType.VALUE, i); if (x == null) { sk++; } } return sk; } private ChartDataModel generateXModel() { ChartDataModel modelX = new ChartDataModel(); modelX.add(new Object[] { "6881", -0.15d }); modelX.add(new Object[] { "6882", -0.23d }); modelX.add(new Object[] { "6883", -0.18d }); modelX.add(new Object[] { "6884", 0.27d }); modelX.add(new Object[] { "6885", -1.02d }); modelX.add(new Object[] { "6886", -1.41d }); modelX.add(new Object[] { "6887", 0.33d }); modelX.add(new Object[] { "6888", 0.04d }); modelX.add(new Object[] { "6889", 0.26d }); modelX.add(new Object[] { "6890", -0.22d }); modelX.add(new Object[] { "6891", -0.61d }); modelX.add(new Object[] { "6892", -0.53d }); modelX.add(new Object[] { "6893", -0.55d }); modelX.add(new Object[] { "6894", -0.26d }); modelX.add(new Object[] { "6895", 0d }); modelX.add(new Object[] { "6896", -0.12d }); modelX.add(new Object[] { "6897", 0.04d }); modelX.add(new Object[] { "6898", null }); modelX.add(new Object[] { "6899", 0.06d }); modelX.add(new Object[] { "6900", null }); modelX.add(new Object[] { "6901", -0.26d }); modelX.add(new Object[] { "6902", null }); modelX.add(new Object[] { "6903", -0.57d }); modelX.add(new Object[] { "6904", -0.48d }); modelX.add(new Object[] { "6905", -0.57d }); modelX.add(new Object[] { "6906", -1.63d }); modelX.add(new Object[] { "6907", -0.62d }); return modelX; } private ChartDataModel generateZModel() { ChartDataModel modelZ = new ChartDataModel(); modelZ.add(new Object[] { "6881", -4.37 }); modelZ.add(new Object[] { "6882", -5.06 }); modelZ.add(new Object[] { "6883", -5.67 }); modelZ.add(new Object[] { "6884", -5.37 }); modelZ.add(new Object[] { "6885", -5.48 }); modelZ.add(new Object[] { "6886", -6.25 }); modelZ.add(new Object[] { "6887", -6.49 }); modelZ.add(new Object[] { "6888", -6.15 }); modelZ.add(new Object[] { "6889", -6.24 }); modelZ.add(new Object[] { "6890", -4.89 }); modelZ.add(new Object[] { "6891", -7.31 }); modelZ.add(new Object[] { "6892", -4.73 }); modelZ.add(new Object[] { "6893", -4.77 }); modelZ.add(new Object[] { "6894", -4.55 }); modelZ.add(new Object[] { "6895", -4.45 }); modelZ.add(new Object[] { "6896", -5.14 }); modelZ.add(new Object[] { "6897", -5.51 }); modelZ.add(new Object[] { "6898", -6.2 }); modelZ.add(new Object[] { "6899", -5.24 }); modelZ.add(new Object[] { "6900", -5.26 }); modelZ.add(new Object[] { "6901", -5.12 }); modelZ.add(new Object[] { "6902", -5.23 }); modelZ.add(new Object[] { "6903", -3.65 }); modelZ.add(new Object[] { "6904", -5.07 }); modelZ.add(new Object[] { "6905", -5.42 }); modelZ.add(new Object[] { "6906", -5.58 }); modelZ.add(new Object[] { "6907", -5.48 }); return modelZ; } private ChartDataModel generateAModel() { ChartDataModel modelA = new ChartDataModel(); modelA.add(new Object[] { "6881", 0.75 }); modelA.add(new Object[] { "6882", -0.1 }); modelA.add(new Object[] { "6883", 0.25 }); modelA.add(new Object[] { "6884", 1.43 }); modelA.add(new Object[] { "6885", 0.57 }); modelA.add(new Object[] { "6886", null }); modelA.add(new Object[] { "6887", -0.62 }); modelA.add(new Object[] { "6888", -0.31 }); modelA.add(new Object[] { "6889", null }); modelA.add(new Object[] { "6890", 2.96 }); modelA.add(new Object[] { "6891", -3.53 }); modelA.add(new Object[] { "6892", null }); modelA.add(new Object[] { "6893", -0.79 }); modelA.add(new Object[] { "6894", -1.11 }); modelA.add(new Object[] { "6895", null }); modelA.add(new Object[] { "6896", -0.17 }); modelA.add(new Object[] { "6897", -2.4 }); modelA.add(new Object[] { "6898", null }); modelA.add(new Object[] { "6899", 0.28 }); modelA.add(new Object[] { "6900", -0.06 }); modelA.add(new Object[] { "6901", null }); modelA.add(new Object[] { "6902", 0.06 }); modelA.add(new Object[] { "6903", -0.33 }); modelA.add(new Object[] { "6904", null }); modelA.add(new Object[] { "6905", -0.95 }); modelA.add(new Object[] { "6906", null }); modelA.add(new Object[] { "6907", 0.33 }); return modelA; } } |
There is a possibility to stack axis one on each other.
1 | //........... // adding axes to chart chart.setXAxis(axisX); chart.setLeftYAxis(axisYS); chart.setLeftYAxis(axisYR); chart.setLeftYAxis(axisYQ); // stacking axes axisYQ.setStackAxis2DY(axisYS); axisYS.setStackAxis2DY(axisYR); // setting space among axes Axis2DY.setStackedYAxisMargin(chart, 0.01f); // setting how much space axes should take chart.setStackedLeftYAxisProportion(new double[] { 0.4, 0.3, 0.3 }); //........... |
Figure 5.2.2.3 Stacked Axes on Each Other Demonstration
1 | import java.awt.*; import java.text.DecimalFormat; import java.util.*; import javax.swing.JFrame; import lt.monarch.chart.chart2D.*; import lt.monarch.chart.chart2D.axis.*; import lt.monarch.chart.chart2D.engine.PlaneMapper2D; import lt.monarch.chart.chart2D.series.*; import lt.monarch.chart.engine.ChartObject; import lt.monarch.chart.mapper.*; import lt.monarch.chart.models.ChartDataModel; import lt.monarch.chart.swing.JChartPanel; import lt.monarch.chart.view.LabeledChart; public class SRFlipFlopDemo extends JFrame { private transient JChartPanel m_chartPanel; SRFlipFlopDemo () { initChart(); add(m_chartPanel); } protected void initChart() { /* * Creating mappers */ DateAxisMapper xMapper = new DateAxisMapper(getTime(0), getTime(100)); MathAxisMapper qMapper = new MathAxisMapper(0.0, 8.0); qMapper.setNumberFormat(new DecimalFormat("0.0## V")); MathAxisMapper sMapper = new MathAxisMapper(0, 8.0); sMapper.setNumberFormat(new DecimalFormat("0.0## V")); MathAxisMapper rMapper = new MathAxisMapper(0, 8.0); rMapper.setNumberFormat(new DecimalFormat("0.0## V")); /* * Setting axes */ Axis2DX axisX = new Axis2DX(xMapper); axisX.setZoomingEnabled(true); axisX.setScrollable(true); Axis2DY axisYS = new Axis2DY(sMapper); axisYS.setTitle("S"); axisYS.getTitleSettings().setRotationAngle(Math.toRadians(0)); Axis2DY axisYR = new Axis2DY(rMapper); axisYR.setTitle("R"); axisYR.getTitleSettings().setRotationAngle(Math.toRadians(0)); Axis2DY axisYQ = new Axis2DY(qMapper); axisYQ.setTitle("Q"); axisYQ.getTitleSettings().setRotationAngle(Math.toRadians(0)); /* * Setting series */ LineSeries lineS = new LineSeries(generateSModel(), xMapper, sMapper); lineS.getPaintStyle().setBackground(new Color(51, 102, 0)); lineS.getPaintStyle().setForeground(new Color(51, 102, 0).darker()); lineS.setStrategy(LineStrategies.STEPPED_LINE_STRATEGY); LineSeries lineQ = new LineSeries(generateQModel(), xMapper, qMapper); lineQ.setStrategy(LineStrategies.STEPPED_LINE_STRATEGY); lineQ.getPaintStyle().setBackground(new Color(251, 178, 47)); lineQ.getPaintStyle().setForeground(new Color(251, 178, 47).darker()); LineSeries lineR = new LineSeries(generateRModel(), xMapper, rMapper); lineR.setStrategy(LineStrategies.STEPPED_LINE_STRATEGY); lineR.getPaintStyle().setBackground(new Color(219, 67, 47)); lineR.getPaintStyle().setForeground(new Color(219, 67, 47).darker()); /* * Setting grids */ Grid gridQ = new Grid(new PlaneMapper2D(), xMapper, qMapper); Grid gridR = new Grid(new PlaneMapper2D(), xMapper, rMapper); Grid gridS = new Grid(new PlaneMapper2D(), xMapper, sMapper); /* * Setting chart */ Chart2D chart = new Chart2D(); chart.setObjects(new ChartObject[] { gridR, gridS, gridQ, lineS, lineR, lineQ }); // Adding axes chart.setXAxis(axisX); chart.setLeftYAxis(axisYS); chart.setLeftYAxis(axisYR); chart.setLeftYAxis(axisYQ); // Stacking axes axisYQ.setStackAxis2DY(axisYS); axisYS.setStackAxis2DY(axisYR); // Setting space among axes Axis2DY.setStackedYAxisMargin(chart, 0.2f); // Setting how much space axes should take chart.setStackedLeftYAxisProportion(new double[] { 0.4, 0.3, 0.3 }); LabeledChart topChart = new LabeledChart(chart); topChart.setTitle("Static SR Flip-Flop Operation"); m_chartPanel = new JChartPanel(topChart); } private ChartDataModel generateQModel() { ChartDataModel modelZ = new ChartDataModel(); modelZ.add(new Object[] { getTime(0), 0.0 }); modelZ.add(new Object[] { getTime(5), 0.0 }); modelZ.add(new Object[] { getTime(10), 5.0 }); modelZ.add(new Object[] { getTime(15), 5.0 }); modelZ.add(new Object[] { getTime(20), 0.0 }); modelZ.add(new Object[] { getTime(25), 5.0 }); modelZ.add(new Object[] { getTime(30), 5.0 }); modelZ.add(new Object[] { getTime(35), 5.0 }); modelZ.add(new Object[] { getTime(40), 5.0 }); modelZ.add(new Object[] { getTime(45), 5.0 }); modelZ.add(new Object[] { getTime(50), 0.0 }); modelZ.add(new Object[] { getTime(55), 0.0 }); modelZ.add(new Object[] { getTime(60), 0.0 }); modelZ.add(new Object[] { getTime(65), 0.0 }); modelZ.add(new Object[] { getTime(70), 0.0 }); modelZ.add(new Object[] { getTime(75), 0.0 }); modelZ.add(new Object[] { getTime(80), 5.0 }); modelZ.add(new Object[] { getTime(85), 5.0 }); modelZ.add(new Object[] { getTime(90), 0.0 }); modelZ.add(new Object[] { getTime(95), 0.0 }); modelZ.add(new Object[] { getTime(100), 0.0 }); return modelZ; } private ChartDataModel generateSModel() { ChartDataModel modelZ = new ChartDataModel(); modelZ.add(new Object[] { getTime(0), 0.0 }); modelZ.add(new Object[] { getTime(5), 0.0 }); modelZ.add(new Object[] { getTime(10), 5.0 }); modelZ.add(new Object[] { getTime(15), 5.0 }); modelZ.add(new Object[] { getTime(20), 0.0 }); modelZ.add(new Object[] { getTime(25), 5.0 }); modelZ.add(new Object[] { getTime(30), 5.0 }); modelZ.add(new Object[] { getTime(35), 5.0 }); modelZ.add(new Object[] { getTime(40), 5.0 }); modelZ.add(new Object[] { getTime(45), 5.0 }); modelZ.add(new Object[] { getTime(50), 0.0 }); modelZ.add(new Object[] { getTime(55), 0.0 }); modelZ.add(new Object[] { getTime(60), 0.0 }); modelZ.add(new Object[] { getTime(65), 0.0 }); modelZ.add(new Object[] { getTime(70), 0.0 }); modelZ.add(new Object[] { getTime(75), 0.0 }); modelZ.add(new Object[] { getTime(80), 5.0 }); modelZ.add(new Object[] { getTime(85), 5.0 }); modelZ.add(new Object[] { getTime(90), 0.0 }); modelZ.add(new Object[] { getTime(95), 0.0 }); modelZ.add(new Object[] { getTime(100), 0.0 }); return modelZ; } private ChartDataModel generateRModel() { ChartDataModel modelZ = new ChartDataModel(); modelZ.add(new Object[] { getTime(0), 5.0 }); modelZ.add(new Object[] { getTime(5), 5.0 }); modelZ.add(new Object[] { getTime(10), 0.0 }); modelZ.add(new Object[] { getTime(15), 0.0 }); modelZ.add(new Object[] { getTime(20), 5.0 }); modelZ.add(new Object[] { getTime(25), 0.0 }); modelZ.add(new Object[] { getTime(30), 0.0 }); modelZ.add(new Object[] { getTime(35), 0.0 }); modelZ.add(new Object[] { getTime(40), 0.0 }); modelZ.add(new Object[] { getTime(45), 0.0 }); modelZ.add(new Object[] { getTime(50), 5.0 }); modelZ.add(new Object[] { getTime(55), 5.0 }); modelZ.add(new Object[] { getTime(60), 5.0 }); modelZ.add(new Object[] { getTime(65), 5.0 }); modelZ.add(new Object[] { getTime(70), 5.0 }); modelZ.add(new Object[] { getTime(75), 5.0 }); modelZ.add(new Object[] { getTime(80), 0.0 }); modelZ.add(new Object[] { getTime(85), 0.0 }); modelZ.add(new Object[] { getTime(90), 5.0 }); modelZ.add(new Object[] { getTime(95), 5.0 }); modelZ.add(new Object[] { getTime(100), 5.0 }); return modelZ; } public Date getTime(int t) { GregorianCalendar c = new GregorianCalendar(2009, 6, 25, 12, t); return c.getTime(); } public static void main(String[] args) { SRFlipFlopDemo frame = new SRFlipFlopDemo(); frame.setSize(new Dimension(600, 400)); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setTitle("SR Flip Flop"); frame.setVisible(true); } } |
There is a possibility to format titles of axes which consists of formulas using Latex document mark-up language. In order, for this feature to work, Image paint mode for title should be set.
For instance, there is formula (cos(x))^2, this could be formatted using Latex in this way:
1 | //setting axis Axis2DY yAxis = new Axis2DY(yMapper); //setting title yAxis.setTitle("{cos^2{x}}"); //setting title's paint mode yAxis.getPaintStyle().setPaintMode(AxisPaintTags.TITLE, PaintMode.IMAGE_PAINT); |
There is a possibility to highlight the middle subtick on math axis.
// setting Highlight for Middle Subtick axisX.getTickSettings().setHighlightMiddleSubtick(true); |
There are 2 paint modes available for axis text styling:
This paint mode displays text rotation by angle which is set by setRotationAngle and text is rotation in accordance to that angle.
1 | // setting paint mode for y axis title axisY.getTitleSettings().setTextPaintMode(TextPaintMode.LADDER_PAINT); // setting angle by which axis title should be rotated axisY.getTitleSettings().setRotationAngle(Math.PI/2); |
Figure 5.2.2.4 Ladder Text Paint Mode for Y-axis title Demonstration
1 | import java.awt.*; import java.text.SimpleDateFormat; import java.util.*; import javax.swing.JFrame; import lt.monarch.chart.chart2D.*; import lt.monarch.chart.chart2D.axis.*; import lt.monarch.chart.chart2D.axis.layouters.*; import lt.monarch.chart.chart2D.engine.PlaneMapper2D; import lt.monarch.chart.chart2D.series.*; import lt.monarch.chart.engine.*; import lt.monarch.chart.mapper.*; import lt.monarch.chart.models.*; import lt.monarch.chart.style.enums.*; import lt.monarch.chart.style.tags.*; import lt.monarch.chart.swing.JChartPanel; import lt.monarch.chart.view.LabeledChart; public class LadderTextPaint extends JFrame { public LadderTextPaint () { /* * Setting data model */ ChartDataModel model = new ChartDataModel(); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 0).getTime(), 18 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 6).getTime(), 19 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 12).getTime(), 15 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 18).getTime(), 19 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 24).getTime(), 17 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 30).getTime(), 18 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 36).getTime(), 14 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 42).getTime(), 12 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 48).getTime(), 17 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 54).getTime(), 12 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 60).getTime(), 14 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 66).getTime(), 19 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 72).getTime(), 18 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 78).getTime(), 18 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 84).getTime(), 16 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 90).getTime(), 15 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 96).getTime(), 18 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 102).getTime(), 12 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 108).getTime(), 19 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 114).getTime(), 19 }); model.add(new Object[] { new GregorianCalendar(2009, 0, 1, 0, 120).getTime(), 12 }); /* * Setting mappers */ MathAxisMapper yMapper = new MathAxisMapper(10, 25); DateAxisMapper xMapper = new DateAxisMapper((Date)model.getValueAt(DataColumnType.KEY, 0), (Date)model.getValueAt(DataColumnType.KEY, model.getPointCount() - 1)); xMapper.setFinestScaleUnits(Calendar.SECOND); xMapper.setStartingScaleUnits(Calendar.DAY_OF_MONTH); xMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm"), Calendar.MONTH); xMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm"), Calendar.DAY_OF_MONTH); xMapper.setDateFormat(new SimpleDateFormat("HH:mm"), Calendar.HOUR_OF_DAY); xMapper.setDateFormat(new SimpleDateFormat("mm"), Calendar.MINUTE); xMapper.setDateFormat(new SimpleDateFormat("ss"), Calendar.SECOND); xMapper.setDateFormat(new SimpleDateFormat("ms"), Calendar.MILLISECOND); /* * Setting axes */ Axis2DX axisX = new Axis2DX(xMapper); axisX.setZoomingEnabled(true); axisX.setScrollable(true); axisX.getTitleSettings().setPosition(TitlePosition.BELOW); Axis2DY axisY = new Axis2DY(yMapper); axisY.getTitleSettings().setPosition(TitlePosition.BELOW); axisY.setTitle("Number of processes"); /* * Setting layouter */ MultiLevelLabelLayouter lay = new MultiLevelLabelLayouter(); lay.setDynamicLabels(false); lay.setLayoutConstraints(1, MultiLevelLabel.RAISE); lay.setLayoutConstraints(2, MultiLevelLabel.RAISE); lay.setLayoutConstraints(3, MultiLevelLabel.RAISE); lay.setLayoutConstraints(4, MultiLevelLabel.RAISE); lay.setLayoutConstraints(5, MultiLevelLabel.RAISE); lay.setLayoutConstraints(6, MultiLevelLabel.RAISE); axisX.getLabelSettings().setLabelLayouter(lay); axisY.getTitleSettings().setTextPaintMode(TextPaintMode.LADDER_PAINT); axisY.getTitleSettings().setRotationAngle(Math.PI / 2); /* * Setting series */ LineSeries line = new LineSeries(model, xMapper, yMapper); line.setStrategy(LineStrategies.DIRECT_LINE_STRATEGY); line.getPaintStyle().setForeground(new Color(51, 102, 0)); line.getPaintStyle().setStroke(new BasicStroke(4f)); line.getPaintStyle().setForeground(SeriesPaintTags.SHADOW, Color.gray); /* * Setting grid */ Grid grid = new Grid(new PlaneMapper2D(), null, null); grid.getPaintStyle().setBackground(null); grid.getPaintStyle().setForeground(GridPaintTags.OUTLINE, null); /* * Setting chart */ Chart2D chart = new Chart2D(); chart.setObjects(new ChartObject[] { grid, line }); chart.setYAxis(axisY); chart.setXAxis(axisX); /* * Setting LabeledChart */ LabeledChart m_chart = new LabeledChart(chart); m_chart.setTitle("Server Load by hours"); /* * Adding m_chart to panel */ JChartPanel m_chartPanel = new JChartPanel(m_chart); m_chartPanel.setHotSpotMap(new SimpleHotSpotMap()); getContentPane().add(BorderLayout.CENTER, m_chartPanel); } public static void main(String[] args) { LadderTextPaint frame = new LadderTextPaint(); frame.setSize(new Dimension(600, 400)); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setTitle("Server Load by hours"); frame.setVisible(true); } } |