Surface3D Series renders a three dimensional surface that connects a set of data points. This Series uses ChartDataModel. There are 3 strategies available in MCharts for Surface3D Series:
This Series renders data model in accordance to height value and which contains no null points.
Figure 4.2.5.1.1 Surface3D Series Demonstration
1 | import java.awt.Color; import java.awt.Dimension; import javax.swing.JFrame; import lt.monarch.chart.chart3D.Chart3D; import lt.monarch.chart.chart3D.engine.SimpleProjector3D; import lt.monarch.chart.chart3D.series.Surface3DSeries; import lt.monarch.chart.chart3D.series.Surface3DStrategies; import lt.monarch.chart.engine.ChartObject; import lt.monarch.chart.legend.ColorScaleLegend; import lt.monarch.chart.legend.LegendLayout; import lt.monarch.chart.mapper.MathAxisMapper; import lt.monarch.chart.models.ChartDataModel; import lt.monarch.chart.plugins.ChartRotator; import lt.monarch.chart.plugins.ChartZoomer; import lt.monarch.chart.style.enums.Alignment; import lt.monarch.chart.style.enums.Orientation; import lt.monarch.chart.style.tags.SurfacePaintTags; import lt.monarch.chart.swing.JChartPanel; import lt.monarch.chart.view.LabeledChart; public class Surface3DDemo extends JFrame { public Surface3DDemo () { /* * Creating and setting the mapper */ MathAxisMapper yMapper = new MathAxisMapper(0, 500); MathAxisMapper xMapper = new MathAxisMapper(0, 9000); MathAxisMapper zMapper = new MathAxisMapper(0, 9000); /* * Creating and setting series */ Surface3DSeries series3D = new Surface3DSeries(generateDataModel(), xMapper, yMapper, zMapper); series3D.setColorPalette(new Color[] { new Color(75, 146, 188), new Color(49, 119, 31), new Color(251, 178, 47), new Color(223, 95, 32), new Color(219, 67, 47) }); series3D.setName("Heights"); series3D.setStrategy(Surface3DStrategies.DEFAULT_SURFACE); series3D.getPaintStyle().setForeground(null); series3D.setSolid(true); series3D.getPaintStyle().setBackground(SurfacePaintTags.SOLID, Color.LIGHT_GRAY); /* * Creating chart */ Chart3D chart = new Chart3D(); chart.addPlugin(new ChartRotator()); chart.addPlugin(new ChartZoomer()); chart.setObjects(new ChartObject[] { series3D }); ((SimpleProjector3D)chart.projector()).setElevationAngle(Math.toRadians(20)); ((SimpleProjector3D)chart.projector()).setRotationAngle(Math.toRadians(-50)); ((SimpleProjector3D)chart.projector()).setViewScaling(0.75, 0.75, 0.75); /* * Creating title */ LabeledChart m_chart = new LabeledChart(chart); /* * Legend */ ColorScaleLegend legend = new ColorScaleLegend(chart); legend.setLayout(LegendLayout.EXPANDED_LAYOUT); legend.setOrientation(Orientation.HORIZONTAL); legend.setWordWrappingEnabled(true); m_chart.setBottomView(legend); m_chart.setTitle("Madagascar surface"); m_chart.getTitleView().getTextStyle().setColor(new Color(60, 120, 181, 255)); m_chart.getTitleView().setHorizontalAlignment(Alignment.RIGHT); JChartPanel m_chartPanel = new JChartPanel(m_chart); add(m_chartPanel); } private ChartDataModel generateDataModel() { ChartDataModel cdata = new ChartDataModel(); cdata.add(new Object[] { new Object[] { 27, 26, 26, 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 25, 23, 24, 24, 25, 25, 25, 29, 25, 25, 26, 27, 26, 24, 25, 42, 49, 48, 45, 47, 65, 68, 30, 38, 50, 87, 70, 69, 56, 72, 60, 58, 73, 69, 68, 62, 42, 90, 54, 88, 90, 90, 83, 84, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 24, 25, 24, 24, 23, 23, 23, 23, 23, 23, 22, 23, 22, 22, 22, 22, 21, 23, 24, 23, 23, 23, 23, 23, 33, 31, 60, 57, 60, 51, 28, 27, 38, 43, 48, 55, 67, 87, 70, 28, 49, 58, 58, 70, 81, 79, 72, 66, 63, 75, 74, 57, 91, 73, 88, 85, 86, 83, 82, 76, 87, } }); cdata.add(new Object[] { new Object[] { 26, 25, 24, 24, 25, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, 21, 22, 23, 23, 23, 23, 24, 26, 25, 37, 52, 53, 53, 55, 45, 32, 41, 39, 43, 44, 52, 58, 47, 48, 58, 96, 74, 82, 89, 90, 67, 73, 82, 83, 79, 83, 68, 77, 85, 75, 64, 69, 75, 56, 63, } }); cdata.add(new Object[] { new Object[] { 25, 25, 24, 24, 25, 25, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 21, 21, 22, 23, 23, 23, 23, 22, 28, 26, 24, 25, 38, 52, 51, 47, 42, 43, 40, 45, 40, 44, 62, 58, 85, 87, 74, 83, 81, 89, 92, 84, 92, 93, 90, 91, 86, 77, 73, 57, 71, 59, 56, 58, 72, 59, } }); cdata.add(new Object[] { new Object[] { 26, 25, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 23, 22, 23, 22, 22, 21, 22, 22, 22, 22, 22, 23, 22, 23, 23, 23, 23, 23, 26, 43, 43, 41, 37, 42, 45, 62, 71, 76, 72, 57, 87, 83, 85, 86, 91, 89, 91, 93, 93, 90, 93, 72, 79, 65, 76, 76, 52, 61, 59, 54, 52, } }); cdata.add(new Object[] { new Object[] { 25, 25, 24, 25, 24, 24, 23, 24, 23, 23, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 22, 22, 21, 21, 21, 22, 22, 22, 22, 22, 24, 24, 23, 30, 34, 51, 41, 40, 43, 56, 92, 63, 70, 39, 64, 86, 91, 87, 93, 90, 93, 93, 91, 92, 88, 86, 91, 91, 61, 85, 70, 74, 81, 59, 49, } }); cdata.add(new Object[] { new Object[] { 26, 25, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 20, 20, 21, 21, 21, 22, 24, 25, 24, 24, 28, 46, 40, 43, 46, 47, 52, 64, 83, 35, 52, 88, 85, 92, 92, 83, 94, 81, 86, 83, 76, 90, 69, 68, 90, 84, 87, 96, 51, 87, 68, } }); cdata.add(new Object[] { new Object[] { 25, 25, 25, 24, 24, 24, 24, 23, 23, 24, 23, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 20, 20, 20, 21, 24, 27, 27, 26, 26, 26, 27, 40, 42, 43, 51, 45, 51, 45, 48, 44, 50, 71, 81, 91, 83, 91, 76, 51, 89, 94, 70, 79, 66, 82, 87, 84, 89, 77, 57, 51, 57, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 24, 24, 24, 24, 24, 23, 23, 23, 23, 23, 22, 22, 22, 21, 21, 20, 21, 20, 20, 20, 20, 21, 23, 25, 25, 24, 23, 24, 28, 28, 28, 42, 56, 55, 47, 48, 42, 52, 50, 74, 77, 70, 75, 68, 85, 93, 67, 59, 60, 55, 52, 80, 86, 83, 87, 81, 87, 77, 60, 69, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 23, 23, 23, 22, 22, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 22, 23, 22, 23, 23, 24, 30, 38, 41, 40, 55, 53, 50, 45, 38, 44, 49, 54, 57, 83, 59, 52, 69, 68, 75, 65, 56, 89, 75, 85, 74, 72, 71, 67, 83, 68, 75, 86, } }); cdata.add(new Object[] { new Object[] { 26, 26, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 21, 22, 25, 23, 24, 29, 34, 36, 41, 46, 49, 48, 48, 44, 45, 44, 42, 42, 56, 52, 73, 75, 51, 84, 48, 100, 73, 56, 51, 76, 67, 61, 68, 62, 67, 86, 77, } }); cdata.add(new Object[] { new Object[] { 27, 26, 26, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 23, 23, 22, 22, 22, 21, 21, 20, 20, 20, 20, 20, 20, 20, 21, 21, 22, 27, 26, 27, 30, 37, 37, 40, 45, 46, 58, 55, 48, 47, 51, 42, 37, 38, 44, 49, 56, 40, 39, 44, 69, 63, 66, 78, 79, 73, 71, 72, 79, 81, 74, 70, } }); cdata.add(new Object[] { new Object[] { 27, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 23, 24, 23, 23, 23, 22, 22, 22, 21, 21, 20, 20, 20, 20, 20, 20, 21, 22, 23, 25, 29, 31, 29, 32, 38, 39, 43, 49, 60, 51, 49, 54, 50, 37, 38, 40, 49, 50, 50, 47, 53, 60, 59, 62, 69, 65, 55, 80, 54, 62, 70, 74, 83, 75, } }); cdata.add(new Object[] { new Object[] { 27, 26, 26, 25, 25, 25, 25, 25, 24, 24, 24, 23, 24, 23, 23, 23, 23, 22, 22, 21, 21, 20, 20, 20, 20, 20, 20, 21, 25, 31, 26, 29, 30, 32, 31, 35, 39, 42, 49, 48, 39, 50, 47, 40, 38, 38, 47, 57, 43, 49, 45, 63, 63, 62, 53, 63, 56, 55, 64, 80, 57, 83, 75, 77, 68, } }); cdata.add(new Object[] { new Object[] { 29, 26, 26, 26, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 22, 21, 20, 20, 20, 19, 20, 21, 22, 26, 43, 27, 29, 28, 28, 31, 33, 38, 42, 53, 50, 65, 59, 46, 38, 38, 39, 50, 44, 41, 38, 54, 60, 55, 49, 44, 63, 52, 61, 63, 51, 48, 61, 77, 69, 68, } }); cdata.add(new Object[] { new Object[] { 28, 27, 26, 26, 26, 26, 25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 23, 22, 22, 21, 21, 20, 21, 20, 21, 21, 28, 33, 39, 27, 27, 26, 26, 30, 33, 36, 41, 51, 40, 43, 58, 45, 45, 41, 50, 51, 46, 39, 49, 50, 47, 41, 45, 54, 51, 62, 77, 56, 51, 45, 53, 48, 58, 54, } }); cdata.add(new Object[] { new Object[] { 32, 27, 26, 26, 26, 26, 25, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 21, 20, 20, 21, 21, 23, 29, 44, 34, 25, 25, 25, 26, 34, 33, 33, 39, 48, 39, 57, 56, 49, 56, 63, 64, 54, 37, 44, 45, 49, 40, 52, 50, 53, 52, 39, 74, 48, 55, 52, 51, 42, 50, 52, } }); cdata.add(new Object[] { new Object[] { 33, 27, 26, 26, 26, 26, 25, 25, 25, 25, 25, 24, 24, 24, 23, 23, 23, 23, 22, 22, 22, 21, 20, 20, 21, 20, 23, 24, 25, 28, 24, 25, 25, 25, 27, 34, 35, 41, 48, 66, 60, 58, 52, 58, 64, 60, 56, 53, 47, 40, 32, 42, 51, 56, 58, 55, 39, 36, 45, 44, 50, 49, 52, 53, 53, } }); cdata.add(new Object[] { new Object[] { 37, 27, 26, 26, 26, 26, 25, 25, 25, 25, 25, 25, 24, 23, 23, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 21, 22, 24, 26, 24, 23, 24, 25, 25, 28, 34, 36, 44, 57, 60, 56, 57, 59, 62, 57, 58, 55, 50, 39, 43, 53, 51, 52, 53, 56, 54, 54, 50, 49, 29, 26, 37, 31, 45, 50, } }); cdata.add(new Object[] { new Object[] { 37, 30, 27, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 24, 24, 23, 23, 22, 23, 22, 22, 21, 21, 21, 21, 21, 22, 22, 26, 22, 23, 24, 24, 25, 30, 29, 33, 47, 57, 53, 54, 55, 56, 55, 57, 57, 56, 50, 53, 52, 49, 48, 49, 49, 55, 56, 55, 56, 56, 47, 40, 34, 29, 46, 47, } }); cdata.add(new Object[] { new Object[] { 31, 28, 27, 26, 26, 26, 25, 25, 25, 25, 25, 25, 25, 24, 23, 23, 23, 23, 23, 24, 22, 22, 21, 21, 22, 22, 23, 22, 22, 23, 23, 23, 24, 27, 30, 27, 35, 48, 57, 56, 53, 52, 56, 61, 64, 65, 45, 52, 57, 46, 46, 50, 44, 48, 48, 51, 53, 53, 49, 51, 48, 41, 35, 47, 44, } }); cdata.add(new Object[] { new Object[] { 27, 26, 26, 26, 26, 26, 26, 25, 26, 25, 25, 25, 25, 24, 23, 23, 23, 22, 23, 22, 24, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 26, 30, 29, 36, 45, 59, 55, 52, 53, 55, 59, 66, 54, 51, 50, 47, 50, 49, 47, 44, 43, 45, 42, 49, 52, 49, 50, 49, 49, 50, 50, 48, } }); cdata.add(new Object[] { new Object[] { 28, 27, 26, 26, 26, 26, 26, 26, 26, 26, 25, 25, 25, 24, 24, 23, 23, 23, 23, 23, 23, 22, 22, 23, 23, 23, 23, 24, 23, 23, 23, 24, 24, 24, 25, 28, 31, 44, 47, 52, 53, 52, 62, 60, 51, 53, 51, 46, 51, 49, 47, 44, 45, 43, 44, 44, 45, 44, 31, 49, 46, 46, 48, 44, 44, } }); cdata.add(new Object[] { new Object[] { 28, 27, 27, 26, 27, 26, 27, 31, 38, 32, 25, 25, 25, 24, 23, 23, 23, 23, 23, 23, 23, 22, 22, 22, 23, 24, 23, 23, 22, 22, 22, 24, 22, 22, 23, 25, 26, 46, 35, 48, 51, 54, 58, 57, 46, 52, 42, 45, 47, 42, 42, 46, 43, 45, 48, 49, 48, 42, 43, 51, 50, 49, 47, 46, 44, } }); cdata.add(new Object[] { new Object[] { 45, 28, 27, 27, 27, 27, 58, 50, 34, 48, 27, 25, 25, 24, 24, 24, 23, 23, 22, 22, 23, 23, 24, 23, 22, 23, 23, 23, 23, 22, 21, 21, 21, 22, 22, 25, 27, 39, 37, 35, 43, 54, 53, 41, 46, 43, 42, 44, 45, 43, 37, 40, 37, 35, 40, 45, 44, 49, 50, 50, 49, 46, 38, 43, 45, } }); cdata.add(new Object[] { new Object[] { 35, 30, 28, 27, 27, 27, 35, 40, 29, 26, 26, 26, 26, 32, 29, 24, 23, 23, 23, 25, 26, 27, 27, 23, 22, 22, 23, 26, 27, 25, 24, 22, 22, 24, 25, 27, 29, 43, 40, 45, 47, 46, 40, 43, 36, 42, 48, 47, 43, 39, 41, 44, 44, 45, 43, 45, 44, 48, 50, 56, 51, 45, 34, 43, 47, } }); cdata.add(new Object[] { new Object[] { 28, 40, 34, 27, 27, 28, 27, 26, 25, 26, 26, 34, 39, 95, 27, 24, 23, 23, 24, 24, 34, 46, 41, 27, 24, 24, 30, 32, 29, 27, 29, 28, 29, 31, 31, 34, 34, 41, 40, 47, 50, 40, 36, 37, 37, 49, 54, 54, 49, 46, 40, 41, 46, 45, 42, 42, 46, 45, 46, 46, 45, 44, 44, 45, 43, } }); cdata.add(new Object[] { new Object[] { 29, 45, 33, 28, 42, 43, 43, 27, 26, 25, 25, 30, 28, 80, 45, 56, 24, 23, 25, 26, 29, 42, 42, 37, 30, 27, 32, 35, 41, 30, 31, 33, 34, 37, 38, 38, 43, 50, 45, 45, 46, 41, 41, 36, 40, 55, 52, 54, 49, 43, 46, 46, 42, 43, 40, 44, 37, 41, 43, 45, 45, 41, 27, 40, 43, } }); cdata.add(new Object[] { new Object[] { 28, 28, 29, 31, 45, 30, 33, 29, 26, 26, 25, 25, 29, 68, 39, 44, 26, 24, 34, 47, 44, 43, 39, 42, 33, 25, 26, 29, 49, 45, 35, 37, 35, 40, 41, 43, 52, 54, 40, 42, 41, 40, 38, 38, 46, 50, 54, 53, 47, 43, 43, 43, 43, 46, 46, 45, 32, 38, 46, 45, 46, 39, 29, 41, 42, } }); cdata.add(new Object[] { new Object[] { 29, 27, 28, 27, 29, 30, 27, 28, 26, 26, 26, 28, 25, 29, 29, 30, 24, 23, 41, 48, 42, 40, 37, 39, 37, 26, 26, 25, 36, 47, 39, 39, 41, 40, 44, 51, 51, 41, 44, 39, 37, 40, 35, 41, 36, 44, 54, 50, 47, 43, 43, 41, 45, 43, 47, 45, 42, 32, 41, 43, 42, 32, 23, 23, 25, } }); cdata.add(new Object[] { new Object[] { 29, 28, 28, 27, 27, 28, 27, 27, 26, 25, 25, 25, 25, 24, 25, 25, 23, 23, 25, 45, 49, 41, 38, 39, 41, 29, 25, 24, 27, 43, 48, 51, 50, 54, 50, 45, 40, 40, 38, 37, 38, 40, 36, 42, 41, 44, 51, 54, 53, 45, 43, 41, 42, 43, 41, 45, 42, 32, 26, 32, 25, 19, 21, 23, 37, } }); cdata.add(new Object[] { new Object[] { 30, 29, 28, 28, 27, 27, 30, 27, 26, 25, 26, 27, 24, 24, 24, 24, 23, 22, 23, 30, 50, 45, 48, 34, 32, 34, 25, 23, 26, 34, 40, 39, 41, 43, 50, 43, 41, 38, 40, 37, 39, 38, 40, 46, 49, 55, 50, 51, 51, 53, 47, 45, 43, 41, 24, 32, 26, 24, 24, 32, 27, 22, 38, 46, 45, } }); cdata.add(new Object[] { new Object[] { 30, 30, 31, 34, 47, 54, 30, 35, 26, 26, 28, 26, 25, 25, 25, 24, 23, 22, 22, 22, 23, 26, 26, 24, 29, 37, 28, 24, 25, 29, 36, 40, 40, 42, 48, 45, 39, 37, 34, 39, 44, 42, 42, 46, 50, 52, 52, 56, 58, 57, 51, 49, 45, 44, 34, 39, 35, 26, 51, 65, 62, 40, 32, 33, 26, } }); cdata.add(new Object[] { new Object[] { 31, 33, 83, 73, 54, 68, 61, 41, 26, 26, 32, 27, 25, 24, 24, 23, 23, 22, 22, 21, 22, 22, 22, 23, 24, 32, 27, 25, 29, 32, 36, 37, 42, 42, 40, 46, 37, 41, 36, 43, 38, 42, 41, 44, 46, 45, 47, 50, 54, 61, 52, 56, 51, 48, 49, 50, 80, 46, 61, 75, 79, 57, 37, 30, 19, } }); cdata.add(new Object[] { new Object[] { 36, 35, 79, 74, 92, 58, 58, 40, 26, 28, 65, 100, 35, 24, 24, 23, 23, 22, 22, 21, 22, 22, 23, 22, 23, 23, 30, 32, 40, 44, 47, 43, 38, 40, 37, 39, 36, 29, 36, 40, 43, 46, 41, 40, 39, 50, 32, 44, 49, 58, 66, 65, 57, 51, 53, 54, 72, 51, 69, 90, 56, 50, 38, 22, 19, } }); cdata.add(new Object[] { new Object[] { 88, 52, 72, 94, 56, 39, 75, 49, 26, 26, 31, 32, 25, 25, 26, 24, 24, 23, 22, 22, 22, 22, 22, 22, 22, 30, 41, 39, 53, 52, 51, 48, 37, 34, 38, 38, 41, 32, 37, 38, 36, 40, 35, 43, 38, 33, 22, 28, 46, 51, 55, 58, 63, 54, 52, 50, 53, 66, 54, 48, 63, 40, 36, 26, 22, } }); cdata.add(new Object[] { new Object[] { 84, 50, 92, 52, 57, 31, 44, 34, 30, 28, 27, 27, 54, 26, 41, 32, 41, 37, 23, 22, 21, 21, 21, 21, 23, 27, 43, 48, 46, 43, 47, 42, 41, 35, 34, 41, 32, 32, 33, 34, 34, 35, 39, 28, 32, 28, 24, 26, 32, 45, 49, 54, 53, 54, 52, 51, 48, 56, 63, 38, 43, 57, 35, 37, 64, } }); cdata.add(new Object[] { new Object[] { 38, 39, 35, 40, 35, 29, 27, 26, 26, 27, 28, 27, 38, 41, 52, 36, 40, 49, 40, 30, 24, 21, 21, 21, 22, 33, 44, 52, 50, 47, 46, 39, 35, 33, 33, 32, 32, 32, 32, 28, 31, 25, 28, 26, 21, 23, 23, 20, 28, 35, 44, 48, 49, 48, 50, 49, 48, 46, 38, 91, 74, 77, 52, 33, 41, } }); cdata.add(new Object[] { new Object[] { 28, 28, 27, 27, 27, 26, 26, 25, 25, 26, 28, 25, 29, 40, 59, 47, 45, 43, 44, 44, 34, 21, 21, 21, 21, 29, 36, 44, 54, 43, 45, 39, 32, 34, 36, 34, 31, 31, 33, 27, 26, 20, 21, 25, 21, 20, 19, 21, 25, 40, 48, 48, 35, 36, 48, 50, 51, 35, 42, 97, 96, 87, 66, 44, 56, } }); cdata.add(new Object[] { new Object[] { 28, 27, 27, 27, 27, 26, 26, 25, 25, 29, 40, 26, 63, 68, 47, 41, 39, 38, 40, 38, 38, 26, 20, 21, 20, 27, 44, 47, 39, 44, 38, 35, 37, 33, 31, 32, 33, 34, 32, 28, 28, 23, 20, 19, 20, 22, 19, 19, 23, 36, 43, 44, 30, 28, 41, 51, 50, 48, 67, 67, 93, 60, 68, 62, 54, } }); cdata.add(new Object[] { new Object[] { 27, 27, 26, 26, 26, 25, 25, 25, 24, 32, 45, 27, 39, 48, 42, 31, 34, 38, 38, 37, 37, 38, 25, 20, 21, 20, 37, 46, 44, 40, 36, 42, 35, 35, 34, 32, 34, 29, 35, 32, 28, 27, 28, 28, 21, 17, 18, 18, 26, 33, 42, 45, 34, 43, 91, 96, 93, 48, 79, 74, 64, 57, 77, 84, 75, } }); cdata.add(new Object[] { new Object[] { 27, 26, 26, 26, 25, 25, 25, 25, 25, 28, 25, 24, 36, 40, 42, 35, 36, 36, 37, 37, 37, 41, 33, 21, 22, 25, 38, 40, 38, 38, 38, 39, 39, 35, 32, 32, 28, 26, 27, 30, 24, 26, 24, 25, 25, 23, 20, 17, 19, 21, 37, 52, 56, 81, 66, 70, 57, 82, 90, 91, 89, 70, 96, 65, 72, } }); cdata.add(new Object[] { new Object[] { 26, 26, 26, 25, 25, 25, 25, 24, 27, 26, 24, 24, 31, 58, 41, 36, 37, 38, 38, 31, 32, 37, 38, 37, 33, 37, 42, 41, 37, 39, 40, 41, 45, 45, 41, 33, 28, 28, 25, 22, 23, 24, 27, 22, 21, 21, 19, 22, 20, 24, 40, 36, 68, 78, 72, 70, 88, 84, 90, 90, 88, 89, 76, 72, 64, } }); cdata.add(new Object[] { new Object[] { 26, 26, 25, 25, 25, 25, 24, 24, 27, 25, 23, 23, 27, 42, 38, 35, 33, 37, 38, 35, 36, 36, 37, 38, 39, 37, 37, 38, 38, 36, 37, 36, 41, 44, 40, 40, 30, 30, 32, 22, 21, 19, 23, 21, 20, 19, 19, 17, 28, 32, 25, 41, 84, 59, 69, 79, 89, 88, 89, 82, 54, 59, 86, 69, 45, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 25, 24, 24, 25, 28, 25, 24, 25, 27, 51, 44, 41, 38, 38, 38, 37, 39, 37, 36, 37, 38, 37, 35, 35, 35, 32, 28, 34, 37, 44, 45, 42, 42, 37, 32, 23, 22, 20, 18, 17, 18, 16, 16, 18, 27, 34, 20, 23, 57, 99, 75, 66, 89, 89, 88, 83, 62, 54, 77, 83, 59, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 25, 24, 24, 25, 26, 24, 23, 24, 23, 43, 48, 45, 43, 41, 38, 40, 39, 40, 39, 38, 37, 36, 32, 28, 24, 26, 23, 25, 29, 31, 38, 46, 45, 46, 42, 41, 36, 35, 26, 19, 18, 18, 20, 16, 18, 22, 19, 23, 32, 98, 100, 75, 87, 89, 79, 75, 79, 61, 73, 84, 51, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 24, 24, 28, 24, 26, 24, 24, 24, 28, 42, 41, 42, 43, 40, 42, 40, 40, 38, 38, 37, 34, 33, 30, 24, 21, 21, 25, 24, 23, 27, 41, 45, 45, 46, 43, 42, 45, 37, 28, 26, 34, 41, 37, 21, 17, 19, 27, 36, 64, 61, 86, 86, 86, 86, 85, 55, 67, 53, 61, 84, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 24, 23, 27, 25, 25, 24, 23, 23, 23, 38, 51, 48, 42, 42, 42, 36, 39, 39, 40, 36, 32, 33, 26, 25, 24, 21, 22, 22, 20, 23, 31, 36, 41, 42, 44, 43, 35, 29, 30, 44, 46, 39, 24, 23, 17, 18, 21, 32, 72, 53, 86, 83, 88, 90, 93, 91, 89, 82, 77, 78, } }); cdata.add(new Object[] { new Object[] { 25, 25, 24, 24, 24, 24, 23, 23, 26, 29, 25, 24, 24, 23, 24, 34, 39, 38, 39, 38, 38, 40, 42, 46, 39, 31, 36, 24, 22, 21, 18, 19, 20, 19, 18, 20, 32, 36, 38, 36, 36, 32, 27, 31, 44, 47, 45, 28, 18, 17, 18, 25, 55, 76, 59, 78, 81, 87, 87, 85, 89, 86, 73, 74, 69, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 24, 24, 23, 28, 25, 27, 41, 30, 30, 27, 32, 35, 38, 46, 47, 46, 47, 47, 46, 47, 36, 38, 31, 26, 28, 22, 20, 20, 20, 21, 20, 22, 36, 40, 35, 37, 33, 25, 23, 38, 49, 44, 22, 21, 29, 28, 37, 93, 54, 56, 59, 66, 85, 87, 85, 89, 78, 66, 78, 91, } }); cdata.add(new Object[] { new Object[] { 26, 25, 24, 24, 24, 24, 24, 23, 25, 27, 27, 29, 40, 33, 34, 42, 49, 52, 57, 48, 43, 49, 49, 50, 47, 39, 38, 34, 34, 29, 22, 25, 26, 21, 23, 28, 30, 34, 31, 29, 30, 29, 23, 21, 31, 34, 39, 45, 44, 49, 61, 45, 92, 53, 51, 62, 53, 76, 72, 74, 88, 84, 68, 69, 68, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 23, 24, 23, 23, 26, 28, 28, 42, 40, 33, 34, 36, 34, 42, 45, 47, 45, 48, 47, 44, 43, 39, 34, 30, 31, 29, 32, 27, 28, 34, 39, 39, 42, 36, 31, 28, 27, 23, 27, 27, 64, 74, 70, 64, 55, 96, 97, 82, 97, 95, 55, 53, 92, 90, 56, 60, 90, 87, 69, 52, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 24, 24, 23, 23, 27, 30, 27, 28, 33, 32, 28, 36, 37, 32, 31, 37, 49, 48, 47, 48, 43, 40, 36, 41, 37, 31, 29, 32, 37, 40, 41, 39, 37, 42, 37, 41, 34, 26, 23, 28, 64, 71, 65, 71, 73, 74, 76, 77, 79, 69, 73, 72, 64, 57, 68, 67, 70, 86, 86, 98, } }); cdata.add(new Object[] { new Object[] { 25, 25, 25, 24, 24, 23, 24, 23, 24, 23, 27, 27, 26, 29, 29, 27, 33, 56, 48, 49, 30, 48, 48, 43, 45, 44, 44, 40, 42, 39, 42, 37, 35, 38, 39, 35, 34, 37, 34, 30, 27, 29, 26, 47, 59, 70, 73, 77, 72, 63, 60, 64, 71, 71, 72, 78, 74, 78, 79, 78, 71, 78, 86, 78, 100, } }); cdata.add(new Object[] { new Object[] { 25, 25, 25, 25, 24, 24, 24, 24, 24, 23, 28, 37, 39, 31, 31, 27, 31, 28, 47, 47, 34, 45, 49, 44, 45, 44, 41, 36, 38, 38, 40, 39, 32, 37, 37, 38, 31, 21, 24, 29, 29, 65, 75, 66, 76, 78, 82, 79, 79, 77, 63, 100, 76, 77, 79, 56, 73, 75, 81, 81, 80, 89, 73, 70, 65, } }); cdata.add(new Object[] { new Object[] { 25, 25, 25, 25, 24, 24, 24, 24, 24, 24, 28, 25, 27, 30, 40, 25, 24, 26, 42, 50, 46, 45, 52, 46, 48, 43, 43, 41, 41, 40, 39, 37, 34, 31, 41, 39, 31, 27, 59, 91, 70, 84, 79, 72, 83, 87, 84, 83, 85, 77, 73, 64, 79, 91, 54, 70, 74, 78, 84, 85, 84, 87, 63, 76, 74, } }); cdata.add(new Object[] { new Object[] { 25, 25, 25, 24, 25, 24, 24, 25, 27, 30, 27, 26, 25, 24, 27, 23, 23, 28, 42, 49, 52, 48, 52, 54, 52, 54, 49, 39, 37, 39, 41, 36, 29, 32, 37, 35, 26, 31, 77, 71, 73, 74, 73, 77, 72, 77, 75, 79, 75, 76, 85, 89, 97, 77, 63, 86, 72, 51, 65, 79, 86, 84, 64, 75, 72, } }); cdata.add(new Object[] { new Object[] { 26, 24, 25, 25, 25, 25, 25, 24, 28, 31, 25, 25, 24, 30, 52, 44, 35, 52, 49, 46, 48, 43, 51, 51, 54, 50, 53, 43, 39, 39, 43, 39, 30, 32, 43, 32, 29, 32, 71, 57, 65, 66, 67, 66, 55, 76, 72, 78, 64, 60, 68, 84, 70, 81, 54, 53, 92, 75, 53, 71, 82, 89, 73, 67, 60, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 25, 25, 32, 27, 27, 26, 24, 24, 23, 37, 53, 55, 51, 49, 44, 46, 54, 53, 54, 52, 52, 51, 52, 45, 40, 37, 43, 41, 40, 41, 37, 40, 39, 37, 100, 78, 77, 79, 79, 79, 74, 72, 73, 72, 77, 78, 85, 67, 61, 65, 77, 63, 71, 78, 85, 88, 88, 90, 92, 89, 90, } }); cdata.add(new Object[] { new Object[] { 26, 26, 25, 25, 25, 25, 32, 31, 27, 26, 26, 27, 23, 35, 53, 52, 48, 50, 43, 46, 51, 53, 55, 53, 50, 51, 55, 44, 39, 38, 41, 41, 39, 36, 42, 44, 43, 39, 92, 71, 65, 73, 69, 69, 61, 63, 60, 76, 61, 62, 78, 83, 83, 84, 86, 84, 84, 90, 91, 87, 68, 70, 72, 81, 55, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 25, 28, 32, 27, 28, 26, 26, 24, 26, 55, 54, 54, 49, 54, 57, 48, 46, 49, 55, 56, 55, 55, 56, 48, 41, 39, 37, 38, 37, 38, 42, 40, 40, 37, 60, 58, 51, 65, 90, 56, 99, 95, 65, 57, 71, 76, 70, 86, 89, 92, 90, 88, 86, 88, 89, 72, 54, 62, 65, 80, 48, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 25, 25, 25, 29, 27, 27, 27, 40, 24, 33, 43, 41, 47, 45, 54, 57, 50, 52, 53, 58, 65, 58, 53, 54, 52, 42, 42, 41, 42, 37, 37, 42, 42, 45, 51, 48, 69, 75, 51, 92, 53, 90, 93, 52, 99, 60, 64, 88, 75, 85, 88, 89, 91, 90, 93, 88, 76, 74, 66, 67, 82, 46, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 26, 25, 24, 26, 29, 27, 27, 28, 24, 38, 47, 47, 47, 49, 57, 61, 55, 61, 62, 66, 66, 61, 53, 55, 58, 46, 50, 46, 41, 42, 41, 42, 43, 46, 46, 43, 64, 98, 59, 59, 79, 97, 61, 56, 69, 69, 67, 67, 84, 88, 90, 87, 91, 88, 92, 93, 89, 84, 82, 69, 54, 60, } }); cdata.add(new Object[] { new Object[] { 26, 25, 25, 24, 24, 26, 31, 27, 26, 26, 25, 23, 35, 49, 48, 48, 55, 55, 55, 56, 57, 54, 66, 62, 58, 59, 56, 58, 57, 49, 45, 41, 43, 45, 43, 44, 46, 42, 47, 54, 87, 72, 69, 87, 98, 68, 67, 77, 79, 85, 86, 88, 88, 83, 84, 88, 87, 90, 93, 93, 90, 85, 75, 61, 60, } }); cdata.add(new Object[] { new Object[] { 27, 26, 25, 25, 25, 26, 29, 26, 26, 26, 25, 24, 24, 43, 54, 50, 48, 48, 59, 62, 53, 49, 56, 58, 60, 61, 61, 61, 61, 55, 47, 42, 49, 51, 48, 50, 50, 48, 46, 52, 72, 78, 82, 51, 86, 63, 52, 81, 84, 83, 89, 88, 86, 86, 89, 86, 85, 87, 93, 92, 86, 73, 66, 52, 53, } }); return cdata; } public static void main(String[] args) { Surface3DDemo frame = new Surface3DDemo(); frame.setSize(new Dimension(600, 400)); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setTitle("Madagascar Surface"); frame.setVisible(true); } } |
This Series whit null values leaves empty holes in Surface3D charts.
Figure 4.2.5.2.1 Surface3D Series With the Holes Demonstration
1 | import java.awt.Color; import java.awt.Dimension; import javax.swing.JFrame; import lt.monarch.chart.chart3D.Chart3D; import lt.monarch.chart.chart3D.axis.Axis3D; import lt.monarch.chart.chart3D.axis.Axis3DX; import lt.monarch.chart.chart3D.axis.Axis3DY; import lt.monarch.chart.chart3D.axis.Axis3DZ; import lt.monarch.chart.chart3D.engine.Grid3D; import lt.monarch.chart.chart3D.engine.SimpleProjector3D; import lt.monarch.chart.chart3D.series.Surface3DSeries; import lt.monarch.chart.chart3D.series.Surface3DStrategies; import lt.monarch.chart.engine.ChartObject; import lt.monarch.chart.legend.Legend; import lt.monarch.chart.mapper.MathAxisMapper; import lt.monarch.chart.models.ChartDataModel; import lt.monarch.chart.plugins.ChartRotator; import lt.monarch.chart.plugins.ChartZoomer; import lt.monarch.chart.swing.JChartPanel; import lt.monarch.chart.view.LabeledChart; public class Surface3D_With_Holes extends JFrame { public Surface3D_With_Holes () { ChartDataModel cdata = new ChartDataModel (); int size = 100; for (int i = 0; i < 20; i++) { Object obj[] = new Object[size]; for (int j = 0; j < size; j++) { double yy = (i/(double)(size- 1) - 0.5) * 4.5; double xx = (j/(double)(size- 1) - 0.5) * 4.5; if ((i % 5) != 0 || (j % 5) != 0) obj[j]= (Math.sin(xx * xx + yy * yy) / 3 + 0.5)*100; else { obj[j] = Double.NaN; } } cdata.add(new Object[]{obj }); } /* * Creating and setting the mapper */ MathAxisMapper yMapper = new MathAxisMapper (); MathAxisMapper xMapper = new MathAxisMapper (); MathAxisMapper zMapper = new MathAxisMapper (); yMapper.setRange (0, 100); xMapper.setRange (0, 60); zMapper.setRange (0, 60); /* * Creating and setting axis */ Axis3D axisX = new Axis3DX (xMapper); Axis3D axisY = new Axis3DY (yMapper); Axis3D axisZ = new Axis3DZ (zMapper); axisX.setTitle ("Minute"); axisY.setTitle ("Load (%)"); axisZ.setTitle ("Second"); /* * Creating the grid */ Grid3D grid_xy = new Grid3D (xMapper, yMapper, Grid3D.GridOrientation.XY); Grid3D grid_xz = new Grid3D (xMapper, zMapper, Grid3D.GridOrientation.XZ); Grid3D grid_yz = new Grid3D (yMapper, zMapper, Grid3D.GridOrientation.YZ); grid_xy.getPaintStyle ().setBackground (Color.LIGHT_GRAY); grid_xz.getPaintStyle ().setBackground (Color.LIGHT_GRAY); grid_yz.getPaintStyle ().setBackground (Color.LIGHT_GRAY); /* * Creating and setting series */ Surface3DSeries series3D = new Surface3DSeries (cdata, xMapper, yMapper, xMapper); series3D.setColorPalette (new Color [] {new Color (32, 39, 83), new Color (97, 95, 238), new Color (42, 213, 220), new Color (31, 215, 67), new Color (216, 249, 34), new Color (222, 157, 65), new Color (194, 64, 98)}); series3D.setName ("Load (%)"); series3D.setStrategy (Surface3DStrategies.SURFACE_WITH_HOLES); /* * Creating chart */ Chart3D chart = new Chart3D (); chart.addPlugin (new ChartRotator ()); chart.addPlugin (new ChartZoomer ()); chart.setObjects (new ChartObject [] {series3D, grid_xy, grid_xz, grid_yz}); chart.setAxis (axisX, axisY, axisZ); ((SimpleProjector3D) chart.projector ()) .setElevationAngle (Math .toRadians (50)); ((SimpleProjector3D) chart.projector ()) .setRotationAngle (Math .toRadians (-50)); /* * Creating title */ LabeledChart m_chart = new LabeledChart (chart); /* * Legend */ m_chart.setRightView (new Legend(chart)); m_chart.setTitle ("CPU usage with errors"); JChartPanel m_chartPanel = new JChartPanel (m_chart); add(m_chartPanel); } public static void main (String [] args) { Surface3D_With_Holes frame = new Surface3D_With_Holes(); frame.setSize(new Dimension(600,400)); frame.setDefaultCloseOperation(EXIT_ON_CLOSE); frame.setVisible(true); } } |
This Series fill holes (null values) in Surface3D charts.The hole fill color can be specified.
1 | // The Surface strategy is specified series3D.setStrategy (Surface3DStrategies.SURFACE_WITH_FILLED_HOLES); // The holes (null value) colors are specified series3D.getPaintStyle ().setBackground (SurfacePaintTags.NULL, Color.BLACK); |
For Surface3D series possible set solid wall and specify the wall color.
series3D.setSolid (true); series3D.getPaintStyle ().setBackground (SurfacePaintTags.SOLID, Color.LIGHT_GRAY); |
For this series, there is a possibility to set wireframe, using setWireFrame(boolean) method.
series3D.setWireFrame (true); |
It is possible to set markers which represent specific points in the chart.
1 | ChartDataModel markerData = new ChartDataModel(); DataColumnType [] columnTypes = new DataColumnType [] { DataColumnType.KEY, DataColumnType.VALUE, DataColumnType.EXTENT }; markerData.add (columnTypes, new Object [] {new Double(0.4), new Double(1)}); markerData.add (columnTypes, new Object [] {new Double(0.3), new Double(0.5)}); series3D.setMarkers(new DotMarker3D(),markerData); |
It is possible to set smooth shading for Surface 3D (continues, gradient coloring). By Default shading mode for Surface 3D is DISCRETE.
// Set shading mode Smooth series3D.setShadingMode(SurfaceShadingMode.SMOOTH); |
Figure 4.2.5.2.2 Surface3D Series in Smooth Mode Demonstration