MPChart折线图工具类封装

package com.example.epnc.utils;

import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
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.formatter.PercentFormatter;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by TCL on 2016/9/1.
 */
public class LineChartUtils {

    /**
     * 坐标线,LineDataSet(坐标点的集合, 线的描述或名称);
     */
     //private static Vector<ILineDataSet> dataSets = new Vector<ILineDataSet>();
     private static List<String> xValues;


    /**
     * @param lineChart
     * @param isYStartAtZero     是否从0开始
     * @param yAxisMinValue      最小值
     * @param yAxisMaxValue      最大值
     * @param isPercentFormatter 是否百分比显示
     */
    private static void setYAxis(LineChart lineChart, boolean isYStartAtZero,
                                 float yAxisMinValue, float yAxisMaxValue, boolean isPercentFormatter) {
        YAxis yAxis = lineChart.getAxisLeft();

        // Y轴刻度值颜色
        yAxis.setTextColor(Color.parseColor("#e0e0e0"));

        // 设置Y轴坐标是否从0开始
        yAxis.setStartAtZero(isYStartAtZero);
        // 设置Y轴坐标最大为多少
        yAxis.setAxisMaxValue(yAxisMaxValue);
        // 设置Y轴坐标最小为多少
        yAxis.setAxisMinValue(yAxisMinValue);

        // Y轴上的刻度竖线的颜色
        yAxis.setGridColor(Color.parseColor("#eeeeee"));

        // 设置Y轴上刻度竖线的宽度
        yAxis.setGridLineWidth(1.2f);

        //Y轴显示百分之几
        if (isPercentFormatter) {
            yAxis.setValueFormatter(new PercentFormatter());
        }

        // Y轴上的刻度的颜色
        yAxis.setTextColor(Color.parseColor("#9a9a9a"));

        yAxis.setDrawAxisLine(true);
    }

    /**
     * 设置X轴相关
     *
     * @param lineChart
     * @param xAxisStartPosition X轴起点
     * @param point              一个X轴点内部有几个数据点
     * @param labelToSkip        间隔位置
     */
    private static void setXAxis(LineChart lineChart, int xAxisStartPosition, int xAxisEndPosition, int point, int
            labelToSkip, String XTitleSuffix) {
        XAxis xAxis = lineChart.getXAxis();
        // X轴上的刻度的颜色
        xAxis.setTextColor(Color.parseColor("#a0a0a0"));

        // X轴颜色
        xAxis.setAxisLineColor(Color.BLUE);

        // X轴上的刻度竖线的颜色
        xAxis.setGridColor(Color.parseColor("#eeeeee"));

        // 设置X轴上刻度竖线的宽度
        xAxis.setGridLineWidth(1.2f);

        // X轴位置
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);

        // 设置坐标相隔多少,参数是int类型
        xAxis.setLabelsToSkip(labelToSkip);

        // 设置为true,则绘制该行旁边的轴线(axis-line)。
        xAxis.setDrawAxisLine(true);

        xValues = new ArrayList<>();
        xValues.clear();
        for (int i = xAxisStartPosition; i <= point * xAxisEndPosition; i++) {
            xValues.add((i / point) + XTitleSuffix);
        }
    }

    /**
     * @param lineChart
     * @param xAxisStartPosition X轴起点
     * @param xAxisEndPosition   X轴终点
     * @param point              一个X轴点内部有几个数据点
     * @param labelToSkip        间隔
     * @param isYStartAtZero     Y轴是否从0开始
     * @param yAxisMinValue      Y轴最小值
     * @param yAxisMaxValue      Y轴最大值
     * @param isPercentFormatter Y轴是否百分比显示
     * @param XTitleSuffix       x轴标题后缀文字
     */
    //2016/09/04 liuwei添加XTitleSuffix,实现x轴标题后缀文字
    public static void initLineChart(LineChart lineChart,
                                     int xAxisStartPosition, int xAxisEndPosition, int point, int labelToSkip,
                                     boolean isYStartAtZero, float yAxisMinValue, float yAxisMaxValue, boolean
                                             isPercentFormatter, String XTitleSuffix) {
        //dataSets.clear();
        // 设置描述
        lineChart.setDescription("");
        // 设置透明度
        lineChart.setAlpha(0.8f);
        // 挤压缩放
        lineChart.setPinchZoom(true);
        // 双击缩放
        lineChart.setDoubleTapToZoomEnabled(true);
        // 图例关闭
        lineChart.getLegend().setEnabled(false);
        // 设置是否可以触摸
        lineChart.setTouchEnabled(true);
        // 是否可以拖拽
        lineChart.setDragEnabled(true);
        // 是否可以缩放 x和y轴, 默认是true
        lineChart.setScaleEnabled(true);
        // Y轴右侧禁用
        lineChart.getAxisRight().setEnabled(false);
        // 设置X轴相关
        setXAxis(lineChart, xAxisStartPosition, xAxisEndPosition, point, labelToSkip, XTitleSuffix);
        // 设置Y轴相关
        setYAxis(lineChart, isYStartAtZero, yAxisMinValue, yAxisMaxValue, isPercentFormatter);
    }

    /**
     * @param lineChart
     * @param values      数据点
     * @param offset      X轴开始坐标偏移量
     * @param color       线的颜色
     * @param isDrawCubic 是否圆滑
     */
    public synchronized static void addLineToLineChart(LineChart lineChart,
                                                       float[] values, int[] offset, int color, boolean isDrawCubic) {

        // 坐标点的集合
        ArrayList<Entry> entries = new ArrayList<>();
        for (int i = 0; i < values.length; i++) {
            // 坐标点的值,Entry(Y坐标,X坐标)
            entries.add(new Entry(values[i], i + offset[i]));
        }
        // 坐标线,LineDataSet(坐标点的集合, 线的描述或名称);
        LineDataSet lineDataSet = new LineDataSet(entries, "");

        // 设置线的颜色
        lineDataSet.setColor(color);
        // 设置线的宽度
        lineDataSet.setLineWidth(1.2f);
        // 设置曲线为圆滑的线
        lineDataSet.setDrawCubic(isDrawCubic);
        // 取消数据点上的数值显示
        lineDataSet.setDrawValues(false);
        // 取消数据点上的原点
        lineDataSet.setDrawCircles(false);
        // lineChart.getLineData().getDataSets().add(lineDataSet);

        LineData data = null;
        if (lineChart.getData() == null) {
            List<ILineDataSet> dataSets = new ArrayList<>();
            dataSets.add(lineDataSet);
            data = new LineData(xValues, dataSets);
        } else {
            lineChart.getData().getDataSets().add(lineDataSet);
            data = new LineData(xValues, lineChart.getData().getDataSets());
        }
        //  add line
        // dataSets.add(lineDataSet);

        // 为图表添加数据
        lineChart.setData(data);
        // // 重新更新显示
        lineChart.invalidate();
    }


    /**
     * 添加限制线
     *
     * @param lineChart
     * @param value              限制线的值
     * @param description        描述
     * @param lineColor          颜色
     * @param isEnableDashedLine 是否虚线
     */
    public static void addLimitLineToLineChart(LineChart lineChart,
                                               float value, String description, int lineColor,
                                               boolean isEnableDashedLine) {
        LimitLine limitLine = new LimitLine(value, description);
        limitLine.setLineColor(lineColor);
        limitLine.setLineWidth(1f);
        limitLine.setTextColor(lineColor);
        limitLine.setTextSize(10f);
        if (isEnableDashedLine) {
            limitLine.enableDashedLine(10f, 10f, 0f);
        }
        // .. and more styling options
        lineChart.getAxisLeft().addLimitLine(limitLine);
    }
}

//调用:

 LineChartUtils.initLineChart(energy_power_factor_chart_view, 0, 24, 60, 120, false, minValue - minValue *
                0.2f, 40, false, "");
        LineChartUtils.addLineToLineChart(energy_power_factor_chart_view, valuesA, offsets,
                Color.parseColor("#c2c21d"), false);
        LineChartUtils.addLimitLineToLineChart(energy_power_factor_chart_view, 30f, "考核值", Color.parseColor
                ("#ff553b"), true);


对于poi树状图、饼图、折线图的生成,可以使用Apache POI提供的XSSFChart和XDDFChart类进行操作。 首先,我们需要创建一个工作簿对象,然后在工作簿中创建一个工作表对象。接着,我们可以创建一个图表对象,并将其添加到工作表中。然后,我们可以使用XSSFChart和XDDFChart类的方法来定义图表的数据和样式。 具体实现步骤如下: 1. 创建一个工作簿对象 ``` XSSFWorkbook workbook = new XSSFWorkbook(); ``` 2. 创建一个工作表对象 ``` XSSFSheet sheet = workbook.createSheet("Chart"); ``` 3. 创建一个图表对象 ``` XSSFChart chart = sheet.createDrawingPatriarch().createChart(anchor); ``` 其中,anchor是图表的位置和大小,可以使用XSSFClientAnchor类来定义。 4. 定义图表的数据和样式 对于饼图、折线图和树状图,数据一般是通过一个数据源来提供的。我们可以使用XDDFDataSource类来创建数据源,并将其添加到图表中。样式方面,可以使用XDDFChartLegend和XDDFChartData类来定义图表的标题、图例、颜色等属性。 下面是一个生成饼图的示例代码: ``` // 创建一个工作簿对象 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个工作表对象 XSSFSheet sheet = workbook.createSheet("Chart"); // 创建一个图表对象 XSSFChart chart = sheet.createDrawingPatriarch().createChart(anchor); // 创建一个数据源 XDDFDataSource<String> categoryDataSource = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1, 4, 0, 0)); XDDFNumericalDataSource<Double> dataDataSource = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 4, 1, 1)); // 创建一个饼图数据对象 XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null); // 添加数据源到饼图数据对象中 data.setCategoryData(categoryDataSource); data.setValues(dataDataSource); // 创建一个饼图样式对象 XDDFChartLegend legend = chart.getOrAddLegend(); legend.setPosition(LegendPosition.TOP_RIGHT); XDDFPieChartSeries series = (XDDFPieChartSeries) data.getSeries().get(0); series.setTitle("Pie Chart"); XDDFShapeProperties shapeProperties = series.getShapeProperties(); shapeProperties.setFillProperties(new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE))); ``` 这样,就可以在Excel文档中生成一个饼图了。其他类型的图表生成也是类似的,只需要根据需要调用不同的类和方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值