1 2 package com.xxmassdeveloper.mpchartexample; 3 4 import android.content.Intent; 5 import android.graphics.Color; 6 import android.net.Uri; 7 import android.os.Bundle; 8 import android.view.Menu; 9 import android.view.MenuItem; 10 import android.view.WindowManager; 11 12 import com.github.mikephil.charting.charts.CombinedChart; 13 import com.github.mikephil.charting.charts.CombinedChart.DrawOrder; 14 import com.github.mikephil.charting.components.AxisBase; 15 import com.github.mikephil.charting.components.Legend; 16 import com.github.mikephil.charting.components.XAxis; 17 import com.github.mikephil.charting.components.XAxis.XAxisPosition; 18 import com.github.mikephil.charting.components.YAxis; 19 import com.github.mikephil.charting.data.BarData; 20 import com.github.mikephil.charting.data.BarDataSet; 21 import com.github.mikephil.charting.data.BarEntry; 22 import com.github.mikephil.charting.data.BubbleData; 23 import com.github.mikephil.charting.data.BubbleDataSet; 24 import com.github.mikephil.charting.data.BubbleEntry; 25 import com.github.mikephil.charting.data.CandleData; 26 import com.github.mikephil.charting.data.CandleDataSet; 27 import com.github.mikephil.charting.data.CandleEntry; 28 import com.github.mikephil.charting.data.CombinedData; 29 import com.github.mikephil.charting.data.Entry; 30 import com.github.mikephil.charting.data.LineData; 31 import com.github.mikephil.charting.data.LineDataSet; 32 import com.github.mikephil.charting.data.ScatterData; 33 import com.github.mikephil.charting.data.ScatterDataSet; 34 import com.github.mikephil.charting.formatter.IAxisValueFormatter; 35 import com.github.mikephil.charting.interfaces.datasets.IDataSet; 36 import com.github.mikephil.charting.utils.ColorTemplate; 37 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; 38 39 import java.util.ArrayList; 40 41 public class CombinedChartActivity extends DemoBase { 42 43 private CombinedChart chart; 44 private final int count = 12; 45 46 @Override onCreate(Bundle savedInstanceState)47 protected void onCreate(Bundle savedInstanceState) { 48 super.onCreate(savedInstanceState); 49 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 50 WindowManager.LayoutParams.FLAG_FULLSCREEN); 51 setContentView(R.layout.activity_combined); 52 53 setTitle("CombinedChartActivity"); 54 55 chart = findViewById(R.id.chart1); 56 chart.getDescription().setEnabled(false); 57 chart.setBackgroundColor(Color.WHITE); 58 chart.setDrawGridBackground(false); 59 chart.setDrawBarShadow(false); 60 chart.setHighlightFullBarEnabled(false); 61 62 // draw bars behind lines 63 chart.setDrawOrder(new DrawOrder[]{ 64 DrawOrder.BAR, DrawOrder.BUBBLE, DrawOrder.CANDLE, DrawOrder.LINE, DrawOrder.SCATTER 65 }); 66 67 Legend l = chart.getLegend(); 68 l.setWordWrapEnabled(true); 69 l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM); 70 l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER); 71 l.setOrientation(Legend.LegendOrientation.HORIZONTAL); 72 l.setDrawInside(false); 73 74 YAxis rightAxis = chart.getAxisRight(); 75 rightAxis.setDrawGridLines(false); 76 rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true) 77 78 YAxis leftAxis = chart.getAxisLeft(); 79 leftAxis.setDrawGridLines(false); 80 leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true) 81 82 XAxis xAxis = chart.getXAxis(); 83 xAxis.setPosition(XAxisPosition.BOTH_SIDED); 84 xAxis.setAxisMinimum(0f); 85 xAxis.setGranularity(1f); 86 xAxis.setValueFormatter(new IAxisValueFormatter() { 87 @Override 88 public String getFormattedValue(float value, AxisBase axis) { 89 return months[(int) value % months.length]; 90 } 91 }); 92 93 CombinedData data = new CombinedData(); 94 95 data.setData(generateLineData()); 96 data.setData(generateBarData()); 97 data.setData(generateBubbleData()); 98 data.setData(generateScatterData()); 99 data.setData(generateCandleData()); 100 data.setValueTypeface(tfLight); 101 102 xAxis.setAxisMaximum(data.getXMax() + 0.25f); 103 104 chart.setData(data); 105 chart.invalidate(); 106 } 107 generateLineData()108 private LineData generateLineData() { 109 110 LineData d = new LineData(); 111 112 ArrayList<Entry> entries = new ArrayList<>(); 113 114 for (int index = 0; index < count; index++) 115 entries.add(new Entry(index + 0.5f, getRandom(15, 5))); 116 117 LineDataSet set = new LineDataSet(entries, "Line DataSet"); 118 set.setColor(Color.rgb(240, 238, 70)); 119 set.setLineWidth(2.5f); 120 set.setCircleColor(Color.rgb(240, 238, 70)); 121 set.setCircleRadius(5f); 122 set.setFillColor(Color.rgb(240, 238, 70)); 123 set.setMode(LineDataSet.Mode.CUBIC_BEZIER); 124 set.setDrawValues(true); 125 set.setValueTextSize(10f); 126 set.setValueTextColor(Color.rgb(240, 238, 70)); 127 128 set.setAxisDependency(YAxis.AxisDependency.LEFT); 129 d.addDataSet(set); 130 131 return d; 132 } 133 generateBarData()134 private BarData generateBarData() { 135 136 ArrayList<BarEntry> entries1 = new ArrayList<>(); 137 ArrayList<BarEntry> entries2 = new ArrayList<>(); 138 139 for (int index = 0; index < count; index++) { 140 entries1.add(new BarEntry(0, getRandom(25, 25))); 141 142 // stacked 143 entries2.add(new BarEntry(0, new float[]{getRandom(13, 12), getRandom(13, 12)})); 144 } 145 146 BarDataSet set1 = new BarDataSet(entries1, "Bar 1"); 147 set1.setColor(Color.rgb(60, 220, 78)); 148 set1.setValueTextColor(Color.rgb(60, 220, 78)); 149 set1.setValueTextSize(10f); 150 set1.setAxisDependency(YAxis.AxisDependency.LEFT); 151 152 BarDataSet set2 = new BarDataSet(entries2, ""); 153 set2.setStackLabels(new String[]{"Stack 1", "Stack 2"}); 154 set2.setColors(Color.rgb(61, 165, 255), Color.rgb(23, 197, 255)); 155 set2.setValueTextColor(Color.rgb(61, 165, 255)); 156 set2.setValueTextSize(10f); 157 set2.setAxisDependency(YAxis.AxisDependency.LEFT); 158 159 float groupSpace = 0.06f; 160 float barSpace = 0.02f; // x2 dataset 161 float barWidth = 0.45f; // x2 dataset 162 // (0.45 + 0.02) * 2 + 0.06 = 1.00 -> interval per "group" 163 164 BarData d = new BarData(set1, set2); 165 d.setBarWidth(barWidth); 166 167 // make this BarData object grouped 168 d.groupBars(0, groupSpace, barSpace); // start at x = 0 169 170 return d; 171 } 172 generateScatterData()173 private ScatterData generateScatterData() { 174 175 ScatterData d = new ScatterData(); 176 177 ArrayList<Entry> entries = new ArrayList<>(); 178 179 for (float index = 0; index < count; index += 0.5f) 180 entries.add(new Entry(index + 0.25f, getRandom(10, 55))); 181 182 ScatterDataSet set = new ScatterDataSet(entries, "Scatter DataSet"); 183 set.setColors(ColorTemplate.MATERIAL_COLORS); 184 set.setScatterShapeSize(7.5f); 185 set.setDrawValues(false); 186 set.setValueTextSize(10f); 187 d.addDataSet(set); 188 189 return d; 190 } 191 generateCandleData()192 private CandleData generateCandleData() { 193 194 CandleData d = new CandleData(); 195 196 ArrayList<CandleEntry> entries = new ArrayList<>(); 197 198 for (int index = 0; index < count; index += 2) 199 entries.add(new CandleEntry(index + 1f, 90, 70, 85, 75f)); 200 201 CandleDataSet set = new CandleDataSet(entries, "Candle DataSet"); 202 set.setDecreasingColor(Color.rgb(142, 150, 175)); 203 set.setShadowColor(Color.DKGRAY); 204 set.setBarSpace(0.3f); 205 set.setValueTextSize(10f); 206 set.setDrawValues(false); 207 d.addDataSet(set); 208 209 return d; 210 } 211 generateBubbleData()212 private BubbleData generateBubbleData() { 213 214 BubbleData bd = new BubbleData(); 215 216 ArrayList<BubbleEntry> entries = new ArrayList<>(); 217 218 for (int index = 0; index < count; index++) { 219 float y = getRandom(10, 105); 220 float size = getRandom(100, 105); 221 entries.add(new BubbleEntry(index + 0.5f, y, size)); 222 } 223 224 BubbleDataSet set = new BubbleDataSet(entries, "Bubble DataSet"); 225 set.setColors(ColorTemplate.VORDIPLOM_COLORS); 226 set.setValueTextSize(10f); 227 set.setValueTextColor(Color.WHITE); 228 set.setHighlightCircleWidth(1.5f); 229 set.setDrawValues(true); 230 bd.addDataSet(set); 231 232 return bd; 233 } 234 235 @Override onCreateOptionsMenu(Menu menu)236 public boolean onCreateOptionsMenu(Menu menu) { 237 getMenuInflater().inflate(R.menu.combined, menu); 238 return true; 239 } 240 241 @Override onOptionsItemSelected(MenuItem item)242 public boolean onOptionsItemSelected(MenuItem item) { 243 switch (item.getItemId()) { 244 case R.id.viewGithub: { 245 Intent i = new Intent(Intent.ACTION_VIEW); 246 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/CombinedChartActivity.java")); 247 startActivity(i); 248 break; 249 } 250 case R.id.actionToggleLineValues: { 251 for (IDataSet set : chart.getData().getDataSets()) { 252 if (set instanceof LineDataSet) 253 set.setDrawValues(!set.isDrawValuesEnabled()); 254 } 255 256 chart.invalidate(); 257 break; 258 } 259 case R.id.actionToggleBarValues: { 260 for (IDataSet set : chart.getData().getDataSets()) { 261 if (set instanceof BarDataSet) 262 set.setDrawValues(!set.isDrawValuesEnabled()); 263 } 264 265 chart.invalidate(); 266 break; 267 } 268 case R.id.actionRemoveDataSet: { 269 int rnd = (int) getRandom(chart.getData().getDataSetCount(), 0); 270 chart.getData().removeDataSet(chart.getData().getDataSetByIndex(rnd)); 271 chart.getData().notifyDataChanged(); 272 chart.notifyDataSetChanged(); 273 chart.invalidate(); 274 break; 275 } 276 } 277 return true; 278 } 279 280 @Override saveToGallery()281 public void saveToGallery() { /* Intentionally left empty */ } 282 } 283