1414import com .github .mikephil .charting .charts .BarChart ;
1515import com .github .mikephil .charting .components .AxisBase ;
1616import com .github .mikephil .charting .components .Legend ;
17- import com .github .mikephil .charting .components .Legend .LegendPosition ;
1817import com .github .mikephil .charting .components .XAxis ;
1918import com .github .mikephil .charting .components .YAxis ;
2019import com .github .mikephil .charting .data .BarData ;
@@ -46,6 +45,7 @@ protected void onCreate(Bundle savedInstanceState) {
4645 setContentView (R .layout .activity_barchart );
4746
4847 tvX = (TextView ) findViewById (R .id .tvXMax );
48+ tvX .setTextSize (10 );
4949 tvY = (TextView ) findViewById (R .id .tvYMax );
5050
5151 mSeekBarX = (SeekBar ) findViewById (R .id .seekBar1 );
@@ -59,7 +59,7 @@ protected void onCreate(Bundle savedInstanceState) {
5959 mChart .getDescription ().setEnabled (false );
6060
6161// mChart.setDrawBorders(true);
62-
62+
6363 // scaling can now only be done on x- and y-axis separately
6464 mChart .setPinchZoom (false );
6565
@@ -83,14 +83,15 @@ protected void onCreate(Bundle savedInstanceState) {
8383 l .setDrawInside (true );
8484 l .setTypeface (mTfLight );
8585 l .setYOffset (0f );
86+ l .setXOffset (10f );
8687 l .setYEntrySpace (0f );
8788 l .setTextSize (8f );
8889
89- XAxis xl = mChart .getXAxis ();
90- xl .setTypeface (mTfLight );
91- xl .setGranularity (1f );
92- xl .setCenterAxisLabels (true );
93- xl .setValueFormatter (new IAxisValueFormatter () {
90+ XAxis xAxis = mChart .getXAxis ();
91+ xAxis .setTypeface (mTfLight );
92+ xAxis .setGranularity (1f );
93+ xAxis .setCenterAxisLabels (true );
94+ xAxis .setValueFormatter (new IAxisValueFormatter () {
9495 @ Override
9596 public String getFormattedValue (float value , AxisBase axis ) {
9697 return String .valueOf ((int ) value );
@@ -106,7 +107,7 @@ public int getDecimalDigits() {
106107 leftAxis .setTypeface (mTfLight );
107108 leftAxis .setValueFormatter (new LargeValueFormatter ());
108109 leftAxis .setDrawGridLines (false );
109- leftAxis .setSpaceTop (30f );
110+ leftAxis .setSpaceTop (35f );
110111 leftAxis .setAxisMinimum (0f ); // this replaces setStartAtZero(true)
111112
112113 mChart .getAxisRight ().setEnabled (false );
@@ -145,13 +146,13 @@ public boolean onOptionsItemSelected(MenuItem item) {
145146 }
146147 case R .id .actionToggleBarBorders : {
147148 for (IBarDataSet set : mChart .getData ().getDataSets ())
148- ((BarDataSet )set ).setBarBorderWidth (set .getBarBorderWidth () == 1.f ? 0.f : 1.f );
149+ ((BarDataSet ) set ).setBarBorderWidth (set .getBarBorderWidth () == 1.f ? 0.f : 1.f );
149150
150151 mChart .invalidate ();
151152 break ;
152153 }
153154 case R .id .actionToggleHighlight : {
154- if (mChart .getData () != null ) {
155+ if (mChart .getData () != null ) {
155156 mChart .getData ().setHighlightEnabled (!mChart .getData ().isHighlightEnabled ());
156157 mChart .invalidate ();
157158 }
@@ -171,7 +172,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
171172 break ;
172173 }
173174 case R .id .animateXY : {
174-
175175 mChart .animateXY (3000 , 3000 );
176176 break ;
177177 }
@@ -182,92 +182,85 @@ public boolean onOptionsItemSelected(MenuItem item) {
182182 @ Override
183183 public void onProgressChanged (SeekBar seekBar , int progress , boolean fromUser ) {
184184
185- float groupSpace = 0.04f ;
186- float barSpace = 0.02f ; // x3 dataset
187- float barWidth = 0.3f ; // x3 dataset
188- // (0.3 + 0.02 ) * 3 + 0.04 = 1.00 -> interval per "group"
185+ float groupSpace = 0.08f ;
186+ float barSpace = 0.03f ; // x4 DataSet
187+ float barWidth = 0.2f ; // x4 DataSet
188+ // (0.2 + 0.03 ) * 4 + 0.08 = 1.00 -> interval per "group"
189189
190+ int groupCount = mSeekBarX .getProgress () + 1 ;
190191 int startYear = 1980 ;
191- int endYear = startYear + mSeekBarX . getProgress () ;
192+ int endYear = startYear + groupCount ;
192193
193- tvX .setText (startYear + "\n -" + endYear );
194+ tvX .setText (startYear + "-" + endYear );
194195 tvY .setText ("" + (mSeekBarY .getProgress ()));
195196
196197 ArrayList <BarEntry > yVals1 = new ArrayList <BarEntry >();
197198 ArrayList <BarEntry > yVals2 = new ArrayList <BarEntry >();
198199 ArrayList <BarEntry > yVals3 = new ArrayList <BarEntry >();
200+ ArrayList <BarEntry > yVals4 = new ArrayList <BarEntry >();
199201
200- float mult = mSeekBarY .getProgress () * 100000f ;
202+ float randomMultiplier = mSeekBarY .getProgress () * 100000f ;
201203
202204 for (int i = startYear ; i < endYear ; i ++) {
203- float val = (float ) (Math .random () * mult ) + 3 ;
204- yVals1 .add (new BarEntry (i , val ));
205+ yVals1 .add (new BarEntry (i , (float ) (Math .random () * randomMultiplier )));
206+ yVals2 .add (new BarEntry (i , (float ) (Math .random () * randomMultiplier )));
207+ yVals3 .add (new BarEntry (i , (float ) (Math .random () * randomMultiplier )));
208+ yVals4 .add (new BarEntry (i , (float ) (Math .random () * randomMultiplier )));
205209 }
206210
207- for (int i = startYear ; i < endYear ; i ++) {
208- float val = (float ) (Math .random () * mult ) + 3 ;
209- yVals2 .add (new BarEntry (i , val ));
210- }
211-
212- for (int i = startYear ; i < endYear ; i ++) {
213- float val = (float ) (Math .random () * mult ) + 3 ;
214- yVals3 .add (new BarEntry (i , val ));
215- }
211+ BarDataSet set1 , set2 , set3 , set4 ;
216212
217- BarDataSet set1 , set2 , set3 ;
213+ if ( mChart . getData () != null && mChart . getData (). getDataSetCount () > 0 ) {
218214
219- if (mChart .getData () != null &&
220- mChart .getData ().getDataSetCount () > 0 ) {
221- set1 = (BarDataSet )mChart .getData ().getDataSetByIndex (0 );
222- set2 = (BarDataSet )mChart .getData ().getDataSetByIndex (1 );
223- set3 = (BarDataSet )mChart .getData ().getDataSetByIndex (2 );
215+ set1 = (BarDataSet ) mChart .getData ().getDataSetByIndex (0 );
216+ set2 = (BarDataSet ) mChart .getData ().getDataSetByIndex (1 );
217+ set3 = (BarDataSet ) mChart .getData ().getDataSetByIndex (2 );
218+ set4 = (BarDataSet ) mChart .getData ().getDataSetByIndex (3 );
224219 set1 .setValues (yVals1 );
225220 set2 .setValues (yVals2 );
226221 set3 .setValues (yVals3 );
222+ set4 .setValues (yVals4 );
227223 mChart .getData ().notifyDataChanged ();
228224 mChart .notifyDataSetChanged ();
225+
229226 } else {
230- // create 3 datasets with different types
227+ // create 4 DataSets
231228 set1 = new BarDataSet (yVals1 , "Company A" );
232- // set1.setColors(ColorTemplate.createColors(getApplicationContext(),
233- // ColorTemplate.FRESH_COLORS));
234229 set1 .setColor (Color .rgb (104 , 241 , 175 ));
235230 set2 = new BarDataSet (yVals2 , "Company B" );
236231 set2 .setColor (Color .rgb (164 , 228 , 251 ));
237232 set3 = new BarDataSet (yVals3 , "Company C" );
238233 set3 .setColor (Color .rgb (242 , 247 , 158 ));
234+ set4 = new BarDataSet (yVals4 , "Company D" );
235+ set4 .setColor (Color .rgb (255 , 102 , 0 ));
239236
240- ArrayList <IBarDataSet > dataSets = new ArrayList <IBarDataSet >();
241- dataSets .add (set1 );
242- dataSets .add (set2 );
243- dataSets .add (set3 );
244-
245- BarData data = new BarData (dataSets );
237+ BarData data = new BarData (set1 , set2 , set3 , set4 );
246238 data .setValueFormatter (new LargeValueFormatter ());
247-
248- // add space between the dataset groups in percent of bar-width
249239 data .setValueTypeface (mTfLight );
250240
251241 mChart .setData (data );
252242 }
253243
244+ // specify the width each bar should have
254245 mChart .getBarData ().setBarWidth (barWidth );
246+
247+ // restrict the x-axis range
255248 mChart .getXAxis ().setAxisMinimum (startYear );
256- mChart .getXAxis ().setAxisMaximum (mChart .getBarData ().getGroupWidth (groupSpace , barSpace ) * mSeekBarX .getProgress () + startYear );
249+
250+ // barData.getGroupWith(...) is a helper that calculates the width each group needs based on the provided parameters
251+ mChart .getXAxis ().setAxisMaximum (startYear + mChart .getBarData ().getGroupWidth (groupSpace , barSpace ) * groupCount );
257252 mChart .groupBars (startYear , groupSpace , barSpace );
258253 mChart .invalidate ();
259254 }
260255
261256 @ Override
262257 public void onStartTrackingTouch (SeekBar seekBar ) {
263258 // TODO Auto-generated method stub
264-
265259 }
266260
267261 @ Override
268262 public void onStopTrackingTouch (SeekBar seekBar ) {
269263 // TODO Auto-generated method stub
270-
271264 }
272265
273266 @ Override
0 commit comments