2015-11-21 2 views
0

Я использую CombinedChart из MpAndroidChart, чтобы построить диаграмму, которая может содержать несколько строк и одну строку (например, это изображение).MpAndroidChart - CombinedChart с несколькими LineChart и одним BarChart

enter image description here

Однако CombinedChart просто нарисовать один Linechart.

List<LineData> myLines = populateMyLines(); 
CombinedData dataChart = new CombinedData(values); 

for(LineData line: myLines) { 
     dataChart.setData(line); 
} 
dataChart.setData(new BarData(barValues)); 
chart.setData(dataChart); 
+0

Вы уверены, что ваши другие наборы данных содержат данные? Вы перекрестно проверили свой код с комбинированным кодом на примере проекта? –

+0

@PhilippJahoda Я добавляю data.setData (generateLineData2()); (который имеет разные значения) к примеру кода из проекта библиотеки, и он рисует только одну строку – rguerra

+0

@PhilippJahoda, она добавляет правильные метки (Line DataSet, набор данных Bar и набор linedata 2). Но просто нарисуйте последнюю строку. И до того, как я установил данные диаграммы, у меня есть 2 LineData и 1 BarChar в моей комбинированной дате – rguerra

ответ

1

РЕШЕНИЕ:

LineData linesData = new LineData(); 
    for(LineData dataSet: dataSets) { 
     linesData.addDataSet(dataSet.getDataSetByIndex(0)); 
    } 
dataChart.setData(linesData); 
dataChart.setData(generateBarData()); 

См. Ниже пример кода, измененного из примера CombinedChart,

public class CombinedChartActivity extends DemoBase implements OnChartValueSelectedListener { 

    private CombinedChart mChart; 
    private final int itemcount = 12; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.activity_combined); 

     mChart = (CombinedChart) findViewById(R.id.chart1); 
     mChart.setDescription(""); 
     mChart.setBackgroundColor(Color.BLACK); 
     mChart.setDrawGridBackground(false); 
     mChart.setDrawBarShadow(false); 

     // draw bars behind lines 
     mChart.setDrawOrder(new DrawOrder[]{ 
       DrawOrder.BAR, DrawOrder.LINE 
     }); 
     mChart.setOnChartValueSelectedListener(this); 
     YAxis rightAxis = mChart.getAxisRight(); 
     rightAxis.setDrawGridLines(false); 

     YAxis leftAxis = mChart.getAxisLeft(); 
     leftAxis.setDrawGridLines(false); 

     XAxis xAxis = mChart.getXAxis(); 
     xAxis.setPosition(XAxisPosition.BOTH_SIDED); 

     CombinedData data = new CombinedData(mMonths); 
     // data.setData(generateCandleData()); 

     LineData mlineData=generateLineData(); 
     mlineData.addDataSet(generateLineData1().getDataSetByIndex(0)); 

     data.setData(mlineData); 





     data.setData(generateBarData()); 
//  data.setData(generateBubbleData()); 
//   data.setData(generateScatterData()); 
//   data.setData(generateCandleData()); 

     mChart.setData(data); 
     mChart.invalidate(); 
    } 

    private LineData generateLineData() { 

     LineData d = new LineData(); 

     ArrayList<Entry> entries = new ArrayList<Entry>(); 

     for (int index = 0; index < itemcount; index++) 
      entries.add(new Entry(getRandom(50, 40), index)); 

     LineDataSet set = new LineDataSet(entries, "Line DataSet"); 
     set.setColor(Color.BLUE); 
     set.setLineWidth(3.5f); 
     set.setCircleColor(Color.rgb(240, 238, 70)); 
     set.setCircleSize(5f); 
     // set.setFillColor(Color.rgb(240, 238, 70)); 
     set.setDrawCubic(true); 
     set.setDrawValues(true); 
     set.setValueTextSize(10f); 
     set.setValueTextColor(Color.rgb(240, 238, 70)); 
     set.setHighLightColor(Color.MAGENTA); 
     set.setAxisDependency(YAxis.AxisDependency.LEFT); 

     d.addDataSet(set); 

     return d; 
    } 

    private LineData generateLineData1() { 

     LineData d = new LineData(); 

     ArrayList<Entry> entries = new ArrayList<Entry>(); 

     for (int index = 3; index < itemcount; index++) 
      entries.add(new Entry(getRandom(10, 40), index)); 

     LineDataSet set = new LineDataSet(entries, "Line DataSet"); 
     set.setColor(Color.RED); 
     set.setLineWidth(3.5f); 
     set.setCircleColor(Color.rgb(240, 238, 70)); 
     set.setCircleSize(5f); 
     // set.setFillColor(Color.rgb(240, 238, 70)); 
     set.setDrawCubic(true); 
     set.setDrawValues(true); 
     set.setValueTextSize(10f); 
     set.setValueTextColor(Color.rgb(240, 238, 70)); 
     set.setHighLightColor(Color.MAGENTA); 
     set.setAxisDependency(YAxis.AxisDependency.LEFT); 

     d.addDataSet(set); 

     return d; 
    } 



    private BarData generateBarData() { 

     BarData d = new BarData(); 

     ArrayList<BarEntry> entries = new ArrayList<BarEntry>(); 

     for (int index = 0; index < itemcount; index++) 
      entries.add(new BarEntry(getRandom(15, 30), index)); 

     BarDataSet set = new BarDataSet(entries, "Bar DataSet"); 
     set.setColor(Color.rgb(60, 220, 78)); 
     set.setValueTextColor(Color.rgb(60, 220, 78)); 
     set.setValueTextSize(10f); 
     set.setHighLightColor(Color.RED); 
     d.addDataSet(set); 

     set.setAxisDependency(YAxis.AxisDependency.LEFT); 

     return d; 
    } 

    protected ScatterData generateScatterData() { 

     ScatterData d = new ScatterData(); 

     ArrayList<Entry> entries = new ArrayList<Entry>(); 

     for (int index = 0; index < itemcount; index++) 
      entries.add(new Entry(getRandom(20, 15), index)); 

     ScatterDataSet set = new ScatterDataSet(entries, "Scatter DataSet"); 
     set.setColor(Color.GREEN); 
     set.setScatterShapeSize(7.5f); 
     set.setDrawValues(false); 
     set.setValueTextSize(10f); 
     d.addDataSet(set); 

     return d; 
    } 

    protected CandleData generateCandleData() { 

     CandleData d = new CandleData(); 

     ArrayList<CandleEntry> entries = new ArrayList<CandleEntry>(); 

     for (int index = 0; index < itemcount; index++) 
      entries.add(new CandleEntry(index, 20f, 10f, 13f, 17f)); 

     CandleDataSet set = new CandleDataSet(entries, "Candle DataSet"); 
     set.setColor(Color.rgb(80, 80, 80)); 
     set.setBodySpace(0.3f); 
     set.setValueTextSize(10f); 
     set.setDrawValues(false); 
     d.addDataSet(set); 

     return d; 
    } 

    protected BubbleData generateBubbleData() { 

     BubbleData bd = new BubbleData(); 

     ArrayList<BubbleEntry> entries = new ArrayList<BubbleEntry>(); 

     for (int index = 0; index < itemcount; index++) { 
      float rnd = getRandom(20, 30); 
      entries.add(new BubbleEntry(index, rnd, rnd)); 
     } 

     BubbleDataSet set = new BubbleDataSet(entries, "Bubble DataSet"); 
     set.setColors(ColorTemplate.VORDIPLOM_COLORS); 
     set.setValueTextSize(10f); 
     set.setValueTextColor(Color.WHITE); 
     set.setHighlightCircleWidth(1.5f); 
     set.setDrawValues(true); 
     bd.addDataSet(set); 

     return bd; 
    } 

    private float getRandom(float range, float startsfrom) { 
     return (float) (Math.random() * range) + startsfrom; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.combined, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.actionToggleLineValues: { 
       for (DataSet<?> set : mChart.getData().getDataSets()) { 
        if (set instanceof LineDataSet) 
         set.setDrawValues(!set.isDrawValuesEnabled()); 
       } 

       mChart.invalidate(); 
       break; 
      } 
      case R.id.actionToggleBarValues: { 
       for (DataSet<?> set : mChart.getData().getDataSets()) { 
        if (set instanceof BarDataSet) 
         set.setDrawValues(!set.isDrawValuesEnabled()); 
       } 

       mChart.invalidate(); 
       break; 
      } 
     } 
     return true; 
    } 

    @Override 
    public void onValueSelected(Entry e, int dataSetIndex, Highlight h) { 




    } 

    @Override 
    public void onNothingSelected() { 

    } 

} 

enter image description here

+0

Благодарим вас за обходной путь @TSG. Это проблема, уже созданная в lib https://github.com/PhilJay/MPAndroidChart/issues/1216 – rguerra

0

Я предлагаю вам, возможно, попробовать с одиночной линетой и добавить различные линейные наборы данных, если необходимо. У меня были проблемы с теми же проблемами, когда я пытаюсь использовать две разные linedata, т.е. linedata1 с SetA, linedata2 с помощью SetB, пока я не разрешу его с помощью одиночной linedata, имеющей два или более набора данных.

CombinedData data = new CombinedData(Xvals); 
     // data.setData(generateCandleData()); 
LineData d = new LineData(); 
d.addDataSet(setA); 
d.addDataSet(setB) 
     data.setData(LineData()); 
     data.setData(BarData()); 

Combinedchart в настоящее время управляет один единый набор XVal, пожалуйста, будьте осторожны, чтобы закодировать правильную ссылку индекса XVal в Xval, YVal ввода пары

+0

?. Таким образом, вы заполняете dataSet 'd'. И тогда вы ничего не делаете с d-набором данных? – rguerra

+0

Не совсем, приведенный выше фрагмент кода предназначен только для справки, оба набора данных A & B имеют записи в строке, индекс xval как-то отличается, первые Xvals для Set A могут начинаться с 10, а Set B Xval - быть любых переменных. В настоящий момент координата X довольно ограничена, разрешен только один набор, это создает экземпляр во время создания комбинированного графика. – TSG

+0

Хорошо, я понимаю, что вы имели в виду, эта ссылка должна быть d.addDataSet (setA); d.addDataSet (setB) data.setData (d); просто добавьте LineData с двумя разными наборами записей и следуйте по BarData data.setData (BarData()); это должно привести к тому, что на комбинированной диаграмме будут показаны два объекта линии. – TSG

Смежные вопросы