Skip to content

Commit 7f79c27

Browse files
committed
Worked on negative values for stacked-bars, not yet complete, bugs in highlighting.
1 parent 9a9c9ab commit 7f79c27

File tree

14 files changed

+365
-52
lines changed

14 files changed

+365
-52
lines changed

MPChartExample/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<activity android:name="PerformanceLineChart"></activity>
5252
<activity android:name="BarChartActivitySinus"></activity>
5353
<activity android:name="ScrollViewActivity"></activity>
54+
<activity android:name="StackedBarActivityNegative"></activity>
5455
</application>
5556

5657
</manifest>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent" >
5+
6+
<com.github.mikephil.charting.charts.HorizontalBarChart
7+
android:id="@+id/chart1"
8+
android:layout_width="match_parent"
9+
android:layout_height="match_parent"
10+
android:background="@android:color/white" />
11+
12+
</RelativeLayout>

MPChartExample/src/com/xxmassdeveloper/mpchartexample/BarChartActivityMultiDataset.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
223223
ArrayList<BarDataSet> dataSets = new ArrayList<BarDataSet>();
224224
dataSets.add(set1);
225225
dataSets.add(set2);
226-
dataSets.add(set3);
226+
// dataSets.add(set3);
227227

228228
BarData data = new BarData(xVals, dataSets);
229229
// data.setValueFormatter(new LargeValueFormatter());
Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,235 @@
1+
2+
package com.xxmassdeveloper.mpchartexample;
3+
4+
import android.graphics.Color;
5+
import android.os.Bundle;
6+
import android.util.Log;
7+
import android.view.Menu;
8+
import android.view.MenuItem;
9+
import android.view.WindowManager;
10+
import android.widget.SeekBar;
11+
import android.widget.SeekBar.OnSeekBarChangeListener;
12+
import android.widget.TextView;
13+
import android.widget.Toast;
14+
15+
import com.github.mikephil.charting.charts.BarChart;
16+
import com.github.mikephil.charting.charts.HorizontalBarChart;
17+
import com.github.mikephil.charting.components.Legend;
18+
import com.github.mikephil.charting.components.Legend.LegendPosition;
19+
import com.github.mikephil.charting.components.XAxis;
20+
import com.github.mikephil.charting.components.XAxis.XAxisPosition;
21+
import com.github.mikephil.charting.components.YAxis;
22+
import com.github.mikephil.charting.data.BarData;
23+
import com.github.mikephil.charting.data.BarDataSet;
24+
import com.github.mikephil.charting.data.BarEntry;
25+
import com.github.mikephil.charting.data.DataSet;
26+
import com.github.mikephil.charting.data.Entry;
27+
import com.github.mikephil.charting.data.filter.Approximator;
28+
import com.github.mikephil.charting.data.filter.Approximator.ApproximatorType;
29+
import com.github.mikephil.charting.listener.OnChartValueSelectedListener;
30+
import com.github.mikephil.charting.utils.ColorTemplate;
31+
import com.github.mikephil.charting.utils.Highlight;
32+
import com.github.mikephil.charting.utils.ValueFormatter;
33+
import com.xxmassdeveloper.mpchartexample.custom.MyValueFormatter;
34+
import com.xxmassdeveloper.mpchartexample.notimportant.DemoBase;
35+
36+
import java.text.DecimalFormat;
37+
import java.util.ArrayList;
38+
39+
public class StackedBarActivityNegative extends DemoBase implements
40+
OnChartValueSelectedListener {
41+
42+
private HorizontalBarChart mChart;
43+
44+
@Override
45+
protected void onCreate(Bundle savedInstanceState) {
46+
super.onCreate(savedInstanceState);
47+
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
48+
WindowManager.LayoutParams.FLAG_FULLSCREEN);
49+
setContentView(R.layout.activity_age_distribution);
50+
51+
setTitle("Age Distribution Austria");
52+
53+
mChart = (HorizontalBarChart) findViewById(R.id.chart1);
54+
mChart.setOnChartValueSelectedListener(this);
55+
mChart.setDrawGridBackground(false);
56+
mChart.setDescription("");
57+
58+
// if false values are only drawn for the stack sum, else each value is
59+
// drawn
60+
mChart.setDrawValuesForWholeStack(true);
61+
// scaling can now only be done on x- and y-axis separately
62+
mChart.setPinchZoom(false);
63+
64+
mChart.setDrawBarShadow(false);
65+
mChart.setDrawValueAboveBar(true);
66+
67+
mChart.getAxisLeft().setEnabled(false);
68+
mChart.getAxisRight().setStartAtZero(false);
69+
mChart.getAxisRight().setAxisMaxValue(25f);
70+
mChart.getAxisRight().setAxisMinValue(-25f);
71+
mChart.getAxisRight().setLabelCount(7);
72+
mChart.getAxisRight().setValueFormatter(new CustomFormatter());
73+
mChart.getAxisRight().setTextSize(9f);
74+
75+
XAxis xAxis = mChart.getXAxis();
76+
xAxis.setPosition(XAxisPosition.BOTH_SIDED);
77+
xAxis.setDrawGridLines(false);
78+
xAxis.setDrawAxisLine(false);
79+
xAxis.setTextSize(9f);
80+
81+
Legend l = mChart.getLegend();
82+
l.setPosition(LegendPosition.BELOW_CHART_RIGHT);
83+
l.setFormSize(8f);
84+
l.setFormToTextSpace(4f);
85+
l.setXEntrySpace(6f);
86+
87+
ArrayList<BarEntry> yValues = new ArrayList<BarEntry>();
88+
yValues.add(new BarEntry(new float[]{ -10, 10 }, 0));
89+
yValues.add(new BarEntry(new float[]{ -12, 13 }, 1));
90+
yValues.add(new BarEntry(new float[]{ -15, 15 }, 2));
91+
yValues.add(new BarEntry(new float[]{ -17, 17 }, 3));
92+
yValues.add(new BarEntry(new float[]{ -19, 20 }, 4));
93+
yValues.add(new BarEntry(new float[]{ -19, 19 }, 5));
94+
yValues.add(new BarEntry(new float[]{ -16, 16 }, 6));
95+
yValues.add(new BarEntry(new float[]{ -13, 14 }, 7));
96+
yValues.add(new BarEntry(new float[]{ -10, 11 }, 8));
97+
yValues.add(new BarEntry(new float[]{ -5, 6 }, 9));
98+
yValues.add(new BarEntry(new float[]{ -1, 2 }, 10));
99+
100+
BarDataSet set = new BarDataSet(yValues, "Age Distribution");
101+
set.setValueFormatter(new CustomFormatter());
102+
set.setValueTextSize(7f);
103+
set.setAxisDependency(YAxis.AxisDependency.RIGHT);
104+
set.setBarSpacePercent(50f);
105+
set.setColors(new int[] {Color.rgb(67,67,72), Color.rgb(124,181,236)});
106+
set.setStackLabels(new String[]{
107+
"Men", "Women"
108+
});
109+
110+
String []xVals = new String[]{"0-10", "10-20", "20-30", "30-40", "40-50", "50-60", "60-70", "70-80", "80-90", "90-100", "100+"};
111+
112+
BarData data = new BarData(xVals, set);
113+
mChart.setData(data);
114+
mChart.invalidate();
115+
}
116+
117+
@Override
118+
public boolean onCreateOptionsMenu(Menu menu) {
119+
getMenuInflater().inflate(R.menu.bar, menu);
120+
return true;
121+
}
122+
123+
@Override
124+
public boolean onOptionsItemSelected(MenuItem item) {
125+
126+
switch (item.getItemId()) {
127+
case R.id.actionToggleValues: {
128+
for (DataSet<?> set : mChart.getData().getDataSets())
129+
set.setDrawValues(!set.isDrawValuesEnabled());
130+
131+
mChart.invalidate();
132+
break;
133+
}
134+
case R.id.actionToggleHighlight: {
135+
if (mChart.isHighlightEnabled())
136+
mChart.setHighlightEnabled(false);
137+
else
138+
mChart.setHighlightEnabled(true);
139+
mChart.invalidate();
140+
break;
141+
}
142+
case R.id.actionTogglePinch: {
143+
if (mChart.isPinchZoomEnabled())
144+
mChart.setPinchZoom(false);
145+
else
146+
mChart.setPinchZoom(true);
147+
148+
mChart.invalidate();
149+
break;
150+
}
151+
case R.id.actionToggleAutoScaleMinMax: {
152+
mChart.setAutoScaleMinMaxEnabled(!mChart.isAutoScaleMinMaxEnabled());
153+
mChart.notifyDataSetChanged();
154+
break;
155+
}
156+
case R.id.actionToggleHighlightArrow: {
157+
if (mChart.isDrawHighlightArrowEnabled())
158+
mChart.setDrawHighlightArrow(false);
159+
else
160+
mChart.setDrawHighlightArrow(true);
161+
mChart.invalidate();
162+
break;
163+
}
164+
case R.id.actionToggleStartzero: {
165+
mChart.getAxisLeft().setStartAtZero(!mChart.getAxisLeft().isStartAtZeroEnabled());
166+
mChart.getAxisRight().setStartAtZero(!mChart.getAxisRight().isStartAtZeroEnabled());
167+
mChart.invalidate();
168+
break;
169+
}
170+
case R.id.animateX: {
171+
mChart.animateX(3000);
172+
break;
173+
}
174+
case R.id.animateY: {
175+
mChart.animateY(3000);
176+
break;
177+
}
178+
case R.id.animateXY: {
179+
180+
mChart.animateXY(3000, 3000);
181+
break;
182+
}
183+
case R.id.actionToggleFilter: {
184+
185+
Approximator a = new Approximator(ApproximatorType.DOUGLAS_PEUCKER, 25);
186+
187+
if (!mChart.isFilteringEnabled()) {
188+
mChart.enableFiltering(a);
189+
} else {
190+
mChart.disableFiltering();
191+
}
192+
mChart.invalidate();
193+
break;
194+
}
195+
case R.id.actionSave: {
196+
if (mChart.saveToGallery("title" + System.currentTimeMillis(), 50)) {
197+
Toast.makeText(getApplicationContext(), "Saving SUCCESSFUL!",
198+
Toast.LENGTH_SHORT).show();
199+
} else
200+
Toast.makeText(getApplicationContext(), "Saving FAILED!", Toast.LENGTH_SHORT)
201+
.show();
202+
break;
203+
}
204+
}
205+
return true;
206+
}
207+
208+
@Override
209+
public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {
210+
211+
BarEntry entry = (BarEntry) e;
212+
Log.i("VAL SELECTED",
213+
"Value: " + entry.getVals()[h.getStackIndex()]);
214+
}
215+
216+
@Override
217+
public void onNothingSelected() {
218+
// TODO Auto-generated method stub
219+
220+
}
221+
222+
private class CustomFormatter implements ValueFormatter {
223+
224+
private DecimalFormat mFormat;
225+
226+
public CustomFormatter() {
227+
mFormat = new DecimalFormat("###");
228+
}
229+
230+
@Override
231+
public String getFormattedValue(float value) {
232+
return mFormat.format(Math.abs(value)) + "m";
233+
}
234+
}
235+
}

MPChartExample/src/com/xxmassdeveloper/mpchartexample/notimportant/MainActivity.java

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.xxmassdeveloper.mpchartexample.ScatterChartActivity;
4646
import com.xxmassdeveloper.mpchartexample.ScrollViewActivity;
4747
import com.xxmassdeveloper.mpchartexample.StackedBarActivity;
48+
import com.xxmassdeveloper.mpchartexample.StackedBarActivityNegative;
4849
import com.xxmassdeveloper.mpchartexample.fragments.SimpleChartDemo;
4950

5051
import java.util.ArrayList;
@@ -77,6 +78,8 @@ protected void onCreate(Bundle savedInstanceState) {
7778
objects.add(new ContentItem("Bubble Chart", "A simple demonstration of the bubble chart."));
7879
objects.add(new ContentItem("Stacked Bar Chart",
7980
"A simple demonstration of a bar chart with stacked bars."));
81+
objects.add(new ContentItem("Stacked Bar Chart Negative",
82+
"A simple demonstration of stacked bars with negative and positive values."));
8083
objects.add(new ContentItem("Another Bar Chart",
8184
"Implementation of a BarChart that only shows values at the bottom."));
8285
objects.add(new ContentItem("Multiple Lines Chart",
@@ -176,18 +179,22 @@ public void onItemClick(AdapterView<?> av, View v, int pos, long arg3) {
176179
startActivity(i);
177180
break;
178181
case 9:
179-
i = new Intent(this, AnotherBarActivity.class);
182+
i = new Intent(this, StackedBarActivityNegative.class);
180183
startActivity(i);
181184
break;
182185
case 10:
183-
i = new Intent(this, MultiLineChartActivity.class);
186+
i = new Intent(this, AnotherBarActivity.class);
184187
startActivity(i);
185188
break;
186189
case 11:
187-
i = new Intent(this, BarChartActivityMultiDataset.class);
190+
i = new Intent(this, MultiLineChartActivity.class);
188191
startActivity(i);
189192
break;
190193
case 12:
194+
i = new Intent(this, BarChartActivityMultiDataset.class);
195+
startActivity(i);
196+
break;
197+
case 13:
191198
// i = new Intent(this, DrawChartActivity.class);
192199
// startActivity(i);
193200

@@ -197,55 +204,55 @@ public void onItemClick(AdapterView<?> av, View v, int pos, long arg3) {
197204
b.setPositiveButton("OK", null);
198205
b.create().show();
199206
break;
200-
case 13:
207+
case 14:
201208
i = new Intent(this, SimpleChartDemo.class);
202209
startActivity(i);
203210
break;
204-
case 14:
211+
case 15:
205212
i = new Intent(this, ListViewBarChartActivity.class);
206213
startActivity(i);
207214
break;
208-
case 15:
215+
case 16:
209216
i = new Intent(this, ListViewMultiChartActivity.class);
210217
startActivity(i);
211218
break;
212-
case 16:
219+
case 17:
213220
i = new Intent(this, InvertedLineChartActivity.class);
214221
startActivity(i);
215222
break;
216-
case 17:
223+
case 18:
217224
i = new Intent(this, CandleStickChartActivity.class);
218225
startActivity(i);
219226
break;
220-
case 18:
227+
case 19:
221228
i = new Intent(this, CubicLineChartActivity.class);
222229
startActivity(i);
223230
break;
224-
case 19:
231+
case 20:
225232
i = new Intent(this, RadarChartActivitry.class);
226233
startActivity(i);
227234
break;
228-
case 20:
235+
case 21:
229236
i = new Intent(this, LineChartActivityColored.class);
230237
startActivity(i);
231238
break;
232-
case 21:
239+
case 22:
233240
i = new Intent(this, RealtimeLineChartActivity.class);
234241
startActivity(i);
235242
break;
236-
case 22:
243+
case 23:
237244
i = new Intent(this, DynamicalAddingActivity.class);
238245
startActivity(i);
239246
break;
240-
case 23:
247+
case 24:
241248
i = new Intent(this, PerformanceLineChart.class);
242249
startActivity(i);
243250
break;
244-
case 24:
251+
case 25:
245252
i = new Intent(this, BarChartActivitySinus.class);
246253
startActivity(i);
247254
break;
248-
case 25:
255+
case 26:
249256
i = new Intent(this, ScrollViewActivity.class);
250257
startActivity(i);
251258
break;

0 commit comments

Comments
 (0)