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轻松绘制图表

Android画折线图柱状图饼图(使用achartengine.jar)

Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验

Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验

AChartEngine 图标绘制