散点图日期为x轴 - 在X轴添加自定义标签 [英] scatter plot with dates at x axis -- add custom labels on X axis
问题描述
我想有一个散点图日期在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屋!