AChartEngine for Android中y轴值的工程格式
Posted
技术标签:
【中文标题】AChartEngine for Android中y轴值的工程格式【英文标题】:Engineering Format of y-axis values in AChartEngine for Android 【发布时间】:2014-03-24 12:31:04 【问题描述】:我正在做一个需要绘制数据的项目。我在 Windows 7 64 位 PC 上使用 android Studio 5.2.0 和 AChartEngine 1.2.0。 我对 y 标签的工程格式感兴趣,例如2.3E6.. 我研究了我能做的,但没有成功。 我希望 1、3、0、1 和 1 作为最小整数位数,最大整数位数,最小小数位数,最大小数位数和编号。指数部分的数字,分别。此外,指数必须是 3 的倍数。
这是我的 LineGraph 类:
public class LineGraph
public Intent getIntent(Context context)
int size = ( int ) Math.pow(2, 10);
double start = 0;
double end = 2 * Math.PI;
double inc = (end - start) / (size - 1);
double[] x = new double[size];
double[] y = new double[size];
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
TimeSeries series = new TimeSeries("Sin * Cos");
for ( int i = 0; i < size; i++ )
x[i] = start + i * inc;
y[i] = 10000 * Math.sin(x[i]) * Math.cos(x[i]);
series.add(x[i], y[i]);
dataset.addSeries(series);
XYSeriesRenderer ren = new XYSeriesRenderer();
// XYSeriesRenderer properties
ren.setColor(Color.RED);
ren.setFillPoints(true);
ren.setDisplayBoundingPoints(false);
ren.setFillPoints(true);
ren.setLineWidth(2f);
// XYMultipleSeriesRenderer properties
XYMultipleSeriesRenderer mRen = new XYMultipleSeriesRenderer();
mRen.setAntialiasing(true);
mRen.setMargins(new int[] 10, 80, 10, 10 );
mRen.setShowGrid(true);
mRen.setApplyBackgroundColor(true);
mRen.setBackgroundColor(Color.LTGRAY);
mRen.setGridColor(Color.WHITE);
mRen.setLabelsTextSize(20f);
mRen.setYLabelsVerticalPadding(-5f);
mRen.setYLabelsPadding(40);
mRen.setShowLegend(false);
mRen.setXLabels(5);
mRen.setYLabels(10);
// Number format
DecimalFormat noFormat = new DecimalFormat("##0.##E0");
noFormat.setMinimumIntegerDigits(1);
noFormat.setMaximumIntegerDigits(3);
noFormat.setMinimumFractionDigits(0);
noFormat.setMaximumFractionDigits(2);
mRen.setYLabelFormat(noFormat, 0);
mRen.addSeriesRenderer(renderer);
// Construct and return the intent.
Intent intent = ChartFactory.getLineChartIntent(context, dataset, mRen, "Line Graph");
return intent;
这是我的 MainActivity:
public class MainActivity extends ActionBarActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@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;
@Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if ( id == R.id.action_settings )
return true;
return super.onOptionsItemSelected(item);
public void lineGraphHandler(View view)
LineGraph lineGraph = new LineGraph();
Intent lineIntent = lineGraph.getIntent(this);
startActivity(lineIntent);
这是我的activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="ramin.graphtutorial.graph.MainActivity">
<Button
android:id="@+id/button_linegraph"
android:layout_
android:layout_
android:layout_centerHorizontal="true"
android:onClick="lineGraphHandler"
android:text="@string/button_line_graph_text"/>
</RelativeLayout>
最后,这是我的 manifest.xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="ramin.graphtutorial.graph"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:allowClearUserData="true"
android:allowTaskReparenting="true"
android:hardwareAccelerated="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="ramin.graphtutorial.graph.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="org.achartengine.GraphicalActivity"/>
</application>
</manifest>
当我将 noFormat 的格式方法应用于单个双精度值时,它工作正常,但不适用于格式化 y 标签。对于后者,我执行以下操作;
XYMultipleSeriesRenderer mRen = new XYMultipleSeriesRenderer();
XYSeriesRenderer ren = new XYSeriesRenderer ();
mRen.addSeriesRenderer(ren);
int noOfYLabels = 5;
mRen.setYLabels( noOfYLabels );
mRen.setYLabelFormat( noFormat, 0 );
但是我只得到三个零,即 000 表示沿 y 轴大于 1000 的所有值。 我还尝试通过以下代码 sn-p 手动设置 y 值文本标签:
Double[] ylabels = mRen.getYTextLabelLocations(0);
mRen.setYLabels( 0 );
for ( int i = 0; i < noOfYLabels; i++ )
mRen.addYTextLabel( ylabels[ i ], noFormat.format( ylabels[ i ] ) );
但是我在数组 yLabels 中得到了超出范围的索引。 有人可以帮我解决这个问题吗? PS:我之前问过这个问题,但没有得到任何答案。也许问题不够清楚。 先感谢您。 拉敏。
【问题讨论】:
你想显示什么格式? 感谢@keshav 的回复。我想要 y 标签的工程编号格式,例如数字 600 000 000 和 1 800 必须显示为 600E6 和 1.8E3。此外,必须在缩放时自动更新 y 标签。再次感谢。 你的 noFormat 很好。问题出在其他地方,你能显示更多的图表代码吗? 致@keshav。根据您的要求,我已将大部分代码包含在上面的编辑版本中。 我试过你的代码一切都很好。 【参考方案1】:试试这样的
private LinearLayout chartLayout;
private GraphicalView mChart;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showlineGraph( );
public void showlineGraph()
chartLayout= (LinearLayout) findViewById(R.id.graphHolder);
// LineGraph lineGraph = new LineGraph();
int size = (int) Math.pow(2, 10);
double start = 0;
double end = 2 * Math.PI;
double inc = (end - start) / (size - 1);
double[] x = new double[size];
double[] y = new double[size];
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
TimeSeries series = new TimeSeries("Sin * Cos");
for(int i = 0; i < size; i++)
x[i] = start + i * inc;
y[i] = 1000 * Math.sin(x[i]) * Math.cos(x[i]);
series.add(x[i], y[i]);
dataset.addSeries(series);
XYSeriesRenderer ren = new XYSeriesRenderer();
// XYSeriesRenderer properties
ren.setColor(Color.RED);
ren.setFillPoints(true);
ren.setDisplayBoundingPoints(false);
ren.setFillPoints(true);
ren.setLineWidth(2f);
// XYMultipleSeriesRenderer properties
XYMultipleSeriesRenderer mRen = new XYMultipleSeriesRenderer();
mRen.setAntialiasing(true);
mRen.setMargins(new int[] 10, 80, 10, 10 );
mRen.setShowGrid(true);
mRen.setApplyBackgroundColor(true);
mRen.setBackgroundColor(Color.LTGRAY);
mRen.setGridColor(Color.WHITE);
mRen.setLabelsTextSize(20f);
mRen.setYLabelsVerticalPadding(-5f);
mRen.setYLabelsPadding(40);
mRen.setShowLegend(false);
mRen.setXLabels(5);
mRen.setYLabels(10);
// Number format
DecimalFormat noFormat = new DecimalFormat("##0.##E0");
noFormat.setMinimumIntegerDigits(1);
noFormat.setMaximumIntegerDigits(3);
noFormat.setMinimumFractionDigits(0);
noFormat.setMaximumFractionDigits(2);
mRen.setYLabelFormat(noFormat, 0);
mRen.addSeriesRenderer(ren);
// Construct and return the intent.
view = ChartFactory.getLineChartView(this, dataset, mRen);
chartLayout.addView(view);
【讨论】:
致@keshav。非常感谢。它起到了魅力的作用。据我所知,方法之间的区别在于我开始了一个新的活动,而您使用相同的活动来绘制图表。那么为什么不使用新活动呢?以上是关于AChartEngine for Android中y轴值的工程格式的主要内容,如果未能解决你的问题,请参考以下文章
Android 图表绘制 achartengine 示例解析
Android画折线图柱状图饼图(使用achartengine.jar)
Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验