728x90

JSON 데이터 포멧으로 Web URL 데이터를 받아서 PHP 배열로 변환하여 파싱하는 방법이다.


<?php
$url = "http://100.10.10.10/chart/data.json";
$data = file_get_contents_curl($url);

//echo $data.'<br />';

$R = json_decode($data,TRUE);// JSON 데이터를 배열로 변환

foreach($R['content'] as $val) {
    echo $val['sysdate'] . ' | ' . $val['mcount'] . "<br />";
}

function file_get_contents_curl($url) {
    $ch = curl_init();// curl 리소스를 초기화
    curl_setopt($ch, CURLOPT_URL, $url); // url을 설정
    // 헤더는 제외하고 content 만 받음
    curl_setopt($ch, CURLOPT_HEADER, 0);
    // 응답 값을 브라우저에 표시하지 말고 값을 리턴
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    curl_close($ch);// 리소스 해제를 위해 세션 연결 닫음
    return $data;
}

?>
 


블로그 이미지

Link2Me

,
728x90

MPAndroidChart 라이브러리를 활용한 PieChart 함수 예제다.

라이브러리 추가하는 사항은 http://link2me.tistory.com/1576 게시글을 참조하라.

 <com.github.mikephil.charting.charts.PieChart
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/chart" />

 private void PieChartGraph(ArrayList<String> labelList, ArrayList<Integer> valList) {
    // PieChart 메소드
    PieChart pieChart = (PieChart) findViewById(R.id.chart);

    ArrayList<Entry> entries = new ArrayList<>();
    for(int i=0; i < valList.size();i++){
        entries.add(new Entry((Integer) valList.get(i), i));
    }

    PieDataSet depenses = new PieDataSet (entries, "월별 가입자수");
    depenses.setAxisDependency(YAxis.AxisDependency.LEFT);

    ArrayList<String> labels = new ArrayList<String>();
    for(int i=0; i < labelList.size(); i++){
        labels.add((String) labelList.get(i));
    }

    PieData data = new PieData(labels,depenses); // 라이브러리 v3.x 사용하면 에러 발생함
    depenses.setColors(ColorTemplate.COLORFUL_COLORS); //

    pieChart.setData(data);
    pieChart.animateXY(1000,1000);
    pieChart.invalidate();
}




블로그 이미지

Link2Me

,
728x90

MPAndroidChart 라이브러리를 활용한 BarChart 함수를 만들었다.

라이브러리 추가하는 사항은 http://link2me.tistory.com/1576 게시글을 참조하라.


 <com.github.mikephil.charting.charts.BarChart
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/barchart" />

private void BarChartGraph(ArrayList<String> labelList, ArrayList<Integer> valList) {
    // BarChart 메소드
    BarChart barChart = (BarChart) findViewById(R.id.barchart);

    ArrayList<BarEntry> entries = new ArrayList<>();
    for(int i=0; i < valList.size();i++){
        entries.add(new BarEntry((Integer) valList.get(i), i));
    }

    BarDataSet depenses = new BarDataSet (entries, "전국 가입자수"); // 변수로 받아서 넣어줘도 됨
    depenses.setAxisDependency(YAxis.AxisDependency.LEFT);

    ArrayList<String> labels = new ArrayList<String>();
    for(int i=0; i < labelList.size(); i++){
        labels.add((String) labelList.get(i));
    }

    BarData data = new BarData(labels,depenses); // 라이브러리 v3.x 사용하면 에러 발생함
    depenses.setColors(ColorTemplate.COLORFUL_COLORS); //

    barChart.setData(data);
    barChart.animateXY(1000,1000);
    barChart.invalidate();
}


블로그 이미지

Link2Me

,
728x90

MPAndroidChart 라이브러리를 이용하여 그래프 그리는 걸 테스트하고 있다.

최신버전 라이브러리를 사용하면 X축에 값을 직접 지정하는 걸 구현하기가 쉽지 않은거 같다.

그래서 라이브러리 버전을 낮은 걸 찾아서 추가했더니 에러가 발생하지 않고 그래프가 잘 그려진다.


1. build.gradle

apply plugin: 'com.android.application'


android {

    compileSdkVersion 27


    defaultConfig {

        applicationId "com.tistory.android.mpchart"

        minSdkVersion 15

        targetSdkVersion 27

        versionCode 1

        versionName "1.0"


        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"


    }


    repositories {

        maven { url "https://jitpack.io" }

    }


    buildTypes {

        release {

            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }

    }


}


dependencies {

    implementation fileTree(dir: 'libs', include: ['*.jar'])


    implementation 'com.android.support:appcompat-v7:27.1.1'

    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    implementation 'com.android.support:support-v4:27.1.1'

    implementation 'com.android.support:recyclerview-v7:27.1.1' // ListView 개선 버전

    implementation 'com.android.support:cardview-v7:27.1.1'

    implementation 'com.android.support:design:27.1.1'

    implementation 'gun0912.ted:tedpermission:2.0.0'

    implementation 'com.android.volley:volley:1.1.0'

    implementation 'com.github.bumptech.glide:glide:3.8.0' // 이미지 라이브러리

    //implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0-alpha' // 차트 라이브러리

    implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4'

} 


activity_graphview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">


       <com.github.mikephil.charting.charts.LineChart

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:id="@+id/chart" />


</LinearLayout> 


3. java 코드

package com.tistory.android.mpchart;


import android.content.Context;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.TextView;


import com.android.volley.Request;

import com.android.volley.RequestQueue;

import com.android.volley.Response;

import com.android.volley.VolleyError;

import com.android.volley.toolbox.StringRequest;

import com.android.volley.toolbox.Volley;

import com.github.mikephil.charting.charts.LineChart;

import com.github.mikephil.charting.components.YAxis;

import com.github.mikephil.charting.data.Entry;

import com.github.mikephil.charting.data.LineData;

import com.github.mikephil.charting.data.LineDataSet;

import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

import com.github.mikephil.charting.utils.ColorTemplate;


import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;


import java.util.ArrayList;


public class graphView extends AppCompatActivity implements View.OnClickListener {

    Context context;

    ArrayList<Integer> jsonList = new ArrayList<>(); // ArrayList 선언

    ArrayList<String> labelList = new ArrayList<>(); // ArrayList 선언


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_graphview);

        context = this.getBaseContext();

        initView();

    }



    private void initView() {

        // button action...

        findViewById(R.id.back_btn).setOnClickListener(this);

        findViewById(R.id.home_btn).setOnClickListener(this);


        // title set

        TextView title = (TextView) this.findViewById(R.id.navibar_text); // title

        //title.setText(getIntent().getExtras().getString("title"));

        title.setText("그래프");


        DataVolley();

    }


    private void DataVolley() {

        // 1. RequestQueue 생성 및 초기화

        RequestQueue requestQueue = Volley.newRequestQueue(context);


        String url = "http://100.10.10.10/chart/data.json";


        // 2. Request Obejct인 StringRequest 생성

        StringRequest request = new StringRequest(Request.Method.GET, url,

                new Response.Listener<String>() {

                    @Override

                    public void onResponse(String response) {

                        //Log.d("result", "[" + response + "]");

                        showJSONList(response);

                    }

                },

                new Response.ErrorListener() {

                    @Override

                    public void onErrorResponse(VolleyError error) {

                        Log.d("error", "[" + error.getMessage() + "]");

                    }

                }) {


        };


        // 3) 생성한 StringRequest를 RequestQueue에 추가

        requestQueue.add(request);

    }


    private void showJSONList(String JSONdata) {

        labelList.clear();

        jsonList.clear();


        try { // 파싱처리 부분은 json 파일 포멧에 맞게 설정해야 한다.

            JSONObject jsonObj = new JSONObject(JSONdata);

            JSONArray jsonArray = jsonObj.getJSONArray("content");

            for (int i = 0; i < jsonArray.length(); i++) {

                JSONObject c = jsonArray.getJSONObject(i);

                final String Sdate = c.getString("sysdate");

                final String Mdata = c.getString("mcount");

                System.out.println(i + " mcount : " + Mdata);

                labelList.add(DateChange(Sdate));

                jsonList.add(Integer.parseInt(Mdata));

            }


        } catch (JSONException e) {

            e.printStackTrace();

        }


        LineChartGraph(labelList, jsonList);

    }


    private void LineChartGraph(ArrayList labelList, ArrayList valList){

        // LineChart 메소드

        LineChart lineChart = (LineChart) findViewById(R.id.chart);


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

        for(int i=0; i < valList.size();i++){

            entries.add(new Entry((Integer) valList.get(i), i));

        }


        LineDataSet depenses = new LineDataSet(entries, "# of Calls");

        depenses.setAxisDependency(YAxis.AxisDependency.LEFT);


        ArrayList<String> labels = new ArrayList<String>();

        for(int i=0; i < labelList.size(); i++){

            labels.add((String) labelList.get(i));

        }


        ArrayList<ILineDataSet> dataSets = new ArrayList<>();

        dataSets.add((ILineDataSet)depenses);

        LineData data = new LineData(labels,dataSets); // 라이브러리 v3.x 사용하면 에러 발생함

        depenses.setColors(ColorTemplate.COLORFUL_COLORS); //

        //depenses.setDrawCubic(true); //선 둥글게 만들기

        //depenses.setDrawFilled(true); //그래프 밑부분 색칠


        lineChart.setData(data);

        lineChart.animateXY(1000,1000);

        lineChart.invalidate();

    }


    private String DateChange(String sysdate){

        String year = sysdate.split("-")[0];

        String month = sysdate.split("-")[1];

        String day = sysdate.split("-")[2];


        StringBuilder finalString = new StringBuilder();

        finalString.append(year.substring(2,4));

        finalString.append(".");

        finalString.append(month);

        //finalString.append(".");

        //finalString.append(day);

        return finalString.toString();

    }


    @Override

    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.back_btn:

                finish();

                overridePendingTransition(R.anim.rightin, R.anim.rightout);

                break;

            case R.id.home_btn:

                Intent intent = new Intent(graphView.this, MainActivity.class);

                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

                startActivity(intent);

                break;

            default:

                break;

        }

    }


} 


블로그 이미지

Link2Me

,