集成
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
}
柱状图
X轴:XAxis
Y轴:YAxis
图例:Legend
描述:Description
限制线:LimitLine
使用步骤:
1.得到BarChart对象 并初始化
2.得到BarEntry对象,此处添加(X,Y)值
3.得到BarDataSet对象,添加BarEntry对象
4.得到BarData对象,添加BarDaraSet对象
5.显示柱状图 BarChart.setData(BarData)
BarChartManager :
/**
* X轴:XAxis
* Y轴:YAxis
* 图例:Legend
* 描述:Description
* 限制线:LimitLine
* <p>
* 使用步骤:
* 1.得到BarChart对象 并初始化
* 2.得到BarEntry对象,此处添加(X,Y)值
* 3.得到BarDataSet对象,添加BarEntry对象
* 4.得到BarData对象,添加BarDaraSet对象
* 5.显示柱状图 BarChart.setData(BarData)
* Created by xiaoyehai on 2018/6/22 0022.
*/
public class BarChartManager {
//柱状图
private BarChart mBarChart;
//x轴实例对象
private XAxis mXAxis;
//左边y轴实例对象
private YAxis mLeftAxis;
//右边y轴实例对象
private YAxis mRightAxis;
//图例对象
private Legend mLegend;
public BarChartManager(BarChart barChart) {
this.mBarChart = barChart;
mXAxis = barChart.getXAxis();
mLeftAxis = barChart.getAxisLeft();
mRightAxis = barChart.getAxisRight();
mLegend = barChart.getLegend();
initBarchart();
}
private void initBarchart() {
//设置柱状图属性
setBarChartProperties();
//设置左边Y轴
setLeftAxis();
//设置右边Y轴
setRightAxis();
//设置X轴
setXAxis();
//设置图例
setLegend();
}
/**
* 设置柱状图属性
*/
private void setBarChartProperties() {
//设置背景颜色
mBarChart.setBackgroundColor(Color.WHITE);
//无数据时
mBarChart.setNoDataText("统计数据为空");
//隐藏描述
mBarChart.getDescription().setEnabled(false);
//不显示网格背景
mBarChart.setDrawGridBackground(false);
//不显示柱状图背景阴影
mBarChart.setDrawBarShadow(false);
//这里设置为true每一个直方图的值就会显示在直方图的顶部
mBarChart.setDrawValueAboveBar(true);
//如果图表中显示超过60个条目,则不会绘制任何柱状图的值
mBarChart.setMaxVisibleValueCount(60);
//缩放现在只能在x轴和y轴上分别进行
mBarChart.setPinchZoom(false);
//显示边界
//mBarChart.setDrawBorders(true);
//设置动画效果
//mBarChart.animateX(1500);
// mBarChart.animateY(1500);
mBarChart.animateXY(2000, 2000);
//设置不可缩放,默认可缩放
//mBarChart.setScaleEnabled(false);
//使两侧的柱图完全显示
// mBarChart.setFitBars(true);
}
/**
* 设置图例
*/
private void setLegend() {
//图例相关设置
mLegend = mBarChart.getLegend();
mLegend.setEnabled(true); //隐藏图例
//显示位置
mLegend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
mLegend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
mLegend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
mLegend.setDrawInside(false);
//设置图例形状
mLegend.setForm(Legend.LegendForm.SQUARE);
mLegend.setFormSize(9f);
mLegend.setTextSize(11f);
mLegend.setXEntrySpace(4f);
//设置标签是否换行(当多条标签时 需要换行显示)
mLegend.setWordWrapEnabled(true);
}
/**
* 设置X轴
*/
private void setXAxis() {
//X轴对象实例
mXAxis = mBarChart.getXAxis();
//设置X轴的位置
mXAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//隐藏水平网格线
//mXAxis.setGridColor(Color.TRANSPARENT);
mXAxis.setDrawGridLines(false);
//设置x抽的值每隔多少个显示
mXAxis.setGranularity(1f);
//设置x抽的值倾斜显示
//mXAxis.setLabelRotationAngle(-60);
//设置文字颜色
// mXAxis.setTextColor(Color.RED);
}
/**
* 设置右边Y轴
*/
private void setRightAxis() {
//右边Y轴对象实例
mRightAxis = mBarChart.getAxisRight();
//启用该轴
mRightAxis.setEnabled(true);
// 保证Y轴从0开始,不然会上移一点
mRightAxis.setAxisMinimum(0f);
// 设置y轴的刻度数
mRightAxis.setLabelCount(8, false);
}
/**
* 设置左边Y轴
*/
private void setLeftAxis() {
//左边Y轴对象实例
mLeftAxis = mBarChart.getAxisLeft();
//启用该轴
mLeftAxis.setEnabled(true);
// 保证Y轴从0开始,不然会上移一点
mLeftAxis.setAxisMinimum(0f);
// 设置y轴的刻度数
mLeftAxis.setLabelCount(8, false);
//设置Y轴的值显示在外面
mLeftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
//设置坐标轴宽度
//mLeftAxis.setAxisLineWidth(5f);
//设置轴上最高位置在表中最高位置的顶部间距,占总轴的百分比。
//mLeftAxis.setSpaceTop(20f);
}
/**
* @param xAxisValues x轴的值
* @param yAxisValues y轴的值
*/
public void showBarChart(final List<String> xAxisValues, List<Float> yAxisValues) {
//通过下面两句代码实现左右滚动
// float ratio = (float) yAxisValues.size() / (float) 10;//我默认手机屏幕上显示10剩下的滑动直方图然后显示。
// 假如要显示25个 那么除以10 就是放大2.5f
//mBarChart.zoom(ratio, 1f, 0, 0);//显示的时候是按照多大的比率缩放显示 1f表示不放大缩小
//设置x轴的值
mXAxis.setValueFormatter(new IndexAxisValueFormatter(xAxisValues));
// mXAxis.setValueFormatter(new IAxisValueFormatter() {
// @Override
// public String getFormattedValue(float value, AxisBase axis) {
// return xAxisValues.get((int) value);
// }
// });
// mLeftAxis.setValueFormatter(new IAxisValueFormatter() {
// @Override
// public String getFormattedValue(float value, AxisBase axis) {
// return value + "%";
// }
// });
// 设置X轴的刻度数,第二个参数表示是否平均分配
mXAxis.setLabelCount(xAxisValues.size(), false);
//y轴的值
ArrayList<BarEntry> entries = new ArrayList<>();
for (int i = 0; i < yAxisValues.size(); i++) {
entries.add(new BarEntry(i, yAxisValues.get(i)));
}
BarDataSet barDataSet = new BarDataSet(entries, "The year 2018");
//柱状图上的值保留几位小数
//barDataSet.setValueFormatter(new DefaultValueFormatter(2));
//柱状图颜色
//barDataSet.setColor(Color.RED);
//柱状图上值的颜色
//barDataSet.setValueTextColor(Color.RED);
//柱状图上值的大小
//barDataSet.setValueTextSize(20f);
ArrayList<IBarDataSet> dataSets = new ArrayList<>();
dataSets.add(barDataSet);
//是否显示柱状图上的值,默认显示
//barDataSet.setDrawValues(true);
//是否显示柱状图边框,默认为0,不显示
//barDataSet.setBarBorderWidth(1f);
BarData data = new BarData(dataSets);
//设置柱状图不能点击,默认可点击
//data.setHighlightEnabled(false);
//设置柱状图大小
// data.setBarWidth(0.9f);
//柱状图上值的大小
// data.setValueTextSize(20f);
// 柱状图上值的颜色
//data.setValueTextColor(Color.RED);
mBarChart.setData(data);
}
}
使用:
<com.github.mikephil.charting.charts.BarChart
android:id="@+id/bar_chart"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.github.mikephil.charting.charts.BarChart>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_bar_chart);
mBarChart = (BarChart) findViewById(R.id.bar_chart);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle("BarChart");
initData();
}
private void initData() {
//x轴的值
List<String> xAxisValues = new ArrayList<>();
for (int i = 0; i < 12; i++) {
xAxisValues.add(i + 1 + "月");
}
//y轴的值
List<Float> yAxisValues = new ArrayList<>();
for (int i = 0; i < 12; i++) {
yAxisValues.add(((float) (Math.random() * 300) + 0));
}
BarChartManager barChartManager = new BarChartManager(mBarChart);
barChartManager.showBarChart(xAxisValues, yAxisValues);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.barchart, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: //返回
finish();
break;
}
return true;
}
折线图
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/lineChart"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginLeft="15dp"
android:layout_marginTop="20dp"
android:layout_marginRight="15dp" />
public class LineChartManager {
private Context mContext;
//折线图对象LineChart
private LineChart mLineChart;
//x轴实例对象
private XAxis mXAxis;
//左边y轴实例对象
private YAxis mLeftAxis;
//右边y轴实例对象
private YAxis mRightAxis;
//图例对象
private Legend mLegend;
public LineChartManager(Context context, LineChart lineChart) {
this.mLineChart = lineChart;
mContext = context;
mXAxis = lineChart.getXAxis();
mLeftAxis = lineChart.getAxisLeft();
mRightAxis = lineChart.getAxisRight();
mLegend = lineChart.getLegend();
initLinechart();
}
private void initLinechart() {
//设置折线图属性
setBarChartProperties();
//设置X轴
setXAxis();
//设置左边Y轴
setLeftAxis();
//设置右边Y轴
setRightAxis();
//设置图例
setLegend(false);
//设置限制线
//setLimitLine();
}
/**
* 设置折线图属性
*/
private void setBarChartProperties() {
//设置背景颜色
mLineChart.setBackgroundColor(Color.WHITE);
//是否显示网格背景
mLineChart.setDrawGridBackground(false);
//无数据时显示
mLineChart.setNoDataText("统计数据为空");
//隐藏描述
mLineChart.getDescription().setEnabled(false);
//是否显示边界
mLineChart.setDrawBorders(false);
//如果图表中显示超过60个条目,则不会绘制任何折线图的值
//mLineChart.setMaxVisibleValueCount(60);
//缩放现在只能在x轴和y轴上分别进行
mLineChart.setPinchZoom(false);
//设置动画效果
//mLineChart.animateXY(2000, 2000);
//设置可缩放,默认可缩放
mLineChart.setScaleEnabled(true);
// mLineChart.setScaleXEnabled(true);
// mLineChart.setScaleYEnabled(true);
//支持触控手势
mLineChart.setTouchEnabled(true);
// 支持拖动
mLineChart.setDragEnabled(true);
mLineChart.setDoubleTapToZoomEnabled(false);
}
/**
* 设置X轴
*/
private void setXAxis() {
//X轴对象实例
mXAxis = mLineChart.getXAxis();
//设置X轴的位置
mXAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//隐藏水平网格线
//mXAxis.setGridColor(Color.TRANSPARENT);
mXAxis.setDrawGridLines(false);
//设置x抽的值每隔多少个显示
mXAxis.setGranularity(1f);
//设置x抽的值倾斜显示
//mXAxis.setLabelRotationAngle(-60);
//设置文字颜色
// mXAxis.setTextColor(Color.RED);
//格式化x抽显示的值
/* mXAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return xAxisValues.get((int) value);
}
});*/
}
/**
* 设置右边Y轴
*/
private void setRightAxis() {
//右边Y轴对象实例
mRightAxis = mLineChart.getAxisRight();
//是否启用该轴
mRightAxis.setEnabled(false);
// 保证Y轴从0开始,不然会上移一点
mRightAxis.setAxisMinimum(0f);
// 设置y轴的刻度数
//mRightAxis.setLabelCount(8, false);
}
/**
* 设置左边Y轴
*/
private void setLeftAxis() {
//启用该轴
mLeftAxis.setEnabled(true);
// 保证Y轴从0开始,不然会上移一点
mLeftAxis.setAxisMinimum(0f);
// 设置y轴的刻度数,可以不设置,自动适应
//mLeftAxis.setLabelCount(10, false);
//设置Y轴的值显示在外面
mLeftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
//设置坐标轴宽度
//mLeftAxis.setAxisLineWidth(5f);
//设置轴上最高位置在表中最高位置的顶部间距,占总轴的百分比。
//mLeftAxis.setSpaceTop(20f);
//设置Y轴网格线为虚线
mLeftAxis.enableGridDashedLine(10f, 10f, 0f);
//格式化y抽显示的值
mLeftAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
if (value < 10000) {
return ((int) value) + "";
} else {
return ((int) (value / 10000)) + " 万";
}
}
});
}
/**
* @param xAxisValues x轴的值
* @param yAxisValues y轴的值
*/
public void showLineChart(final List<String> xAxisValues, List<Float> yAxisValues) {
//点击弹窗显示值
showMarkerView(xAxisValues);
//通过下面两句代码实现左右滚动
// float ratio = (float) yAxisValues.size() / (float) 10;//我默认手机屏幕上显示10剩下的滑动直方图然后显示。
// 假如要显示25个 那么除以10 就是放大2.5f
//mLineChart.zoom(ratio, 1f, 0, 0);//显示的时候是按照多大的比率缩放显示 1f表示不放大缩小
//设置x轴的值
mXAxis.setValueFormatter(new IndexAxisValueFormatter(xAxisValues));
// 设置X轴的刻度数,第二个参数表示是否平均分配
mXAxis.setLabelCount(xAxisValues.size(), false);
//y轴的值
ArrayList<Entry> entries = new ArrayList<>();
for (int i = 0; i < yAxisValues.size(); i++) {
entries.add(new BarEntry(i, yAxisValues.get(i)));
}
//LineDataSet lineDataSet = new LineDataSet(entries, "The year 2018");
LineDataSet lineDataSet = new LineDataSet(entries, null);
//显示填充颜色
lineDataSet.setDrawFilled(true);
//设置填充颜色
// lineDataSet.setFillColor(Color.RED);
//lineDataSet.setFillAlpha(100);
//设置填充背景图
//Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.fade_linechart)
//lineDataSet.setFillDrawable(drawable)
//是否显示折线图上的值
lineDataSet.setDrawValues(false);
//lineDataSet.setDrawIcons(true);
//折线图上的值保留几位小数
//lineDataSet.setValueFormatter(new DefaultValueFormatter(2));
//折线图颜色
//lineDataSet.setColor(Color.RED);
//折线图上值的颜色
//lineDataSet.setValueTextColor(Color.RED);
//lineDataSet.setValueTextSize(20f);
//lineDataSet.setLineWidth(1f);
lineDataSet.setDrawCircles(true);
//lineDataSet.setCircleColor(Color.RED);
//lineDataSet.setCircleRadius(3f);
//设置曲线值的圆点是实心还是空心
lineDataSet.setDrawCircleHole(true);
// lineDataSet.setFormLineWidth(1f);
//lineDataSet.setFormSize(15.f);
//线模式为圆滑曲线(默认折线)
//lineDataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
lineDataSet.setMode(LineDataSet.Mode.LINEAR);
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
dataSets.add(lineDataSet);
//是否显示折线图上的值,默认显示
//lineDataSet.setDrawValues(true);
LineData data = new LineData(dataSets);
//设置折线图不能点击,默认可点击
data.setHighlightEnabled(true);
//设置折线图大小
// data.setValueTextSize(20f);
// 折线图上值的颜色
//data.setValueTextColor(Color.RED);
mLineChart.setData(data);
}
/**
* 设置图例
*/
private void setLegend(boolean isShowLegend) {
//图例相关设置
mLegend = mLineChart.getLegend();
//是否显示图例
mLegend.setEnabled(isShowLegend);
//显示位置, 左下方
mLegend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
mLegend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
mLegend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
//是否绘制在图表里面
mLegend.setDrawInside(false);
//设置图例形状
mLegend.setForm(Legend.LegendForm.SQUARE);
mLegend.setFormSize(9f);
mLegend.setTextSize(11f);
mLegend.setXEntrySpace(4f);
//设置标签是否换行(当多条标签时 需要换行显示)
mLegend.setWordWrapEnabled(true);
}
/**
* 点击弹窗显示值
*
* @param xAxisValues
*/
private void showMarkerView(List<String> xAxisValues) {
//创建一个定制的MarkerView(扩展MarkerView) 并指定布局。
//MyMarkerView mv = new MyMarkerView(mContext, R.layout.custom_marker_view);
LineChartMarkView mv = new LineChartMarkView(mContext, mXAxis.getValueFormatter());
String[] array = new String[xAxisValues.size()];
for (int i = 0; i < xAxisValues.size(); i++) {
array[i] = xAxisValues.get(i);
}
mv.setxNames(array);
mv.setChartView(mLineChart);
mLineChart.setMarker(mv);
}
/**
* 设置限制线
*/
private void setLimitLine() {
// x轴限制线
LimitLine llXAxis = new LimitLine(10f, "Index 10");
llXAxis.setLineWidth(4f);
llXAxis.enableDashedLine(10f, 10f, 0f);
llXAxis.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
llXAxis.setTextSize(10f);
mXAxis.enableGridDashedLine(10f, 10f, 0f);
LimitLine ll1 = new LimitLine(150f, "Upper Limit");
ll1.setLineWidth(4f);
ll1.enableDashedLine(10f, 10f, 0f);
ll1.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);
ll1.setTextSize(10f);
LimitLine ll2 = new LimitLine(-30f, "Lower Limit");
ll2.setLineWidth(4f);
ll2.enableDashedLine(10f, 10f, 0f);
ll2.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
ll2.setTextSize(10f);
mLeftAxis.removeAllLimitLines(); // 重置所有限制线以避免重叠线。
mLeftAxis.addLimitLine(ll1);
mLeftAxis.addLimitLine(ll2);
mLeftAxis.setAxisMaximum(200f);
mLeftAxis.setAxisMinimum(-50f);
//mLeftAxis.setYOffset(20f);
mLeftAxis.enableGridDashedLine(10f, 10f, 0f);
mLeftAxis.setDrawZeroLine(false);
// 限制线绘制在数据后面(而不是顶部)
mLeftAxis.setDrawLimitLinesBehindData(true);
}
}
LineChartMarkView
public class LineChartMarkView extends MarkerView {
private TextView tvDate;
private TextView tvValue;
private ValueFormatter xAxisValueFormatter;
private String[] xNames;
DecimalFormat df = new DecimalFormat("");
public String[] getxNames() {
return xNames;
}
public void setxNames(String[] xNames) {
this.xNames = xNames;
}
public LineChartMarkView(Context context, ValueFormatter xAxisValueFormatter) {
super(context, R.layout.layout_markview);
this.xAxisValueFormatter = xAxisValueFormatter;
tvDate = findViewById(R.id.tv_date);
tvValue = findViewById(R.id.tv_value);
}
@SuppressLint("SetTextI18n")
@Override
public void refreshContent(Entry e, Highlight highlight) {
//展示自定义X轴值 后的X轴内容
if (xNames!=null && xNames.length>0){
int tag=(int)e.getX() % xNames.length;
if (tag<0)
tag=0;
if (tag>=xNames.length)
tag=xNames.length-1;
try {
String intNumber = xNames[tag].substring(0,xNames[tag].indexOf("."));
String intNumber2 = xNames[tag].substring(xNames[tag].indexOf(".")+1,xNames[tag].length());
tvDate.setText(intNumber+"月"+intNumber2+"日");
}catch (Exception ee){
ee.printStackTrace();
}
}
tvValue.setText("总销售额:" + getTenThousandOfANumber(e.getY()) + "元");
super.refreshContent(e, highlight);
}
@Override
public MPPointF getOffset() {
return new MPPointF(-(getWidth() / 2), -getHeight());
}
public String getTenThousandOfANumber(float num) {
if (num < 10000) {
return String.valueOf((int) num);
}
DecimalFormat df = new DecimalFormat("#.0");
df.setRoundingMode(RoundingMode.FLOOR);
String numStr = df.format(num / 10000d);
String[] ss = numStr.split("\\.");
if ("0".equals(ss[1])) {
return ss[0] + "万";
} else {
return numStr + "万";
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_square"
android:alpha="0.6"
android:orientation="vertical">
<TextView
android:id="@+id/tv_date"
android:layout_width="wrap_content"
android:layout_marginLeft="11dp"
android:layout_height="wrap_content"
android:textColor="@android:color/white" />
<TextView
android:id="@+id/tv_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@mipmap/tag_total"
android:drawablePadding="4dp"
android:layout_marginTop="5dp"
android:textColor="@android:color/white" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private LineChart mLineChart;
private List<String> xAxisValues;
private List<Float> yAxisValues;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLineChart = (LineChart) findViewById(R.id.lineChart);
initData();
LineChartManager lineChartManager = new LineChartManager(this, mLineChart);
lineChartManager.showLineChart(xAxisValues, yAxisValues);
}
private void initData() {
xAxisValues = new ArrayList<>();
xAxisValues.add("09.24");
xAxisValues.add("09.25");
xAxisValues.add("09.26");
xAxisValues.add("09.27");
xAxisValues.add("09.28");
xAxisValues.add("09.29");
xAxisValues.add("09.30");
yAxisValues = new ArrayList<>();
yAxisValues.add(3847409.86f);
yAxisValues.add(1200000.5f);
yAxisValues.add(1300000.5f);
yAxisValues.add(1400000.5f);
yAxisValues.add(1600000.5f);
yAxisValues.add(1250000.5f);
yAxisValues.add(1700000.5f);
}
}
多条折线图
public class MultilLineChartManager {
private Context mContext;
//折线图对象LineChart
private LineChart mLineChart;
//x轴实例对象
private XAxis mXAxis;
//左边y轴实例对象
private YAxis mLeftAxis;
//右边y轴实例对象
private YAxis mRightAxis;
//图例对象
private Legend mLegend;
private List<Integer> colorList;
public MultilLineChartManager(Context context, LineChart lineChart) {
this.mLineChart = lineChart;
mContext = context;
colorList=new ArrayList<>();
colorList.add(Color.parseColor("#FFA65A"));
colorList.add(Color.parseColor("#92AAFF"));
colorList.add(Color.parseColor("#2CC8CA"));
colorList.add(Color.parseColor("#AAAAAA"));
mXAxis = lineChart.getXAxis();
mLeftAxis = lineChart.getAxisLeft();
mRightAxis = lineChart.getAxisRight();
mLegend = lineChart.getLegend();
initLinechart();
}
private void initLinechart() {
//设置折线图属性
setBarChartProperties();
//设置X轴
setXAxis();
//设置左边Y轴
setLeftAxis();
//设置右边Y轴
setRightAxis();
//设置图例
setLegend(false);
//设置限制线
//setLimitLine();
}
/**
* 设置折线图属性
*/
private void setBarChartProperties() {
//设置背景颜色
mLineChart.setBackgroundColor(Color.WHITE);
//是否显示网格背景
mLineChart.setDrawGridBackground(false);
//无数据时显示
mLineChart.setNoDataText("统计数据为空");
//隐藏描述
mLineChart.getDescription().setEnabled(false);
//是否显示边界
mLineChart.setDrawBorders(false);
//如果图表中显示超过60个条目,则不会绘制任何折线图的值
//mLineChart.setMaxVisibleValueCount(60);
//缩放现在只能在x轴和y轴上分别进行
mLineChart.setPinchZoom(false);
//设置动画效果
//mLineChart.animateXY(2000, 2000);
//设置可缩放,默认可缩放
mLineChart.setScaleEnabled(true);
// mLineChart.setScaleXEnabled(true);
// mLineChart.setScaleYEnabled(true);
//支持触控手势
mLineChart.setTouchEnabled(true);
// 支持拖动
mLineChart.setDragEnabled(true);
mLineChart.setDoubleTapToZoomEnabled(false);
}
/**
* 设置X轴
*/
private void setXAxis() {
//X轴对象实例
mXAxis = mLineChart.getXAxis();
//设置X轴的位置
mXAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
//隐藏水平网格线
//mXAxis.setGridColor(Color.TRANSPARENT);
mXAxis.setDrawGridLines(false);
//设置x抽的值每隔多少个显示
mXAxis.setGranularity(1f);
//设置x抽的值倾斜显示
//mXAxis.setLabelRotationAngle(-60);
//设置文字颜色
// mXAxis.setTextColor(Color.RED);
//格式化x抽显示的值
/* mXAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return xAxisValues.get((int) value);
}
});*/
}
/**
* 设置右边Y轴
*/
private void setRightAxis() {
//右边Y轴对象实例
mRightAxis = mLineChart.getAxisRight();
//是否启用该轴
mRightAxis.setEnabled(false);
// 保证Y轴从0开始,不然会上移一点
mRightAxis.setAxisMinimum(0f);
// 设置y轴的刻度数
//mRightAxis.setLabelCount(8, false);
}
/**
* 设置左边Y轴
*/
private void setLeftAxis() {
//启用该轴
mLeftAxis.setEnabled(true);
// 保证Y轴从0开始,不然会上移一点
mLeftAxis.setAxisMinimum(0f);
// 设置y轴的刻度数,可以不设置,自动适应
//mLeftAxis.setLabelCount(10, false);
//设置Y轴的值显示在外面
mLeftAxis.setPosition(YAxis.YAxisLabelPosition.OUTSIDE_CHART);
//设置坐标轴宽度
//mLeftAxis.setAxisLineWidth(5f);
//设置轴上最高位置在表中最高位置的顶部间距,占总轴的百分比。
//mLeftAxis.setSpaceTop(20f);
//设置Y轴网格线为虚线
mLeftAxis.enableGridDashedLine(10f, 10f, 0f);
//格式化y抽显示的值
mLeftAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value) {
if (value < 10000) {
return ((int) value) + "";
} else {
return ((int) (value / 10000)) + " 万";
}
}
});
}
/**
* @param xAxisValues x轴的值
* @param datas y轴的值
*/
public void showLineChart(final List<String> xAxisValues, List<List<Float>> datas) {
//点击弹窗显示值
showMarkerView(xAxisValues);
//通过下面两句代码实现左右滚动
// float ratio = (float) yAxisValues.size() / (float) 10;//我默认手机屏幕上显示10剩下的滑动直方图然后显示。
// 假如要显示25个 那么除以10 就是放大2.5f
//mLineChart.zoom(ratio, 1f, 0, 0);//显示的时候是按照多大的比率缩放显示 1f表示不放大缩小
//设置x轴的值
mXAxis.setValueFormatter(new IndexAxisValueFormatter(xAxisValues));
// 设置X轴的刻度数,第二个参数表示是否平均分配
mXAxis.setLabelCount(xAxisValues.size(), false);
ArrayList<ILineDataSet> dataSets = new ArrayList<>();
for (int i = 0; i < datas.size(); i++) {
//y轴的值
ArrayList<Entry> entries = new ArrayList<>();
List<Float> yAxisValues = datas.get(i);
for (int j = 0; j < yAxisValues.size(); j++) {
entries.add(new BarEntry(j, yAxisValues.get(j)));
}
//LineDataSet lineDataSet = new LineDataSet(entries, "The year 2018");
LineDataSet lineDataSet = new LineDataSet(entries, null);
//显示填充颜色
lineDataSet.setDrawFilled(true);
//设置填充颜色
lineDataSet.setFillColor(colorList.get(i));
//lineDataSet.setFillAlpha(100);
//设置填充背景图
//Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.fade_linechart)
//lineDataSet.setFillDrawable(drawable)
//是否显示折线图上的值
lineDataSet.setDrawValues(false);
//lineDataSet.setDrawIcons(true);
//折线图上的值保留几位小数
//lineDataSet.setValueFormatter(new DefaultValueFormatter(2));
//折线图颜色
lineDataSet.setColor(colorList.get(i));
//折线图上值的颜色
//lineDataSet.setValueTextColor(Color.RED);
//lineDataSet.setValueTextSize(20f);
//lineDataSet.setLineWidth(1f);
lineDataSet.setDrawCircles(true);
lineDataSet.setCircleColor(colorList.get(i));
//lineDataSet.setCircleRadius(3f);
//设置曲线值的圆点是实心还是空心
lineDataSet.setDrawCircleHole(true);
// lineDataSet.setFormLineWidth(1f);
//lineDataSet.setFormSize(15.f);
//线模式为圆滑曲线(默认折线)
//lineDataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
lineDataSet.setMode(LineDataSet.Mode.LINEAR);
dataSets.add(lineDataSet);
}
//是否显示折线图上的值,默认显示
//lineDataSet.setDrawValues(true);
LineData data = new LineData(dataSets);
//设置折线图不能点击,默认可点击
data.setHighlightEnabled(true);
//设置折线图大小
// data.setValueTextSize(20f);
// 折线图上值的颜色
//data.setValueTextColor(Color.RED);
mLineChart.setData(data);
}
/**
* 设置图例
*/
private void setLegend(boolean isShowLegend) {
//图例相关设置
mLegend = mLineChart.getLegend();
//是否显示图例
mLegend.setEnabled(isShowLegend);
//显示位置, 左下方
mLegend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
mLegend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
mLegend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
//是否绘制在图表里面
mLegend.setDrawInside(false);
//设置图例形状
mLegend.setForm(Legend.LegendForm.SQUARE);
mLegend.setFormSize(9f);
mLegend.setTextSize(11f);
mLegend.setXEntrySpace(4f);
//设置标签是否换行(当多条标签时 需要换行显示)
mLegend.setWordWrapEnabled(true);
}
/**
* 点击弹窗显示值
*
* @param xAxisValues
*/
private void showMarkerView(List<String> xAxisValues) {
//创建一个定制的MarkerView(扩展MarkerView) 并指定布局。
//MyMarkerView mv = new MyMarkerView(mContext, R.layout.custom_marker_view);
LineChartMarkView mv = new LineChartMarkView(mContext, mXAxis.getValueFormatter());
String[] array = new String[xAxisValues.size()];
for (int i = 0; i < xAxisValues.size(); i++) {
array[i] = xAxisValues.get(i);
}
mv.setxNames(array);
mv.setChartView(mLineChart);
mLineChart.setMarker(mv);
}
/**
* 设置限制线
*/
private void setLimitLine() {
// x轴限制线
LimitLine llXAxis = new LimitLine(10f, "Index 10");
llXAxis.setLineWidth(4f);
llXAxis.enableDashedLine(10f, 10f, 0f);
llXAxis.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
llXAxis.setTextSize(10f);
mXAxis.enableGridDashedLine(10f, 10f, 0f);
LimitLine ll1 = new LimitLine(150f, "Upper Limit");
ll1.setLineWidth(4f);
ll1.enableDashedLine(10f, 10f, 0f);
ll1.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_TOP);
ll1.setTextSize(10f);
LimitLine ll2 = new LimitLine(-30f, "Lower Limit");
ll2.setLineWidth(4f);
ll2.enableDashedLine(10f, 10f, 0f);
ll2.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM);
ll2.setTextSize(10f);
mLeftAxis.removeAllLimitLines(); // 重置所有限制线以避免重叠线。
mLeftAxis.addLimitLine(ll1);
mLeftAxis.addLimitLine(ll2);
mLeftAxis.setAxisMaximum(200f);
mLeftAxis.setAxisMinimum(-50f);
//mLeftAxis.setYOffset(20f);
mLeftAxis.enableGridDashedLine(10f, 10f, 0f);
mLeftAxis.setDrawZeroLine(false);
// 限制线绘制在数据后面(而不是顶部)
mLeftAxis.setDrawLimitLinesBehindData(true);
}
}
public class MainActivity extends AppCompatActivity {
private LineChart mLineChart;
private List<String> xAxisValues;
private List<Float> yAxisValues;
private List<Float> yAxisValues2;
private List<List<Float>> datas = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLineChart = (LineChart) findViewById(R.id.lineChart);
initData();
MultilLineChartManager multilLineChartManager = new MultilLineChartManager(this, mLineChart);
multilLineChartManager.showLineChart(xAxisValues, datas);
}
private void initData() {
List<List<Float>> datas = new ArrayList<>();
xAxisValues = new ArrayList<>();
xAxisValues.add("09.24");
xAxisValues.add("09.25");
xAxisValues.add("09.26");
xAxisValues.add("09.27");
xAxisValues.add("09.28");
xAxisValues.add("09.29");
xAxisValues.add("09.30");
yAxisValues = new ArrayList<>();
yAxisValues.add(3847409.86f);
yAxisValues.add(1200000.5f);
yAxisValues.add(1300000.5f);
yAxisValues.add(1400000.5f);
yAxisValues.add(1600000.5f);
yAxisValues.add(1250000.5f);
yAxisValues.add(1700000.5f);
yAxisValues2 = new ArrayList<>();
yAxisValues2.add(1320000.5f);
yAxisValues2.add(1200000.5f);
yAxisValues2.add(1460000.5f);
yAxisValues2.add(1300000.5f);
yAxisValues2.add(1500000.5f);
yAxisValues2.add(1350000.5f);
yAxisValues2.add(1600000.5f);
datas.add(yAxisValues);
datas.add(yAxisValues2);
}
}
饼状图
/**
* Created by xiaoyehai on 2018/6/22 0022.
*/
public class PieChartManager implements OnChartValueSelectedListener {
private PieChart mPieChart;
public PieChartManager(PieChart pieChart) {
mPieChart = pieChart;
}
public void showPieChart(List<PieChartData> dataList, String label) {
//是否使用百分比
mPieChart.setUsePercentValues(true);
//设置饼图没有数据时显示的文本
mPieChart.setNoDataText("数据为空");
//隐藏描述
mPieChart.getDescription().setEnabled(false);
//设置饼图圆圈离屏幕的边距
mPieChart.setExtraOffsets(5, 10, 5, 5);
//设置阻力摩擦系数[0,1]
mPieChart.setDragDecelerationFrictionCoef(0.95f);
//设置字体
//mPieChart.setCenterTextTypeface(mTfLight);
//mPieChart.setCenterText(generateCenterSpannableText());
//设置图饼中心是否是空心
mPieChart.setDrawHoleEnabled(true);
//设置空心的颜色
mPieChart.setHoleColor(Color.WHITE);
//设置环形图与中间空心圆之间的环形的颜色
mPieChart.setTransparentCircleColor(Color.WHITE);
//设置环形图与中间空心圆之间圆环的的透明度
mPieChart.setTransparentCircleAlpha(110);
//设置圆孔半径
mPieChart.setHoleRadius(58f);
//设置半透明圈的宽度
mPieChart.setTransparentCircleRadius(61f);
//设置中心圆是否可以显示文字
mPieChart.setDrawCenterText(true);
//设置中心园显示文字
//mPieChart.setCenterText("我是中心圆");
//设置初始时的角度
mPieChart.setRotationAngle(0);
//设置是否可以手动旋转
mPieChart.setRotationEnabled(true);
//设置点击Item高亮是否可用
mPieChart.setHighlightPerTapEnabled(true);
//饼状图上是否显示x轴的值,默认显示
// mPieChart.setDrawEntryLabels(false);
// mPieChart.setUnit(" €");
// mPieChart.setDrawUnitsInChart(true);
// 点击事件
mPieChart.setOnChartValueSelectedListener(this);
setData(dataList, label);
//设置动画效果
mPieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
// mPieChart.spin(2000, 0, 360);
//获取饼图图例
Legend l = mPieChart.getLegend();
//设置是否启用图列
l.setEnabled(true);
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
l.setOrientation(Legend.LegendOrientation.VERTICAL);
l.setDrawInside(false);
l.setXEntrySpace(7f); //设置图例实体之间延X轴的间距(setOrientation = HORIZONTAL有效)
l.setYEntrySpace(0f);
l.setYOffset(0f);
//l.setFormSize(15f);
//l.setTextSize(14f);
//l.setForm(Legend.LegendForm.DEFAULT); //设置图例的形状,默认正方形
//设置图表文字颜色
mPieChart.setEntryLabelColor(Color.WHITE);
//mPieChart.setEntryLabelTypeface(mTfRegular);
//设置图表文字大小
mPieChart.setEntryLabelTextSize(12f);
}
private void setData(List<PieChartData> dataList, String label) {
ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
for (int i = 0; i < dataList.size(); i++) {
entries.add(new PieEntry(dataList.get(i).getValue(), dataList.get(i).getName()));
}
PieDataSet dataSet = new PieDataSet(entries, label);
dataSet.setDrawIcons(false);
dataSet.setSliceSpace(3f);
dataSet.setIconsOffset(new MPPointF(0, 40));
dataSet.setSelectionShift(5f);
//饼状图上是否显示y轴的值,默认显示
//dataSet.setDrawValues(false);
// add a lot of colors
ArrayList<Integer> colors = new ArrayList<Integer>();
for (int c : ColorTemplate.VORDIPLOM_COLORS)
colors.add(c);
for (int c : ColorTemplate.JOYFUL_COLORS)
colors.add(c);
for (int c : ColorTemplate.COLORFUL_COLORS)
colors.add(c);
for (int c : ColorTemplate.LIBERTY_COLORS)
colors.add(c);
for (int c : ColorTemplate.PASTEL_COLORS)
colors.add(c);
colors.add(ColorTemplate.getHoloBlue());
dataSet.setColors(colors);
//dataSet.setSelectionShift(0f);
PieData data = new PieData(dataSet);
data.setValueFormatter(new PercentFormatter());
data.setValueTextSize(11f);
data.setValueTextColor(Color.WHITE);
//data.setValueTypeface(mTfLight);
mPieChart.setData(data);
// undo all highlights
mPieChart.highlightValues(null);
mPieChart.invalidate();
}
@Override
public void onValueSelected(Entry e, Highlight h) {
}
@Override
public void onNothingSelected() {
}
}
/**
* 饼状图
*/
public class PieChartActivity extends AppCompatActivity {
private PieChart mPieChart;
private List<PieChartData> dataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pie_chart);
mPieChart = (PieChart) findViewById(R.id.piechart);
initData();
new PieChartManager(mPieChart).showPieChart(dataList, "");
}
private void initData() {
for (int i = 0; i < 10; i++) {
PieChartData pieChartData = new PieChartData("数据" + i, 10 + i * 3f);
dataList.add(pieChartData);
}
}
}
/**
* Created by xiaoyehai on 2018/6/22 0022.
*/
public class PieChartData {
/**
* name : 自然保护区核心区和缓冲区
* value : 4
*/
private String name;
private float value;
public PieChartData() {
}
public PieChartData(String name, float value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getValue() {
return value;
}
public void setValue(float value) {
this.value = value;
}
}
折线饼状图
/**
* Created by xiaoyehai on 2018/6/22 0022.
*/
public class PiePolylineChartManager implements OnChartValueSelectedListener {
private PieChart mPieChart;
public PiePolylineChartManager(PieChart pieChart) {
this.mPieChart = pieChart;
}
public void showPieChart(List<PieChartData> dataList, String label) {
//是否使用百分比
mPieChart.setUsePercentValues(true);
//设置饼图没有数据时显示的文本
mPieChart.setNoDataText("数据为空");
//隐藏描述
mPieChart.getDescription().setEnabled(false);
//设置饼图圆圈离屏幕的边距
// mPieChart.setExtraOffsets(5, 10, 5, 5);
mPieChart.setExtraOffsets(5, 20, 5, 20);
//设置阻力摩擦系数[0,1]
mPieChart.setDragDecelerationFrictionCoef(0.95f);
//设置字体
//tf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");
//mPieChart.setCenterTextTypeface(Typeface.createFromAsset(getAssets(), "OpenSans-Light.ttf"));
//mPieChart.setCenterText(generateCenterSpannableText());
mPieChart.setExtraOffsets(20.f, 0f, 20.f, 10f);
//设置图饼中心是否是空心
mPieChart.setDrawHoleEnabled(false);
//设置空心的颜色
mPieChart.setHoleColor(Color.WHITE);
//设置环形图与中间空心圆之间的环形的颜色
mPieChart.setTransparentCircleColor(Color.WHITE);
//设置环形图与中间空心圆之间圆环的的透明度
mPieChart.setTransparentCircleAlpha(110);
//设置圆孔半径
mPieChart.setHoleRadius(58f);
//设置半透明圈的宽度
mPieChart.setTransparentCircleRadius(61f);
//设置中心圆是否可以显示文字
mPieChart.setDrawCenterText(true);
//设置中心园显示文字
//mPieChart.setCenterText("我是中心圆");
//设置初始时的角度
mPieChart.setRotationAngle(0);
//设置是否可以手动旋转
mPieChart.setRotationEnabled(true);
mPieChart.setHighlightPerTapEnabled(true);
//饼状图上是否显示x轴的值,默认显示
mPieChart.setDrawEntryLabels(false);
// mPieChart.setUnit(" €");
// mPieChart.setDrawUnitsInChart(true);
//设置点击Item高亮是否可用
mPieChart.setOnChartValueSelectedListener(this);
setData(dataList, label);
//设置动画效果
mPieChart.animateY(1400, Easing.EasingOption.EaseInOutQuad);
// mPieChart.spin(2000, 0, 360);
//获取饼图图例
Legend l = mPieChart.getLegend();
//设置是否启用图列
l.setEnabled(true);
l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.RIGHT);
l.setOrientation(Legend.LegendOrientation.VERTICAL);
l.setDrawInside(false);
}
public void setData(List<PieChartData> list, String label) {
List<PieChartData> dataList = new ArrayList<>();
if (list.size() > 10) {
float sum = 0;
for (PieChartData pieChartData : list) {
String value = pieChartData.getValue();
float v = Float.parseFloat(value);
sum += v;
Log.e("xyh", sum + "");
}
float temp = 0;
for (PieChartData pieChartData : list) {
String value = pieChartData.getValue();
float v = Float.parseFloat(value);
float v1 = v / sum;
if (v1 >= 0.015) {
dataList.add(pieChartData);
}
if (v1 < 0.015) {
temp += v1;
}
}
dataList.add(new PieChartData("其他", temp * sum + ""));
} else {
for (PieChartData pieChartData : list) {
dataList.add(pieChartData);
}
}
ArrayList<PieEntry> entries = new ArrayList<PieEntry>();
for (int i = 0; i < dataList.size(); i++) {
entries.add(new PieEntry(Float.parseFloat(dataList.get(i).getValue()), dataList.get(i).getName()));
}
PieDataSet dataSet = new PieDataSet(entries, label);
dataSet.setSliceSpace(0f); //设置饼块之间的间隔
dataSet.setSelectionShift(5f); //设置饼块选中时偏离饼图中心的距离
// add a lot of colors
ArrayList<Integer> colors = new ArrayList<Integer>();
for (int c : ColorTemplate.VORDIPLOM_COLORS)
colors.add(c);
for (int c : ColorTemplate.JOYFUL_COLORS)
colors.add(c);
for (int c : ColorTemplate.COLORFUL_COLORS)
colors.add(c);
for (int c : ColorTemplate.LIBERTY_COLORS)
colors.add(c);
for (int c : ColorTemplate.PASTEL_COLORS)
colors.add(c);
colors.add(ColorTemplate.getHoloBlue());
dataSet.setColors(colors); //设置饼块的颜色
//dataSet.setSelectionShift(0f);
dataSet.setValueLinePart1OffsetPercentage(80f); //数据连接线距图形片内部边界的距离,为百分数(0~100f)
dataSet.setValueLinePart1Length(0.4f); //设置连接线的长度
dataSet.setValueLinePart2Length(0.8f);
//dataSet.setValueLineColor(Color.BLUE);//设置连接线的颜色
//dataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
dataSet.setYValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
PieData data = new PieData(dataSet);
data.setDrawValues(true); //饼状图上显示值
//data.setValueFormatter(new PercentFormatter());
final DecimalFormat mFormat = new DecimalFormat("###,###,##0.0");
data.setValueFormatter(new IValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
PieEntry pieEntry = (PieEntry) entry;
return pieEntry.getLabel() + " " + mFormat.format(value) + "%";
}
});
data.setValueTextSize(11f);
data.setValueTextColor(Color.BLACK);
mPieChart.setData(data);
// undo all highlights
mPieChart.highlightValues(null);
mPieChart.invalidate();
}
@Override
public void onValueSelected(Entry e, Highlight h) {
}
@Override
public void onNothingSelected() {
}
}