散点图日期为x轴 - 在X轴添加自定义标签 [英] scatter plot with dates at x axis -- add custom labels on X axis

查看:336
本文介绍了散点图日期为x轴 - 在X轴添加自定义标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想有一个散点图日期在x轴。

因为如果我用 ChartFactory.getTimeChartView 我收到线图,问题是:

我作出图解与当前的日期作为解释X轴和数据(用户输入)为y axis.I存储这些数据(日期和用户数据)以及在一个文件中。

,用户可以一个day.And期间输入多次数据的一些数据可以是相同的,所以 如果我使用一个Linegraph情节弄乱up.That就是为什么我需要分散。

1)我怎样才能做到这一点?

2)此外,有人可以点我在X轴上添加自定义标签,以使用Linegraph的例子吗?

----------------------更新------------------------ --------

我想现在这样做的权利(我想知道,如果这是可以做到的,我的问题上面,虽然

我存储日期为列出字符串:

 名单,其中,字符串> dates_asString =新的ArrayList<字符串>();
 

我救他们:

 的SimpleDateFormat thedate =新的SimpleDateFormat(DD / MM / YYYY);
        日期D =新的日期();
字符串formattedDate = thedate.format(D);
        dates_asString.add(formattedDate);

 BufferedWriter将体重=新的BufferedWriter(新OutputStreamWriter(FOS));
              的for(int i = 0; I< mydata.size();我++){
                    bw.write(mydata.get(ⅰ)+,+ dates_asString.get(ⅰ)+\ñ); // +\ñ);
 

在LineGraph:

 私有静态列表<字符串> dates_asString =新的ArrayList<字符串>();
    私有静态列表<双>数据=新的ArrayList<双>();
    私有静态列表<日期> dates_asDates =新的ArrayList<日期>();


loadfunc();

//试图将dates_asString复制到dates_asDates以使用它们中的时间序列

 SimpleDateFormat的格式化=新的SimpleDateFormat(DD / MM / YYYY);
        日期convertedDate =新的日期();
        尝试{
       对于(INT K = 0; K< dates_asString.size(); k ++){
        convertedDate = formatter.parse(dates_asString.get(K));
        date_asDates.add(convertedDate);
       }
        }赶上(ParseException的E){

            // TODO自动生成的catch块
            e.printStackTrace();
        }

        时间序列系列=新的时间序列(显示数据);
        的for(int i = 0; I< date_asDates.size();我++){

            series.add(date_asDates.get(i)中,data.get(ⅰ));
        }


mRenderer.setXLabels(0);
        的for(int i = 0; I< dates_asString.size();我++){
            mRenderer.addXTextLabel(ⅰ,dates_asString.get(ⅰ));

        }

公共无效loadfunc(){

    SimpleDateFormat的thedate =新的SimpleDateFormat(DD / MM / YYYY);
    日期D =新的日期();

    字符串formattedDate = thedate.format(D);

的BufferedReader BR =新的BufferedReader(新的InputStreamReader(FIS));
            ....
                     data.add(Double.parseDouble(splitLine [0]));
                    dates_asString.add(formattedDate);
 

解决方案

正如他的回答告诉可以使用 renderer.addXTextLabel(X,文字); 来设置X轴标签

在你的情况::ü在注释行出错了, 你在哪里试图添加x轴标签的两倍。

更改如下所示

 时间序列系列=新的时间序列(显示数据);
    的for(int i = 0; I< date_asDates.size();我++){

        series.add(ⅰ,data.get(ⅰ)); //只能作为你所需要这种变化LL工作
    }
 

更新:更改您的code到下面它不会崩溃,在添加新数据的

和如果u只想指向可见不点linealong然后改变这个 ChartFactory.getLineChartIntent(getBaseContext(),数据集,mRenderer,DD / MM / YYYY); ChartFactory.getScatterChartIntent(getBaseContext(),数据集,mRenderer,DD / MM / YYYY);

MainActivity.java

 包com.example.trying;
进口java.io.BufferedWriter中;
进口的java.io.File; //进口增加都像以前一样过

公共类MainActivity扩展活动实现OnClickListener {


查看savebtn;
查看graphicsbtn;
的EditText值,权重;
字符串文件名=mydata.csv;
公共静态列表<字符串> dates_Strings =新的ArrayList<字符串>();
公共静态列表<双>数据=新的ArrayList<双>();
公共静态列表<日期>日期=新的ArrayList<日期>();

名单<双> MYDATA =新的ArrayList<双>();


@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);

     date.clear();
     data.clear();
     dates_Strings.clear();
     //设置点击监听器
    savebtn =(查看)findViewById(R.id.savebtn);
    savebtn.setOnClickListener(本);
    graphicsbtn =(查看)findViewById(R.id.graphicsbtn);
    graphicsbtn.setOnClickListener(本);

    值=(EditText上)findViewById(R.id.enter_data);


}


//一个按钮被点击时被称为
公共无效的onClick(视图v){
    开关(v.getId()){
    案例R.id.savebtn:
        savefunc();
        打破;
    案例R.id.graphicsbtn:
        意图I =新的意图(这一点,LineGraph.class);
        startActivity(ⅰ);
        打破;

}
}

公共无效savefunc(){

    SimpleDateFormat的thedate =新的SimpleDateFormat(DD / MM / YYYY);
    日期D =新的日期();

    字符串formattedDate = thedate.format(D);
    Log.d(标签,格式+ formattedDate);
    dates_Strings.add(formattedDate);




    尝试{
        双海图= Double.parseDouble(。value.getText()的toString()修剪());
        mydata.add(海图);
        Log.d(标签,海图+海图);
    }赶上(NumberFormatException异常E){
        字符串消息=对不起,你我以前不输入任何东西;

         吐司面包= Toast.makeText(getBaseContext(),消息,Toast.LENGTH_SHORT);
         toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,0,100);
         toast.show();
  // Toast.makeText(getBaseContext(),对不起你我以前不输入任何东西,Toast.LENGTH_SHORT).show();

    }


    文件SD卡= Environment.getExternalStorageDirectory();
    文件目录=新的文件(SD卡,MYFILES);
    directory.mkdirs();
    档案文件=新的文件(目录,文件名);

    FileOutputStream中FOS;

    //保存它们
    尝试 {
       FOS =新的FileOutputStream(文件);

          BufferedWriter将体重=新的BufferedWriter(新OutputStreamWriter(FOS));
          的for(int i = 0; I< mydata.size();我++){
                bw.write(mydata.get(ⅰ)+,+ dates_Strings.get(ⅰ)+\ñ);
          }
          value.setText();
          bw.flush();
          bw.close();

        }赶上(IOException异常E2){
           e2.printStackTrace();
            }//抓住
}

@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
    //充气菜单;这增加了项目操作栏,如果它是present。
    。getMenuInflater()膨胀(R.menu.main,菜单);
    返回true;
}

}
 

LineGraph.java

 包com.example.trying;

进口java.io.BufferedReader中;
进口的java.io.File; //添加所有其他进口

公共类LineGraph扩展MainActivity {

字符串文件名=mydata.csv;



私人的LinearLayout布局;
私人GraphicalView mChartView;

保护无效的onCreate(包savedInstanceState){

     super.onCreate(savedInstanceState);
     的setContentView(R.layout.graph);
     布局=(的LinearLayout)findViewById(R.id.chart);

    readfunc();

    //试图复制dates_asString到日期(日期),以使用它们中的时间序列
    SimpleDateFormat的格式化=新的SimpleDateFormat(DD / MM / YYYY);
    日期convertedDate; // =新的日期();
    尝试{
   对于(INT K = 0; K< dates_Strings.size(); k ++){
    convertedDate = formatter.parse(dates_Strings.get(K));
    date.add(convertedDate);
    Log.d(线,convertedDate:+ convertedDate);
   }
    }赶上(ParseException的E){

        // TODO自动生成的catch块
        e.printStackTrace();
    }


    时间序列系列=新的时间序列(显示数据);
    的for(int i = 0; I< dates_Strings.size();我++){
        series.add(ⅰ,data.get(ⅰ)); //series.add(date.get(i),data.get(i));
    }


    XYMultipleSeriesDataset数据集=新XYMultipleSeriesDataset();
    dataset.addSeries(系列);


    //渲染器衰减
    XYSeriesRenderer渲染器=新XYSeriesRenderer();
    renderer.setColor(Color.YELLOW);
    renderer.setLineWidth(3);
    renderer.setPointStyle(PointStyle.SQUARE);


    XYMultipleSeriesRenderer mRenderer =新XYMultipleSeriesRenderer();
    mRenderer.addSeriesRenderer(渲染);
    mRenderer.setXTitle(日期);
    mRenderer.setYTitle(数据);
    mRenderer.setApplyBackgroundColor(真正的);
    mRenderer.setBackgroundColor(Color.BLACK);
    mRenderer.setMarginsColor(Color.BLACK);
    mRenderer.setXRoundedLabels(假);
    mRenderer.setShowCustomTextGrid(真正的);
    mRenderer.setXLabels(0);

    的for(int i = 0; I< date.size();我++){
        mRenderer.addXTextLabel(ⅰ,dates_Strings.get(ⅰ));

    }


     // mChartView = ChartFactory.getTimeChartView(这一点,数据集,mRenderer,DD / MM / YYYY);

    // mChartView = ChartFactory.getScatterChartView(这一点,数据集,mRenderer);
    //layout.addView(mChartView);
    意向意图= ChartFactory.getLineChartIntent(getBaseContext(),数据集,mRenderer,DD / MM / YYYY);
    startActivity(意向);

 }



公共无效readfunc(){

SimpleDateFormat的thedate =新的SimpleDateFormat(DD / MM / YYYY);
日期D =新的日期();
字符串formattedDate = thedate.format(D);


    文件SD卡= Environment.getExternalStorageDirectory();
    文件目录=新的文件(SD卡,MYFILES);
    档案文件=新的文件(目录,文件名);

    字符串s;

    的FileInputStream FIS;

   尝试 {
      FIS =新的FileInputStream(文件);

         的BufferedReader BR =新的BufferedReader(新的InputStreamReader(FIS));

         做 {
             S = br.readLine();
             如果(S!= NULL){
                 串[] splitLine = s.split(,);
                 data.add(Double.parseDouble(splitLine [0]));
                 //dates_Strings.add(thedate.parse(splitLine[1]));
                 dates_Strings.add(formattedDate);
       }
             }而(!S = NULL);
          br.close();
       }赶上(IOException异常E){
          e.printStackTrace();
           }
}

}
 

I want to have a scatter plot with dates in x-axis.

Because if I use ChartFactory.getTimeChartView I receive a line graph and the problem is:

I make plot with current date as x axis and data (user input) as y axis.I store these data (date and user data) in Lists and also in a file.

The user may enter multiple times data during a day.And some of the data may be the same,so if I use a Linegraph the plot messes up.That's why I need scatter.

1)How can I do this?

2) Also, can someone point me to an example of adding custom labels on the X axis,in order to use a Linegraph?

----------------------UPDATE--------------------------------

I am trying to do this right now (i would like to know if it could be done as my questions above though)

I store dates as List String :

List<String> dates_asString=new ArrayList<String>();

I save them:

SimpleDateFormat thedate = new SimpleDateFormat("dd/MM/yyyy"); 
        Date d=new Date();
String formattedDate=thedate.format(d);
        dates_asString.add(formattedDate);

 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
              for (int i=0;i<mydata.size();i++){
                    bw.write(mydata.get(i)+","+dates_asString.get(i)+"\n");//+"\n");

In LineGraph:

private static List<String> dates_asString = new ArrayList<String>();
    private static List<Double> data = new ArrayList<Double>();
    private static List<Date> dates_asDates = new ArrayList<Date>();


loadfunc();    

//trying to copy the dates_asString to dates_asDates in order to use them in TimeSeries

 SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Date convertedDate=new Date();
        try{
       for (int k=0;k<dates_asString.size();k++){
        convertedDate = formatter.parse(dates_asString.get(k));
        date_asDates.add(convertedDate);
       }
        }catch (ParseException e){

            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        TimeSeries series = new TimeSeries("Showing data");
        for (int i=0;i<date_asDates.size();i++){    

            series.add(date_asDates.get(i),data.get(i));    
        }


mRenderer.setXLabels(0);
        for (int i=0;i<dates_asString.size();i++){
            mRenderer.addXTextLabel(i,dates_asString.get(i));

        }

public void loadfunc(){

    SimpleDateFormat thedate = new SimpleDateFormat("dd/MM/yyyy"); 
    Date d=new Date();

    String formattedDate=thedate.format(d);

BufferedReader br = new BufferedReader(new InputStreamReader(fis));
            ....
                     data.add(Double.parseDouble(splitLine[0]));
                    dates_asString.add(formattedDate);

解决方案

As told by Dan in his answer you can use renderer.addXTextLabel(x, "text"); to set x-axis labels.

In your case:: u made mistake at commented line , You where trying to add x-axis labels twice..

change it as shown below

  TimeSeries series = new TimeSeries("Showing data");
    for (int i=0;i<date_asDates.size();i++){    

        series.add(i,data.get(i));    // only this change ll work as u needed
    }

UPDATE: Change Your code to following it wont crash on adding new data's

and if u want only points to be visible not linealong with point then change this ChartFactory.getLineChartIntent(getBaseContext(), dataset, mRenderer,"dd/MM/yyyy"); to ChartFactory.getScatterChartIntent(getBaseContext(), dataset, mRenderer,"dd/MM/yyyy");

MainActivity.java

package com.example.trying;
import java.io.BufferedWriter;
import java.io.File; // imports add all as before too

public class MainActivity extends Activity implements OnClickListener{


View savebtn;
View graphicsbtn;
EditText value,weight;
String filename = "mydata.csv";    
public static List<String> dates_Strings = new ArrayList<String>();
public static List<Double> data = new ArrayList<Double>();
public static List<Date> date = new ArrayList<Date>();

List<Double> mydata=new ArrayList<Double>();


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

     date.clear();
     data.clear();
     dates_Strings.clear();
     //Set up click listeners
    savebtn=(View) findViewById(R.id.savebtn);
    savebtn.setOnClickListener(this);
    graphicsbtn=(View) findViewById(R.id.graphicsbtn);
    graphicsbtn.setOnClickListener(this);

    value=(EditText) findViewById(R.id.enter_data);


}


//called when a button is clicked
public void onClick(View v) {
    switch (v.getId()){
    case R.id.savebtn:
        savefunc();      
        break;
    case R.id.graphicsbtn:        
        Intent i = new Intent(this,LineGraph.class);        
        startActivity(i);
        break;

}
}

public void savefunc(){

    SimpleDateFormat thedate = new SimpleDateFormat("dd/MM/yyyy"); 
    Date d=new Date();

    String formattedDate=thedate.format(d);
    Log.d("tag","format"+formattedDate);
    dates_Strings.add(formattedDate);




    try{
        double thedata=Double.parseDouble(value.getText().toString().trim());
        mydata.add(thedata);
        Log.d("tag","thedata :"+thedata);
    } catch (NumberFormatException e){
        String message="Sorry you did't type anything";

         Toast toast = Toast.makeText(getBaseContext(), message,Toast.LENGTH_SHORT);  
         toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 100);
         toast.show();
  // Toast.makeText(getBaseContext(), "Sorry you did't type anything",    Toast.LENGTH_SHORT).show();

    }


    File sdCard = Environment.getExternalStorageDirectory();
    File directory = new File (sdCard, "MyFiles");
    directory.mkdirs();            
    File file = new File(directory, filename);

    FileOutputStream fos;

    //saving them
    try {
       fos = new FileOutputStream(file);

          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
          for (int i=0;i<mydata.size();i++){
                bw.write(mydata.get(i)+","+dates_Strings.get(i)+"\n");
          }
          value.setText("");
          bw.flush();
          bw.close();

        } catch (IOException e2) {
           e2.printStackTrace();
            }//catch
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

LineGraph.java

package com.example.trying;

import java.io.BufferedReader;
import java.io.File; // add all other imports

public class LineGraph extends MainActivity {

String filename = "mydata.csv";    



private LinearLayout layout;
private GraphicalView mChartView;

protected void onCreate(Bundle savedInstanceState){

     super.onCreate(savedInstanceState);
     setContentView(R.layout.graph);
     layout = (LinearLayout) findViewById(R.id.chart);

    readfunc();       

    //trying to copy the dates_asString to date (Dates) in order to use them in TimeSeries
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    Date convertedDate;//=new Date();
    try{
   for (int k=0;k<dates_Strings.size();k++){
    convertedDate = formatter.parse(dates_Strings.get(k));
    date.add(convertedDate);
    Log.d("line","convertedDate :"+convertedDate);
   }
    }catch (ParseException e){

        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    TimeSeries series = new TimeSeries("Showing data");
    for (int i=0;i<dates_Strings.size();i++){   
        series.add(i,data.get(i));  //series.add(date.get(i),data.get(i));
    }


    XYMultipleSeriesDataset dataset=new XYMultipleSeriesDataset();
    dataset.addSeries(series);


    //renderer for decay
    XYSeriesRenderer renderer =new XYSeriesRenderer();
    renderer.setColor(Color.YELLOW);
    renderer.setLineWidth(3);
    renderer.setPointStyle(PointStyle.SQUARE);


    XYMultipleSeriesRenderer mRenderer =new XYMultipleSeriesRenderer();
    mRenderer.addSeriesRenderer(renderer);
    mRenderer.setXTitle("Date");
    mRenderer.setYTitle("Data");
    mRenderer.setApplyBackgroundColor(true);
    mRenderer.setBackgroundColor(Color.BLACK);
    mRenderer.setMarginsColor(Color.BLACK);
    mRenderer.setXRoundedLabels(false);
    mRenderer.setShowCustomTextGrid(true);
    mRenderer.setXLabels(0);

    for (int i=0;i<date.size();i++){
        mRenderer.addXTextLabel(i,dates_Strings.get(i));

    }


     //mChartView = ChartFactory.getTimeChartView(this, dataset, mRenderer,"dd/MM/yyyy");

    //mChartView = ChartFactory.getScatterChartView(this, dataset, mRenderer);
    //layout.addView(mChartView);
    Intent intent= ChartFactory.getLineChartIntent(getBaseContext(), dataset, mRenderer,"dd/MM/yyyy");  
    startActivity(intent);

 }



public void readfunc(){

SimpleDateFormat thedate = new SimpleDateFormat("dd/MM/yyyy"); 
Date d=new Date();
String formattedDate=thedate.format(d);


    File sdCard = Environment.getExternalStorageDirectory();
    File directory = new File (sdCard, "MyFiles");
    File file = new File(directory, filename);

    String s;

    FileInputStream fis;

   try {
      fis = new FileInputStream(file);

         BufferedReader br = new BufferedReader(new InputStreamReader(fis));

         do {
             s = br.readLine();     
             if (s != null ){
                 String[] splitLine = s.split(",");
                 data.add(Double.parseDouble(splitLine[0]));
                 //dates_Strings.add(thedate.parse(splitLine[1]));
                 dates_Strings.add(formattedDate);
       }                        
             } while (s != null );
          br.close();                      
       } catch (IOException e) {
          e.printStackTrace();
           }
}

}

这篇关于散点图日期为x轴 - 在X轴添加自定义标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆