MPAndroid BarChart的Y轴问题,求助

从程序猿到程序员 2017-04-23 03:56:33
先说明问题:
安卓开发中,使用的MPAndroid的第三方库,画了一个柱状图。
barChart.setDrawBorders(false); // //是否在折线图上添加边框

barChart.setDescription("各课程签到率");// 数据描述
barChart.setData(barData); // 设置数据
// 如果没有数据的时候,会显示这个,类似ListView的EmptyView
barChart.setNoDataTextDescription("You need to provide data for the chart.");

barChart.setDrawGridBackground(false); // 是否显示表格颜色
barChart.setGridBackgroundColor(Color.WHITE & 0x70FFFFFF); // 表格的的颜色,在这里是是给颜色设置一个透明度

barChart.setTouchEnabled(true); // 设置是否可以触摸
barChart.setDragEnabled(true);// 是否可以拖拽
barChart.setScaleEnabled(true);// 是否可以缩放
barChart.setScaleYEnabled(true);// 是否可以Y方向的缩放
barChart.setScaleXEnabled(true);// 是否可以X方向的缩放
barChart.setPinchZoom(true);// true,则x和y轴可以用2个手指同时缩放,如果为false,则可以分别缩放x和y轴。

// barChart.setBackgroundColor();// 设置背景

barChart.setDrawBarShadow(false);// 设置是否启动阴影

Legend mLegend = barChart.getLegend(); // 设置比例图标示

mLegend.setForm(LegendForm.CIRCLE);// 样式
mLegend.setFormSize(6f);// 字体
mLegend.setTextColor(Color.BLACK);// 颜色
barChart.getAxisRight().setEnabled(false);// 隐藏右边的坐标轴
// barChart.getAxisLeft().setAxisMinValue(0f);
// barChart.getAxisLeft().setAxisMaxValue(100f);
Matrix m = new Matrix();
m.postScale(1.1f, 1f);// 两个参数分别是x,y轴的缩放比例。例如:将x轴的数据放大为之前的1.5倍
barChart.getViewPortHandler().refresh(m, barChart, false);// 将图表动画显示之前进行缩放

// X轴设定
// XAxis xAxis = barChart.getXAxis();
// xAxis.setPosition(XAxisPosition.TOP);
barChart.animateXY(0, 1000); // 立即执行的动画,y轴方向

这是原有代码。效果图如下:

问题:我想让Y轴上面是100,底部是0,中间的数据自动压缩显示。 我查了很多资料都没答案。
我添加了
barChart.getAxisLeft().setAxisMinValue(0f);

效果图如下:

我又添加了
barChart.getAxisLeft().setAxisMaxValue(100f);

效果图:

都不能满足我的要求。
我看了相关的资料,说Y轴是跟着数据自动变化的。有没有办法改变使他从0到100显示呢?
先谢谢大家了。我的这个是在Fragment里面的。
...全文
1372 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 ink_s 的回复:
[quote=引用 6 楼 u012525096 的回复:] [quote=引用 5 楼 ink_s 的回复:] 再次试了下 只需要加上barChart.getAxisLeft().setAxisMaxValue(100f);一项就可以了
我上的图都是加了您说的代码的显示图,代码是原来的代码。 你把数据改成小点的 例如10,20,30, 然后可以显示100么?[/quote] 你可以看看代码[/quote] 我跟了下代码流程,发现必须要在设置数据前设置这些属性。设置数据的时候自动计算范围了。 已经解决了,还是谢谢你~ 别人的东西,还是得看看源码
  • 打赏
  • 举报
回复
引用 5 楼 ink_s 的回复:
再次试了下 只需要加上barChart.getAxisLeft().setAxisMaxValue(100f);一项就可以了
我上的图都是加了您说的代码的显示图,代码是原来的代码。 你把数据改成小点的 例如10,20,30, 然后可以显示100么?
ink_s 2017-04-24
  • 打赏
  • 举报
回复
再次试了下 只需要加上barChart.getAxisLeft().setAxisMaxValue(100f);一项就可以了
ink_s 2017-04-24
  • 打赏
  • 举报
回复
没看到你的 barChart.getAxisLeft().setStartAtZero(true);//重0开始 barChart.getAxisLeft().setAxisMaxValue(100f);//最大值100 啊
  • 打赏
  • 举报
回复
引用 2 楼 ink_s 的回复:
1.

barChart.getAxisLeft().setStartAtZero(true);//重0开始

barChart.getAxisLeft().setAxisMaxValue(100f);//最大值100

这样就可以了 ,亲测


2.barChart.getAxisLeft().setAxisMaxValue(100f);
然后加上
barChart.getAxisLeft().setShowOnlyMinMax(true);//只显示最大最小坐标,也可以

3.barChart.getAxisLeft().setSpaceTop(50);//设置上边的空白,如果你数据最大25,想设置y最大值为100,那么在25上面再设置75的空白也可以。
barChart.getAxisLeft().setSpaceTop(100-数据最大值);

如果解决了您的问题,请结贴哦,么么哒

根据您的第一个方法,效果图如下:

第二个方法,效果图如下:

第三个方法,效果图如下:

同时,我也测试了左右坐标轴同时设置您的方法,但还是不行。
我贴一下完整代码:
package com.shen.teacher;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.example.biyeshiji1.R;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.mikephil.charting.charts.BarChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.Legend.LegendForm;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.XAxis.XAxisPosition;
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.interfaces.datasets.IBarDataSet;

import android.app.AlertDialog;
import android.app.Dialog;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class StatisticsStudentFragment extends Fragment {
private BarChart bc_student_barChart;
private BarData mBarData;
private Dialog mDialog;
/** 上一个Fragment点击的学生ID */
private String stuID;
/** 上一个Fragment点击的学什么姓名 */
private String stuName;
/** 课程数目 */
private int count;
/** 课程名列表 */
private ArrayList<String> mCourseList = new ArrayList<String>();
/** 签到率列表 */
private ArrayList<String> mRateList = new ArrayList<String>();

public StatisticsStudentFragment(String stuID, String stuName) {
this.stuID = stuID;
this.stuName = stuName;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = null;
view = inflater.inflate(R.layout.fragment_statistics_student_chart,
container, false);
bc_student_barChart = (BarChart) view
.findViewById(R.id.bc_student_barChart);
return view;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new AsyncTask<Void, Void, Void>() {
Socket socket = null;
private String IpAddress = getActivity().getResources().getString(
R.string.ipAddress);
private int Port = Integer.parseInt(getActivity().getResources()
.getString(R.string.Port));

@Override
protected void onPreExecute() {
mDialog = new AlertDialog.Builder(getActivity()).create();
mDialog.show();
// 注意此处要放在show之后 否则会报异常
mDialog.setContentView(R.layout.loading_process_dialog_anim);
}

@Override
protected Void doInBackground(Void... params) {
try {
// 1.创建socket对象,指定服务器端地址和端口号
socket = new Socket(IpAddress, Port);
// 2.创建map,待序列化
Map<String, String> map = new HashMap<String, String>();
// 3. 放入请求码102,请求课程签到列表
map.put("index", "102");
// 4.得到序列化工具
ObjectMapper mapper = new ObjectMapper();
// 5.序列化map为byte[]数组,待发送
byte[] data1 = mapper.writeValueAsBytes(map);
// 6.得到socket连接的输出流
DataOutputStream outputStream = new DataOutputStream(
socket.getOutputStream());
// 7.写入输出流(缓存)
outputStream.write(data1);
// 8.发送数据(此句执行完,数据将到达服务器)
outputStream.flush();
// 9.得到Socket的输入流
DataInputStream inputStream = new DataInputStream(
socket.getInputStream());

// 可做优化:数据内加上长度,方便定义数组长度
// 10.定义一个接收数据用的byte[]数组
byte[] data2 = new byte[4096];
// 11.阻塞办法读到服务器发来的data2
int len = inputStream.read(data2);
// 12.data2不为空,说明读到了数据
if (len != 0) {
// 13.定义一个map2,用来获取data2
@SuppressWarnings("unchecked")
Map<String, Object> map2 = mapper.readValue(data2,
Map.class);
// 14.判断结果码是否为102
if (map2.get("index").toString().equals("102")) {
// 15.定义一个List<Map<课程名,签到率>>,并赋值,与服务器相同
@SuppressWarnings("unchecked")
List<HashMap<String, String>> courseList = (List<HashMap<String, String>>) map2
.get("coureselist");
// 16.List的长度就是课程数目,List的每一项都是一个Map<课程名,签到率>
count = courseList.size();
// 17.循环遍历,赋值
for (int i = 0; i < count; i++) {
// 18.课程名赋值
mCourseList
.add(courseList.get(i).get("course"));
// 19.签到率赋值
mRateList.add(courseList.get(i).get("rate"));
}
// 20.结束
len = 0;
}
}

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
socket = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}

@Override
protected void onPostExecute(Void result) {
if (mCourseList != null && mRateList != null) {
mBarData = getBarData(count);
showBarChart(bc_student_barChart, mBarData);
}
if (mDialog != null) {
mDialog.dismiss();
}
}

}.execute();
}

/**
* @param barChart
* BarChart对象
* @param barData
* 柱状图数据
* */
/**
* @param barChart
* @param barData
*/
private void showBarChart(BarChart barChart, BarData barData) {
barChart.setDrawBorders(false); // //是否在折线图上添加边框

barChart.setDescription("各课程签到率");// 数据描述
barChart.setData(barData); // 设置数据
// 如果没有数据的时候,会显示这个,类似ListView的EmptyView
barChart.setNoDataTextDescription("You need to provide data for the chart.");

barChart.setDrawGridBackground(false); // 是否显示表格颜色
barChart.setGridBackgroundColor(Color.WHITE & 0x70FFFFFF); // 表格的的颜色,在这里是是给颜色设置一个透明度

barChart.setTouchEnabled(true); // 设置是否可以触摸
barChart.setDragEnabled(true);// 是否可以拖拽
barChart.setScaleEnabled(true);// 是否可以缩放
barChart.setScaleYEnabled(true);// 是否可以Y方向的缩放
barChart.setScaleXEnabled(true);// 是否可以X方向的缩放
barChart.setPinchZoom(true);// true,则x和y轴可以用2个手指同时缩放,如果为false,则可以分别缩放x和y轴。

// barChart.setBackgroundColor();// 设置背景

barChart.setDrawBarShadow(false);// 设置是否启动阴影

Legend mLegend = barChart.getLegend(); // 设置比例图标示

mLegend.setForm(LegendForm.CIRCLE);// 样式
mLegend.setFormSize(6f);// 字体
mLegend.setTextColor(Color.BLACK);// 颜色
barChart.getAxisRight().setEnabled(false);// 隐藏右边的坐标轴


// barChart.getAxisLeft().setAxisMinValue(0f);
// barChart.getAxisLeft().setAxisMaxValue(100f);
Matrix m = new Matrix();
m.postScale(1.1f, 1f);// 两个参数分别是x,y轴的缩放比例。例如:将x轴的数据放大为之前的1.1倍
barChart.getViewPortHandler().refresh(m, barChart, false);// 将图表动画显示之前进行缩放

// X轴设定
// XAxis xAxis = barChart.getXAxis();
// xAxis.setPosition(XAxisPosition.TOP);
barChart.animateXY(0, 1000); // 立即执行的动画,y轴方向

}

/**
* @param count
* 数据个数
*
* */
private BarData getBarData(int count) {
List<String> xValues = mCourseList;

List<BarEntry> yValues = new ArrayList<BarEntry>();

for (int i = 0; i < count; i++) {
float value = Float.parseFloat(mRateList.get(i));
yValues.add(new BarEntry(value, i));
}

// y轴的数据集合
BarDataSet barDataSet = new BarDataSet(yValues, stuName);

barDataSet.setColor(Color.rgb(114, 188, 223));

List<IBarDataSet> barDataSets = new ArrayList<IBarDataSet>();
barDataSets.add(barDataSet); // add the datasets

BarData barData = new BarData(xValues, barDataSets);

return barData;
}
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<com.github.mikephil.charting.charts.BarChart
android:id="@+id/bc_student_barChart"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

</LinearLayout>

这是布局
整个是加载在fragment中的,上面是socket获得列表,下面是给柱状图设置添加数据。

ink_s 2017-04-24
  • 打赏
  • 举报
回复
1. barChart.getAxisLeft().setStartAtZero(true);//重0开始 barChart.getAxisLeft().setAxisMaxValue(100f);//最大值100 这样就可以了 ,亲测 2.barChart.getAxisLeft().setAxisMaxValue(100f); 然后加上 barChart.getAxisLeft().setShowOnlyMinMax(true);//只显示最大最小坐标,也可以 3.barChart.getAxisLeft().setSpaceTop(50);//设置上边的空白,如果你数据最大25,想设置y最大值为100,那么在25上面再设置75的空白也可以。 barChart.getAxisLeft().setSpaceTop(100-数据最大值); 如果解决了您的问题,请结贴哦,么么哒
ink_s 2017-04-24
  • 打赏
  • 举报
回复
引用 6 楼 u012525096 的回复:
[quote=引用 5 楼 ink_s 的回复:] 再次试了下 只需要加上barChart.getAxisLeft().setAxisMaxValue(100f);一项就可以了
我上的图都是加了您说的代码的显示图,代码是原来的代码。 你把数据改成小点的 例如10,20,30, 然后可以显示100么?[/quote] 你可以看看代码
  • 打赏
  • 举报
回复
有大佬用这个绘图的么?

80,492

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧