Skip to content

Commit 455ff89

Browse files
committed
Fixes related to minmax and bubblechart rendering
1 parent c0bee1c commit 455ff89

7 files changed

Lines changed: 33 additions & 87 deletions

File tree

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ protected void onCreate(Bundle savedInstanceState) {
7373
mChart.setMaxVisibleValueCount(200);
7474
mChart.setPinchZoom(true);
7575

76-
mSeekBarX.setProgress(5);
76+
mSeekBarX.setProgress(1);
7777
mSeekBarY.setProgress(50);
7878

7979
Legend l = mChart.getLegend();
@@ -132,7 +132,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
132132
break;
133133
}
134134
case R.id.actionSave: {
135-
// mChart.saveToGallery("title"+System.currentTimeMillis());
136135
mChart.saveToPath("title" + System.currentTimeMillis(), "");
137136
break;
138137
}
@@ -156,7 +155,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
156155
@Override
157156
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
158157

159-
int count = mSeekBarX.getProgress() + 1;
158+
int count = mSeekBarX.getProgress();
160159
int range = mSeekBarY.getProgress();
161160

162161
tvX.setText("" + count);
@@ -205,6 +204,7 @@ public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
205204

206205
// create a data object with the datasets
207206
BubbleData data = new BubbleData(dataSets);
207+
data.setDrawValues(false);
208208
data.setValueTypeface(tf);
209209
data.setValueTextSize(8f);
210210
data.setValueTextColor(Color.WHITE);

MPChartLib/src/main/java/com/github/mikephil/charting/data/BarDataSet.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ public void calcMinMax() {
111111
if (mValues == null || mValues.isEmpty())
112112
return;
113113

114-
mYMax = Float.MIN_VALUE;
114+
mYMax = -Float.MAX_VALUE;
115115
mYMin = Float.MAX_VALUE;
116-
mXMax = Float.MIN_VALUE;
116+
mXMax = -Float.MAX_VALUE;
117117
mXMin = Float.MAX_VALUE;
118118

119119
for (BarEntry e : mValues) {

MPChartLib/src/main/java/com/github/mikephil/charting/data/BubbleDataSet.java

Lines changed: 5 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,38 +34,16 @@ public void calcMinMax() {
3434
if (mValues == null || mValues.isEmpty())
3535
return;
3636

37-
mYMax = Float.MIN_VALUE;
37+
mYMax = -Float.MAX_VALUE;
3838
mYMin = Float.MAX_VALUE;
39-
mXMax = Float.MIN_VALUE;
39+
mXMax = -Float.MAX_VALUE;
4040
mXMin = Float.MAX_VALUE;
4141

42-
// need chart width to guess this properly
42+
for (BubbleEntry e : mValues) {
4343

44-
for (BubbleEntry entry : mValues) {
44+
calcMinMax(e);
4545

46-
float ymin = entry.getY();
47-
float ymax = entry.getY();
48-
49-
if (ymin < mYMin) {
50-
mYMin = ymin;
51-
}
52-
53-
if (ymax > mYMax) {
54-
mYMax = ymax;
55-
}
56-
57-
final float xmin = entry.getX();
58-
final float xmax = entry.getX();
59-
60-
if (xmin < mXMin) {
61-
mXMin = xmin;
62-
}
63-
64-
if (xmax > mXMax) {
65-
mXMax = xmax;
66-
}
67-
68-
final float size = entry.getSize();
46+
final float size = e.getSize();
6947

7048
if (size > mMaxSize) {
7149
mMaxSize = size;

MPChartLib/src/main/java/com/github/mikephil/charting/data/CandleDataSet.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ public void calcMinMax() {
105105
if (mValues == null || mValues.isEmpty())
106106
return;
107107

108-
mYMax = Float.MIN_VALUE;
108+
mYMax = -Float.MAX_VALUE;
109109
mYMin = Float.MAX_VALUE;
110-
mXMax = Float.MIN_VALUE;
110+
mXMax = -Float.MAX_VALUE;
111111
mXMin = Float.MAX_VALUE;
112112

113113
for (CandleEntry e : mValues) {

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/BubbleChartRenderer.java

Lines changed: 19 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.github.mikephil.charting.animation.ChartAnimator;
99
import com.github.mikephil.charting.data.BubbleData;
1010
import com.github.mikephil.charting.data.BubbleEntry;
11-
import com.github.mikephil.charting.data.DataSet;
1211
import com.github.mikephil.charting.highlight.Highlight;
1312
import com.github.mikephil.charting.interfaces.dataprovider.BubbleDataProvider;
1413
import com.github.mikephil.charting.interfaces.datasets.IBubbleDataSet;
@@ -22,7 +21,7 @@
2221
* Bubble chart implementation: Copyright 2015 Pierre-Marc Airoldi Licensed
2322
* under Apache License 2.0 Ported by Daniel Cohen Gindi
2423
*/
25-
public class BubbleChartRenderer extends DataRenderer {
24+
public class BubbleChartRenderer extends BarLineScatterCandleBubbleRenderer {
2625

2726
protected BubbleDataProvider mChart;
2827

@@ -57,13 +56,9 @@ public void drawData(Canvas c) {
5756
private float[] sizeBuffer = new float[4];
5857
private float[] pointBuffer = new float[2];
5958

60-
protected float getShapeSize(float entrySize,
61-
float maxSize,
62-
float reference,
63-
boolean normalizeSize) {
64-
final float factor = normalizeSize
65-
? ((maxSize == 0f) ? 1f : (float) Math.sqrt(entrySize / maxSize))
66-
: entrySize;
59+
protected float getShapeSize(float entrySize, float maxSize, float reference, boolean normalizeSize) {
60+
final float factor = normalizeSize ? ((maxSize == 0f) ? 1f : (float) Math.sqrt(entrySize / maxSize)) :
61+
entrySize;
6762
final float shapeSize = reference * factor;
6863
return shapeSize;
6964
}
@@ -72,17 +67,9 @@ protected void drawDataSet(Canvas c, IBubbleDataSet dataSet) {
7267

7368
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
7469

75-
float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));
7670
float phaseY = mAnimator.getPhaseY();
7771

78-
float low = mChart.getLowestVisibleX();
79-
float high = mChart.getHighestVisibleX();
80-
81-
BubbleEntry entryFrom = dataSet.getEntryForXPos(low, DataSet.Rounding.DOWN);
82-
BubbleEntry entryTo = dataSet.getEntryForXPos(high, DataSet.Rounding.UP);
83-
84-
int minx = Math.max(dataSet.getEntryIndex(entryFrom), 0);
85-
int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, dataSet.getEntryCount());
72+
XBounds bounds = getXBounds(mChart, dataSet);
8673

8774
sizeBuffer[0] = 0f;
8875
sizeBuffer[2] = 1f;
@@ -96,12 +83,12 @@ protected void drawDataSet(Canvas c, IBubbleDataSet dataSet) {
9683
final float maxBubbleHeight = Math.abs(mViewPortHandler.contentBottom() - mViewPortHandler.contentTop());
9784
final float referenceSize = Math.min(maxBubbleHeight, maxBubbleWidth);
9885

99-
for (int j = minx; j < maxx; j++) {
86+
for (int j = bounds.min; j <= bounds.range + bounds.min; j++) {
10087

10188
final BubbleEntry entry = dataSet.getEntryForIndex(j);
10289

103-
pointBuffer[0] = (float) (entry.getX() - minx) * phaseX + (float) minx;
104-
pointBuffer[1] = (float) (entry.getY()) * phaseY;
90+
pointBuffer[0] = entry.getX();
91+
pointBuffer[1] = (entry.getY()) * phaseY;
10592
trans.pointValuesToPixel(pointBuffer);
10693

10794
float shapeHalf = getShapeSize(entry.getSize(), dataSet.getMaxSize(), referenceSize, normalizeSize) / 2f;
@@ -151,23 +138,16 @@ public void drawValues(Canvas c) {
151138
final float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));
152139
final float phaseY = mAnimator.getPhaseY();
153140

154-
float low = mChart.getLowestVisibleX();
155-
float high = mChart.getHighestVisibleX();
156-
157-
BubbleEntry entryFrom = dataSet.getEntryForXPos(low, DataSet.Rounding.DOWN);
158-
BubbleEntry entryTo = dataSet.getEntryForXPos(high, DataSet.Rounding.UP);
159-
160-
int minx = dataSet.getEntryIndex(entryFrom);
161-
int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, dataSet.getEntryCount());
141+
XBounds bounds = getXBounds(mChart, dataSet);
162142

163143
final float[] positions = mChart.getTransformer(dataSet.getAxisDependency())
164-
.generateTransformedValuesBubble(dataSet, phaseX, phaseY, minx, maxx);
144+
.generateTransformedValuesBubble(dataSet, phaseY, bounds.min, bounds.max);
165145

166146
final float alpha = phaseX == 1 ? phaseY : phaseX;
167147

168148
for (int j = 0; j < positions.length; j += 2) {
169149

170-
int valueTextColor = dataSet.getValueTextColor(j / 2 + minx);
150+
int valueTextColor = dataSet.getValueTextColor(j / 2 + bounds.min);
171151
valueTextColor = Color.argb(Math.round(255.f * alpha), Color.red(valueTextColor),
172152
Color.green(valueTextColor), Color.blue(valueTextColor));
173153

@@ -180,7 +160,7 @@ public void drawValues(Canvas c) {
180160
if ((!mViewPortHandler.isInBoundsLeft(x) || !mViewPortHandler.isInBoundsY(y)))
181161
continue;
182162

183-
BubbleEntry entry = dataSet.getEntryForIndex(j / 2 + minx);
163+
BubbleEntry entry = dataSet.getEntryForIndex(j / 2 + bounds.min);
184164

185165
drawValue(c, dataSet.getValueFormatter(), entry.getSize(), entry, i, x,
186166
y + (0.5f * lineHeight), valueTextColor);
@@ -200,7 +180,6 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
200180

201181
BubbleData bubbleData = mChart.getBubbleData();
202182

203-
float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));
204183
float phaseY = mAnimator.getPhaseY();
205184

206185
for (Highlight high : indices) {
@@ -213,27 +192,19 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
213192
: (high.getDataSetIndex() + 1);
214193
if (maxDataSetIndex - minDataSetIndex < 1) continue;
215194

216-
for (int dataSetIndex = minDataSetIndex;
217-
dataSetIndex < maxDataSetIndex;
218-
dataSetIndex++) {
195+
for (int dataSetIndex = minDataSetIndex; dataSetIndex < maxDataSetIndex; dataSetIndex++) {
219196

220197
IBubbleDataSet dataSet = bubbleData.getDataSetByIndex(dataSetIndex);
221198

222199
if (dataSet == null || !dataSet.isHighlightEnabled())
223200
continue;
224201

225202
final BubbleEntry entry = (BubbleEntry) bubbleData.getEntryForHighlight(high);
226-
if (entry == null || entry.getX() != high.getX())
227-
continue;
228-
229-
float low = mChart.getLowestVisibleX();
230-
float highX = mChart.getHighestVisibleX();
231203

232-
BubbleEntry entryFrom = dataSet.getEntryForXPos(low, DataSet.Rounding.DOWN);
233-
BubbleEntry entryTo = dataSet.getEntryForXPos(highX, DataSet.Rounding.UP);
204+
if (entry == null)
205+
continue;
234206

235-
int minx = dataSet.getEntryIndex(entryFrom);
236-
int maxx = Math.min(dataSet.getEntryIndex(entryTo) + 1, dataSet.getEntryCount());
207+
XBounds bounds = getXBounds(mChart, dataSet);
237208

238209
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
239210

@@ -250,8 +221,8 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
250221
mViewPortHandler.contentBottom() - mViewPortHandler.contentTop());
251222
final float referenceSize = Math.min(maxBubbleHeight, maxBubbleWidth);
252223

253-
pointBuffer[0] = (float) (entry.getX() - minx) * phaseX + (float) minx;
254-
pointBuffer[1] = (float) (entry.getY()) * phaseY;
224+
pointBuffer[0] = entry.getX();
225+
pointBuffer[1] = (entry.getY()) * phaseY;
255226
trans.pointValuesToPixel(pointBuffer);
256227

257228
float shapeHalf = getShapeSize(entry.getSize(),
@@ -269,7 +240,7 @@ public void drawHighlighted(Canvas c, Highlight[] indices) {
269240
if (!mViewPortHandler.isInBoundsRight(pointBuffer[0] - shapeHalf))
270241
break;
271242

272-
if (high.getX() < minx || high.getX() >= maxx)
243+
if (high.getX() < bounds.min || high.getX() > bounds.max)
273244
continue;
274245

275246
final int originalColor = dataSet.getColor((int) entry.getX());

MPChartLib/src/main/java/com/github/mikephil/charting/renderer/LineChartRenderer.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@
99

1010
import com.github.mikephil.charting.animation.ChartAnimator;
1111
import com.github.mikephil.charting.charts.LineChart;
12-
import com.github.mikephil.charting.data.DataSet;
1312
import com.github.mikephil.charting.data.Entry;
1413
import com.github.mikephil.charting.data.LineData;
1514
import com.github.mikephil.charting.data.LineDataSet;
1615
import com.github.mikephil.charting.highlight.Highlight;
1716
import com.github.mikephil.charting.interfaces.dataprovider.LineDataProvider;
18-
import com.github.mikephil.charting.interfaces.datasets.IBarLineScatterCandleBubbleDataSet;
1917
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
2018
import com.github.mikephil.charting.utils.ColorTemplate;
2119
import com.github.mikephil.charting.utils.PointD;

MPChartLib/src/main/java/com/github/mikephil/charting/utils/Transformer.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,7 @@ public float[] generateTransformedValuesScatter(IScatterDataSet data,
129129
* @param data
130130
* @return
131131
*/
132-
public float[] generateTransformedValuesBubble(IBubbleDataSet data,
133-
float phaseX, float phaseY, int from, int to) {
132+
public float[] generateTransformedValuesBubble(IBubbleDataSet data, float phaseY, int from, int to) {
134133

135134
final int count = (int) Math.ceil(to - from) * 2; // (int) Math.ceil((to - from) * phaseX) * 2;
136135

@@ -141,7 +140,7 @@ public float[] generateTransformedValuesBubble(IBubbleDataSet data,
141140
Entry e = data.getEntryForIndex(j / 2 + from);
142141

143142
if (e != null) {
144-
valuePoints[j] = (float) (e.getX() - from) * phaseX + from;
143+
valuePoints[j] = e.getX();
145144
valuePoints[j + 1] = e.getY() * phaseY;
146145
}
147146
}

0 commit comments

Comments
 (0)