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.BarChart; 13 import com.github.mikephil.charting.components.AxisBase; 14 import com.github.mikephil.charting.components.XAxis; 15 import com.github.mikephil.charting.components.XAxis.XAxisPosition; 16 import com.github.mikephil.charting.components.YAxis; 17 import com.github.mikephil.charting.data.BarData; 18 import com.github.mikephil.charting.data.BarDataSet; 19 import com.github.mikephil.charting.data.BarEntry; 20 import com.github.mikephil.charting.data.Entry; 21 import com.github.mikephil.charting.formatter.IAxisValueFormatter; 22 import com.github.mikephil.charting.formatter.IValueFormatter; 23 import com.github.mikephil.charting.utils.ViewPortHandler; 24 import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase; 25 26 import java.text.DecimalFormat; 27 import java.util.ArrayList; 28 import java.util.List; 29 30 public class BarChartPositiveNegative extends DemoBase { 31 32 private BarChart chart; 33 34 @Override onCreate(Bundle savedInstanceState)35 protected void onCreate(Bundle savedInstanceState) { 36 super.onCreate(savedInstanceState); 37 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 38 WindowManager.LayoutParams.FLAG_FULLSCREEN); 39 setContentView(R.layout.activity_barchart_noseekbar); 40 41 setTitle("BarChartPositiveNegative"); 42 43 chart = findViewById(R.id.chart1); 44 chart.setBackgroundColor(Color.WHITE); 45 chart.setExtraTopOffset(-30f); 46 chart.setExtraBottomOffset(10f); 47 chart.setExtraLeftOffset(70f); 48 chart.setExtraRightOffset(70f); 49 50 chart.setDrawBarShadow(false); 51 chart.setDrawValueAboveBar(true); 52 53 chart.getDescription().setEnabled(false); 54 55 // scaling can now only be done on x- and y-axis separately 56 chart.setPinchZoom(false); 57 58 chart.setDrawGridBackground(false); 59 60 XAxis xAxis = chart.getXAxis(); 61 xAxis.setPosition(XAxisPosition.BOTTOM); 62 xAxis.setTypeface(tfRegular); 63 xAxis.setDrawGridLines(false); 64 xAxis.setDrawAxisLine(false); 65 xAxis.setTextColor(Color.LTGRAY); 66 xAxis.setTextSize(13f); 67 xAxis.setLabelCount(5); 68 xAxis.setCenterAxisLabels(true); 69 xAxis.setGranularity(1f); 70 71 YAxis left = chart.getAxisLeft(); 72 left.setDrawLabels(false); 73 left.setSpaceTop(25f); 74 left.setSpaceBottom(25f); 75 left.setDrawAxisLine(false); 76 left.setDrawGridLines(false); 77 left.setDrawZeroLine(true); // draw a zero line 78 left.setZeroLineColor(Color.GRAY); 79 left.setZeroLineWidth(0.7f); 80 chart.getAxisRight().setEnabled(false); 81 chart.getLegend().setEnabled(false); 82 83 // THIS IS THE ORIGINAL DATA YOU WANT TO PLOT 84 final List<Data> data = new ArrayList<>(); 85 data.add(new Data(0f, -224.1f, "12-29")); 86 data.add(new Data(1f, 238.5f, "12-30")); 87 data.add(new Data(2f, 1280.1f, "12-31")); 88 data.add(new Data(3f, -442.3f, "01-01")); 89 data.add(new Data(4f, -2280.1f, "01-02")); 90 91 xAxis.setValueFormatter(new IAxisValueFormatter() { 92 @Override 93 public String getFormattedValue(float value, AxisBase axis) { 94 return data.get(Math.min(Math.max((int) value, 0), data.size()-1)).xAxisValue; 95 } 96 }); 97 98 setData(data); 99 } 100 setData(List<Data> dataList)101 private void setData(List<Data> dataList) { 102 103 ArrayList<BarEntry> values = new ArrayList<>(); 104 List<Integer> colors = new ArrayList<>(); 105 106 int green = Color.rgb(110, 190, 102); 107 int red = Color.rgb(211, 74, 88); 108 109 for (int i = 0; i < dataList.size(); i++) { 110 111 Data d = dataList.get(i); 112 BarEntry entry = new BarEntry(d.xValue, d.yValue); 113 values.add(entry); 114 115 // specific colors 116 if (d.yValue >= 0) 117 colors.add(red); 118 else 119 colors.add(green); 120 } 121 122 BarDataSet set; 123 124 if (chart.getData() != null && 125 chart.getData().getDataSetCount() > 0) { 126 set = (BarDataSet) chart.getData().getDataSetByIndex(0); 127 set.setValues(values); 128 chart.getData().notifyDataChanged(); 129 chart.notifyDataSetChanged(); 130 } else { 131 set = new BarDataSet(values, "Values"); 132 set.setColors(colors); 133 set.setValueTextColors(colors); 134 135 BarData data = new BarData(set); 136 data.setValueTextSize(13f); 137 data.setValueTypeface(tfRegular); 138 data.setValueFormatter(new ValueFormatter()); 139 data.setBarWidth(0.8f); 140 141 chart.setData(data); 142 chart.invalidate(); 143 } 144 } 145 146 /** 147 * Demo class representing data. 148 */ 149 private class Data { 150 151 final String xAxisValue; 152 final float yValue; 153 final float xValue; 154 Data(float xValue, float yValue, String xAxisValue)155 Data(float xValue, float yValue, String xAxisValue) { 156 this.xAxisValue = xAxisValue; 157 this.yValue = yValue; 158 this.xValue = xValue; 159 } 160 } 161 162 private class ValueFormatter implements IValueFormatter 163 { 164 165 private final DecimalFormat mFormat; 166 ValueFormatter()167 ValueFormatter() { 168 mFormat = new DecimalFormat("######.0"); 169 } 170 171 @Override getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler)172 public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { 173 return mFormat.format(value); 174 } 175 } 176 177 @Override onCreateOptionsMenu(Menu menu)178 public boolean onCreateOptionsMenu(Menu menu) { 179 getMenuInflater().inflate(R.menu.only_github, menu); 180 return true; 181 } 182 183 @Override onOptionsItemSelected(MenuItem item)184 public boolean onOptionsItemSelected(MenuItem item) { 185 186 switch (item.getItemId()) { 187 case R.id.viewGithub: { 188 Intent i = new Intent(Intent.ACTION_VIEW); 189 i.setData(Uri.parse("https://github.com/PhilJay/MPAndroidChart/blob/master/MPChartExample/src/com/xxmassdeveloper/mpchartexample/BarChartPositiveNegative.java")); 190 startActivity(i); 191 break; 192 } 193 } 194 195 return true; 196 } 197 198 @Override saveToGallery()199 public void saveToGallery() { /* Intentionally left empty */ } 200 } 201