我正在使用MpAndroidChart
来表示图表。我想将条形图和折线图组合在一起。我指的是MpAndroidChart示例的// EXTRACT URLS
$regex = '/(https?\:\/\/|www)[^(\"|\\\) ]+/i';
$urls = array();
for ($i = 0; $i < count($column7); ++$i) {
preg_match_all($regex, $column7[$i], $matches[$i]);
$urls = array_merge($urls, $matches[$i][0]);
}
// EXTRACT DOMAINS
$regex = '/(https?\:\/\/|www)[^\/ ]+/i';
$domains = array();
for ($i = 0; $i < count($urls); ++$i) {
preg_match_all($regex, $urls[$i], $matches[$i]);
$domains = array_merge($domains, $matches[$i][0]);
}
。我无法删除堆栈栏。如何删除它?
以下是条形图数据:
CombinedBarChart Activity
如果我删除堆栈,我只得到一个吧。
答案 0 :(得分:1)
问题在于您创建数据的位置,您总是设置条目的第一个元素,因此只会为&#34; Bar 1&#34;生成一个列。数据。添加数据时需要增加x索引。
for (int index = 0; index < itemcount; index++) {
entries1.add(new BarEntry(index, getRandom(25, 25)));
}
另请注意,我不确定您的getRandom实际上在做什么,但看起来它产生的是25和25之间的随机值。 25.我不确定这是不是意图。
答案 1 :(得分:0)
请你试试这个。
public class BarChartActivity extends DemoBase implements OnSeekBarChangeListener,
OnChartValueSelectedListener {
protected CombinedChart mChart;
private SeekBar mSeekBarX, mSeekBarY;
private TextView tvX, tvY;
private int[] COLOR = {
ColorTemplate.rgb("#F8F8F8"), ColorTemplate.rgb("#FFFFFF")
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_barchart);
tvX = (TextView) findViewById(R.id.tvXMax);
tvY = (TextView) findViewById(R.id.tvYMax);
mSeekBarX = (SeekBar) findViewById(R.id.seekBar1);
mSeekBarY = (SeekBar) findViewById(R.id.seekBar2);
mChart = (CombinedChart) findViewById(R.id.chart1);
mChart.setOnChartValueSelectedListener(this);
mChart.setDrawBarShadow(false);
mChart.setDrawValueAboveBar(true);
mChart.setDescription("");
// if more than 60 entries are displayed in the chart, no values will be
// drawn
mChart.setMaxVisibleValueCount(60);
// scaling can now only be done on x- and y-axis separately
mChart.setPinchZoom(false);
mChart.setDrawGridBackground(false);
// mChart.setDrawYLabels(false);
IAxisValueFormatter xAxisFormatter = new DayAxisValueFormatter(mChart);
XAxis xAxis = mChart.getXAxis();
xAxis.setPosition(XAxisPosition.BOTTOM_INSIDE);
xAxis.setTypeface(mTfLight);
xAxis.setDrawGridLines(false);
xAxis.setGranularity(1f); // only intervals of 1 day
xAxis.setLabelCount(7);
xAxis.setValueFormatter(xAxisFormatter);
IAxisValueFormatter custom = new MyAxisValueFormatter();
YAxis leftAxis = mChart.getAxisLeft();
leftAxis.setTypeface(mTfLight);
leftAxis.setLabelCount(8, false);
leftAxis.setValueFormatter(custom);
leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
leftAxis.setSpaceTop(15f);
leftAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
YAxis rightAxis = mChart.getAxisRight();
rightAxis.setDrawGridLines(false);
rightAxis.setTypeface(mTfLight);
rightAxis.setLabelCount(8, false);
rightAxis.setValueFormatter(custom);
rightAxis.setSpaceTop(15f);
rightAxis.setAxisMinimum(0f); // this replaces setStartAtZero(true)
Legend l = mChart.getLegend();
l.setPosition(LegendPosition.BELOW_CHART_LEFT);
l.setForm(LegendForm.SQUARE);
l.setFormSize(9f);
l.setTextSize(11f);
l.setXEntrySpace(4f);
// l.setExtra(ColorTemplate.VORDIPLOM_COLORS, new String[] { "abc",
// "def", "ghj", "ikl", "mno" });
// l.setCustom(ColorTemplate.VORDIPLOM_COLORS, new String[] { "abc",
// "def", "ghj", "ikl", "mno" });
XYMarkerView mv = new XYMarkerView(this, xAxisFormatter);
mv.setChartView(mChart); // For bounds control
mChart.setMarker(mv); // Set the marker to the chart
setData(20, 50);
// setting data
mSeekBarY.setProgress(50);
mSeekBarX.setProgress(12);
mSeekBarY.setOnSeekBarChangeListener(this);
mSeekBarX.setOnSeekBarChangeListener(this);
// mChart.setDrawLegend(false);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.bar, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.actionToggleValues: {
for (IDataSet set : mChart.getData().getDataSets())
set.setDrawValues(!set.isDrawValuesEnabled());
mChart.invalidate();
break;
}
case R.id.actionToggleHighlight: {
if (mChart.getData() != null) {
mChart.getData().setHighlightEnabled(!mChart.getData().isHighlightEnabled());
mChart.invalidate();
}
break;
}
case R.id.actionTogglePinch: {
if (mChart.isPinchZoomEnabled())
mChart.setPinchZoom(false);
else
mChart.setPinchZoom(true);
mChart.invalidate();
break;
}
case R.id.actionToggleAutoScaleMinMax: {
mChart.setAutoScaleMinMaxEnabled(!mChart.isAutoScaleMinMaxEnabled());
mChart.notifyDataSetChanged();
break;
}
case R.id.actionToggleBarBorders: {
/*for (IBarDataSet set : mChart.getData().getDataSets())
((BarDataSet) set).setBarBorderWidth(set.getBarBorderWidth() == 1.f ? 0.f : 1.f);*/
mChart.invalidate();
break;
}
case R.id.animateX: {
mChart.animateX(3000);
break;
}
case R.id.animateY: {
mChart.animateY(3000);
break;
}
case R.id.animateXY: {
mChart.animateXY(3000, 3000);
break;
}
case R.id.actionSave: {
if (mChart.saveToGallery("title" + System.currentTimeMillis(), 50)) {
Toast.makeText(getApplicationContext(), "Saving SUCCESSFUL!",
Toast.LENGTH_SHORT).show();
} else
Toast.makeText(getApplicationContext(), "Saving FAILED!", Toast.LENGTH_SHORT)
.show();
break;
}
}
return true;
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tvX.setText("" + (mSeekBarX.getProgress() + 2));
tvY.setText("" + (mSeekBarY.getProgress()));
setData(mSeekBarX.getProgress() + 1, mSeekBarY.getProgress());
mChart.invalidate();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
private void setData(int count, float range) {
float start = 0f;
mChart.getXAxis().setAxisMinimum(start);
mChart.getXAxis().setAxisMaximum(start + count + 2);
ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();
ArrayList<Entry> entries = new ArrayList<Entry>();
int size = (int)(start + count + 1);
int[] COLOR_LINE = new int[size];
for (int i = (int) start; i < 10; i++) {
yVals1.add(new BarEntry(i + 1f, 300));
}
for (int i = (int) start; i < 5; i++) {
float mult = (range + 1);
float val = getRandom(90, 50); //float val = (float) (Math.random() * mult);
entries.add(new Entry(i + 1f, val));
COLOR_LINE[i] = (val < 70 ? Color.RED : Color.rgb(115, 180, 236));
}
LineData d = new LineData();
LineDataSet set = new LineDataSet(entries, "Line DataSet");
set.setColors(COLOR_LINE);
set.setLineWidth(1f);
set.setCircleColor(Color.rgb(240, 238, 70));
set.setCircleRadius(5f);
set.setFillColor(Color.rgb(240, 238, 70));
set.setMode(LineDataSet.Mode.LINEAR);
set.setDrawValues(true);
set.setValueTextSize(10f);
set.setValueTextColor(Color.rgb(115, 180, 236));
set.setAxisDependency(YAxis.AxisDependency.LEFT);
d.addDataSet(set);
BarDataSet set1;
if (mChart.getData() != null &&
mChart.getData().getDataSetCount() > 0) {
set1 = (BarDataSet) mChart.getData().getDataSetByIndex(0);
set1.setValues(yVals1);
mChart.getData().notifyDataChanged();
mChart.notifyDataSetChanged();
} else {
set1 = new BarDataSet(yVals1, "The year 2017");
set1.setColors(COLOR);
ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
dataSets.add(set1);
BarData data = new BarData(dataSets);
data.setValueTextSize(10f);
data.setValueTypeface(mTfLight);
data.setBarWidth(0.9f);
data.setBarWidth(1f);
//mChart.setData(data);
CombinedData combinedData = new CombinedData();
combinedData.setData(data);
combinedData.setData(d);
combinedData.setValueTypeface(mTfLight);
mChart.setData(combinedData);
mChart.setScaleMinima((float) (data.getXMax() + 0.25f)/10f, 1f);
for (IDataSet set11 : mChart.getData().getDataSets()) {
if (set11 instanceof BarDataSet)
set11.setDrawValues(!set11.isDrawValuesEnabled());
}
mChart.invalidate();
}
}
protected RectF mOnValueSelectedRectF = new RectF();
@SuppressLint("NewApi")
@Override
public void onValueSelected(Entry e, Highlight h) {
if (e == null)
return;
RectF bounds = mOnValueSelectedRectF;
//mChart.getBarBounds((BarEntry) e, bounds);
MPPointF position = mChart.getPosition(e, AxisDependency.LEFT);
Log.i("bounds", bounds.toString());
Log.i("position", position.toString());
Log.i("x-index",
"low: " + mChart.getLowestVisibleX() + ", high: "
+ mChart.getHighestVisibleX());
MPPointF.recycleInstance(position);
}
@Override
public void onNothingSelected() {
}
}