一、用MPAndroidChart制作柱状图(有详细注释)
package com.example.daohang;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarDataSet;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.utils.ViewPortHandler;
import java.util.ArrayList;
import java.util.List;
public class F_ym5 extends Fragment {
private BarChart bc;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.f_ym5,null);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
bc = view.findViewById(R.id.ym5_bc_ddx);
setDesc();//设置Title
setLegend();//设置图例
setXAxis();//设置X坐标
setYAxis();//设置Y坐标
loadData();//载入数据
}
//设置Title
private void setDesc() {
Description description = bc.getDescription();
// 获取屏幕中间x 轴的像素坐标
WindowManager wm=(WindowManager)getActivity().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
float x = dm.widthPixels / 2;
description.setPosition(0,0);//设置X轴的位置
description.setText("");//图表说明性文字
description.setTextSize(16f);
description.setTextColor(Color.BLACK);
bc.setDescription(description);
}
//设置图例
private void setLegend() {
Legend legend = bc.getLegend();
legend.setEnabled(false);//隐藏图例
legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);//设置排列方式
legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);//
legend.setDrawInside(true);
legend.setTextSize(14f);
legend.setTypeface(Typeface.DEFAULT_BOLD);
legend.setXOffset(30);
legend.setOrientation(Legend.LegendOrientation.VERTICAL);
legend.setTypeface(Typeface.DEFAULT_BOLD);
}
//设置Y轴
private void setYAxis() {
bc.getAxisRight().setEnabled(false);//设置Y轴右侧轴不显示
YAxis yAxis = bc.getAxisLeft();//取得Y轴左侧轴对象
yAxis.setTextSize(10f);//设置字体大小
yAxis.setTextColor(Color.BLACK);//设置文本颜色
yAxis.setXOffset(0);//设置在X轴方向的偏移量
yAxis.setAxisMaximum(800f);//Y轴最大值
yAxis.setAxisMinimum(-800f);//Y轴最小值
yAxis.setGranularity(200f);//设置中间距
yAxis.setLabelCount(3);//设置坐标分栏数
yAxis.setInverted(false);//设置Y轴是否翻转
yAxis.setDrawLabels(true);//是否显示标签
}
//设置X轴
private void setXAxis() {
XAxis xAxis = bc.getXAxis();//取得X轴对象
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//X轴标签的位置
xAxis.setTextSize(10f);//标签字体大小
xAxis.setTypeface(Typeface.DEFAULT_BOLD);//设置文本的字体
xAxis.setDrawGridLines(false);//设置为true,则绘制网格线。
xAxis.setLabelCount(30,true);//设置坐标轴的标签数量
xAxis.setGranularity (0.3f);//设置坐标轴间隔大小
xAxis.setAxisMaximum(30f);//设置坐标轴的最大值
xAxis.setAxisMinimum(0f);//设置坐标轴的最小值
xAxis.setDrawLabels(false);//不显示标签
xAxis.setYOffset(0f);//设置在Y轴方向的偏移量
//自定义格式
xAxis.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
int tep = (int) (9 - value);
return tep + "0后";
}
});
}
//设置数据
private void loadData() {
bc.setExtraOffsets(0,0,0,0);设置偏移量
bc.animateXY(1000,1000);//设置动画
final float d_1[] = {230f, 480f, 480f, 480f,170f,123f,100f,120f,230f, 480f, 480f, 480f,170f,123f,100f,120f};
final float d_2[] = { 120f,600f, 400f, -200f,-80f,-80f,630f, 430f, -120f,380f,120f,600f, 400f, 200f,80f,80f};
List<BarEntry> entries = new ArrayList<BarEntry>();
List<BarEntry> entries1 = new ArrayList<BarEntry>();
for(int i = 0; i < d_1.length; i++){
entries.add(new BarEntry(i,d_1[i]));
//使用BarEntry的构造方法的第三个参数来保存需要在柱块上显示的数据
entries1.add(new BarEntry(i,d_2[i]));
}
BarDataSet barDataSet = new BarDataSet(entries,"数据1");
BarDataSet barDataSet1 = new BarDataSet(entries1,"数据2");
barDataSet.setColor(Color.parseColor("#6D9C00"));
barDataSet.setDrawValues(false);//不绘制文本
barDataSet1.setColor(Color.parseColor("#F07408"));
barDataSet1.setDrawValues(false);//不绘制文本
barDataSet1.setValueTextColor(Color.RED);
barDataSet1.setValueFormatter(new ValueFormatter() {
@Override
public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
//获取entry中的数据
float res = (float) entry.getData();
return String.format("%.1f",res) + "%";
}
});
BarData barData = new BarData(barDataSet1,barDataSet);
barData.setBarWidth(0.3f);//设置柱块的宽度
barData.groupBars(0,-0.3f,0);//设置间距,原点,组间距,组内间距
bc.setData(barData);
}
}