在APP开发中遇到图表的样式,一般我们要先查询GitHub上比较火的开源框架,这种图标应用广泛,统计、游戏统计、人际关系图等等,用到今天的这个框架MPAndroidChart 点击查看GitHub
一个可以拖动缩放的图表库,包含曲线图、直方图、饼状图,其中直方图支持3d效果。
8种不同的图表类型
在两个轴上缩放(使用触摸手势,单独轴或捏缩放)
拖动/平移(使用触摸手势)
组合图(线,条,散射,蜡烛数据)
双(单独)轴
可定制轴(x轴和y轴)
突出显示值(具有可自定义的弹出式视图)
将图表保存到SD卡(作为图像或.txt文件)
预定义颜色模板
图例(自动生成,可自定义)
动画(在xPx和yPx轴上建立动画)
限制线(提供附加信息,最大值…)
完全可定制(油漆,字体,图例,颜色,背景,手势,虚线,…)
在Line和BarChart中可以平滑地缩放和滚动多达30.000个数据点
Gradle支持
直接从数据作图Realm.io移动数据库:MPAndroidChart-境界 ⚡️
为了使用库,有4个不同的选项:
下面添加到项目层面build.gradle:
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
或者
dependencies {
compile 'com.github.PhilJay:MPAndroidChart:v3.0.1'
}
或者
添加以下到您的部分pom.xml:
<repository>
<id>jitpack.ioid>
<url>https://jitpack.iourl>
repository>
或者
添加以下到您的部分pom.xml:
<dependency>
<groupId>com.github.PhilJaygroupId>
<artifactId>MPAndroidChartartifactId>
<version>v3.0.1version>
dependency>
LineChart (线性图表)
Combined-Chart (组合图表)
BarChart (条形图表)
Horizontal-BarChart(水平条形图表)
PieChart(圆形图表)
ScatterChart(分散式图表)
CandleStickChart(烛台图表)
BubbleChart (气泡图表)
RadarChart(雷达图表)
在.xml中定义它:
<com.github.mikephil.charting.charts.LineChart
android:id="@+id/chart"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在代码中找到
LineChart chart = (LineChart) findViewById(R.id.chart);
代码实现
LineChart chart = new LineChart(Context);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout);
rl.add(chart); // add the programmatically created chart
在拥有图表实例后,可以创建数据并将其添加到图表中。此示例使用LineChart,其中Entry类在图表中用x和y坐标表示单个条目。其他图表类型,如BarChart使用其他类(例如BarEntry)为此目的。
YourData[] dataObjects = ...;
List entries = new ArrayList();
for (YourData data : dataObjects) {
entries.add(new Entry(data.getValueX(), data.getValueY()));
}
然后,需要将List创建的LineDataSet对象添加到。DataSet对象保存属于一起的数据,并允许该数据的单独样式。下面使用的“标签”只有一个描述性的目的,并显示在Legend,如果启用。
LineDataSet dataSet = new LineDataSet(entries, "Label"); // add entries to dataset
dataSet.setColor(...);
dataSet.setValueTextColor(...); // styling, ...
最后,需要将LineDataSet创建的一个或多个对象添加到LineData对象。此对象包含由Chart实例表示的所有数据,并允许进一步的样式。创建数据对象后,可以将其设置为图表并刷新:
LineData lineData = new LineData(dataSet);
chart.setData(lineData);
chart.invalidate(); // refresh
LineChart
如果要向图表添加值(数据),则必须通过
public void setData(ChartData data) { ... }
方法。该基类ChartData(ChartData)类封装在渲染过程中所需图表的所有数据和信息。对于每个类型的图表,不同的亚类ChartData(如LineData)存在应该用于该图表设定数据。在构造函数中,你可以交出一个List
/ * *列表构造* /
public LineData(List sets) { ... }
/ * *构造与一个或多个对象ILineDataSet * /
public LineData(ILineDataSet...) { ... }
那么,什么是一个DataSet和你为什么需要它?这实际上很简单。一个DataSet对象代表一组条目(如类Entry属于一起在图表内)。它的目的是在图表中逻辑上分离的值的不同的组。对于每种类型的图表,一个对象不同的充扩展DataSet(如LineDataSet)存在允许特定的造型。
举个例子,你可能想显示两个不同公司的季度收入超过一年的一个LineChart。在这种情况下,将建议创建两个不同的LineDataSet对象,每个对象包含四个值(每个季度)。
当然,它也可以提供只有一个LineDataSet含有两个公司的所有8个值的对象。
因此,如何建立一个LineDataSet对象呢?
public LineDataSet(List entries, String label) { ... }
当在构造寻找(不同的构造提供),它是可见的,该LineDataSet需要的List类型的Entry和一个String用于描述LineDataSet和作为用于标签Legend。此外,这种标签可以用来寻找LineDataSet除其他LineDataSet中的对象LineData的对象。
所述List类型的Entry封装的图表的所有值。一个Entry目的是围绕一个X和Y值在图表中的条目的另外的包装:
public Entry(float x, float y) { ... }
综合考虑(两家公司季度收入超过一年的例子):
List<Entry> valsComp1 = new ArrayList<Entry>();
List<Entry> valsComp2 = new ArrayList<Entry>();
然后,填写列出了与Entry对象。确保输入对象包含x轴的正确索引。
Entry c1e1 = new Entry(0f, 100000f); // 0 == quarter 1
valsComp1.add(c1e1);
Entry c1e2 = new Entry(1f, 140000f); // 1 == quarter 2 ...
valsComp1.add(c1e2);
// and so on ...
Entry c2e1 = new Entry(0f, 130000f); // 0 == quarter 1
valsComp2.add(c2e1);
Entry c2e2 = new Entry(1f, 115000f); // 1 == quarter 2 ...
valsComp2.add(c2e2);
//...
LineDataSet可以创建对象:
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
setComp1.setAxisDependency(AxisDependency.LEFT);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
setComp2.setAxisDependency(AxisDependency.LEFT);
List<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
dataSets.add(setComp1);
dataSets.add(setComp2);
LineData data = new LineData(dataSets);
mLineChart.setData(data);
mLineChart.invalidate(); // refresh
如果我们想要更多的描述性值添加到x轴(而非数字范围从0到3对不同的位置)中,我们可以通过使用这样做IAxisValueFormatter的界面。该接口允许在绘制值的定制造型XAxis。在此示例中,格式化程序可能如下所示:
//应在X轴绘制的标签
final String[] quarters = new String[] { "Q1", "Q2", "Q3", "Q4" };
IAxisValueFormatter formatter = new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
return quarters[(int) value];
}
//我们不画数字,所以不需要小数位数
@Override
public int getDecimalDigits() { return 0; }
};
XAxis xAxis = mLineChart.getXAxis();
xAxis.setGranularity(1f); //最小轴步骤(间隔)为1
xAxis.setValueFormatter(formatter);
条目的顺序
请注意,这个库并不正式支持绘图LineChart从数据Entry不被按升序方式条目的x位置排序列表
以未排序的方式添加条目可能会导致正确的绘图,但也可能导致意外的行为。一个List的Entry对象可以使用手动排序或EntryXComparator:
List entries = ...;
Collections.sort(entries, new EntryXComparator());
为什么这是必需的原因是因为库使用二进制搜索算法有更好的表现只能工作有序列表。
可以为a设置数据的方式BarChart非常类似于LineChart。主要区别是需要用于设置数据的数据对象(例如,BarEntry而不是Entry)。除此之外,BarChart有不同的样式选项。
请考虑以下填充BarChart数据的示例:
List entries = new ArrayList<>();
entries.add(new BarEntry(0f, 30f));
entries.add(new BarEntry(1f, 80f));
entries.add(new BarEntry(2f, 60f));
entries.add(new BarEntry(3f, 50f));
// gap of 2f
entries.add(new BarEntry(5f, 70f));
entries.add(new BarEntry(6f, 60f));
BarDataSet set = new BarDataSet(entries, "BarDataSet");
在上面的示例中,BarEntry创建了五个对象并将其添加到a BarDataSet。注意,在第四和第五条目之间的x位置上存在间隙“2”。
BarData data = new BarData(set);
data.setBarWidth(0.9f); //设置自定义条形宽度
chart.setData(data);
chart.setFitBars(true); //使x轴完全适合所有条形
chart.invalidate(); // refresh
在上面的代码段中,BarData创建了一个对象。当BarEntry图表的对象被创建时,我们在每个条的(中心)之间的x轴上留出了“1f”的空间。通过将条宽设置为0.9f,我们有效地在每个条之间创建一个0.1f的空间。的setFitBars(true)通话将告诉图表进行调整的范围x轴值恰好适合所有的条形。
创建BarData对象后,我们将其设置为图表并刷新。结果应该接近如下所示:
从版本v3.0.0开始,MPAndroidChart支持绘图条显式分组(在这种情况下库将处理x位置)或用户定义,这意味着用户可以通过改变x位置的条形位置。
YourData[] group1 = ...;
YourData[] group2 = ...;
List entriesGroup1 = new ArrayList<>();
List entriesGroup2 = new ArrayList<>();
//填写名单
for(int i = 0; i < group1.length; i++) {
entriesGroup1.add(new BarEntry(i, group1.getValue()));
entriesGroup2.add(new BarEntry(i, group2.getValue()));
}
BarDataSet set1 = new BarDataSet(entriesGroup1, "Group 1");
BarDataSet set2 = new BarDataSet(entriesGroup2, "Group 2");
float groupSpace = 0.06f;
float barSpace = 0.02f; // x2 dataset
float barWidth = 0.45f; // x2 dataset
BarData data = new BarData(set1, set2);
data.setBarWidth(barWidth); //设置每个bar的宽度
barChart.setData(data);
barChart.groupBars(1980f, groupSpace, barSpace); //执行“显式”分组
barChart.invalidate(); // refresh
为了确保标签的XAxis中心位于组的上方,如上面的截图所示,您可以使用setCenterAxisLabels(…)方法:
XAxis xAxis = chart.getXAxis();
xAxis.setCenterAxisLabels(true);
public BarEntry(float x, float [] yValues) { ... }
这个构造函数允许提供多个yValues,它们表示每个条的“堆栈”的值。考虑下面的示例对象:
BarEntry stackedEntry = new BarEntry(0f, new float[] { 10, 20, 30 });
这BarEntry包括三个值的堆叠,具有“10”,“20”和“30”的“高度”。
与其他图表类型不同,它PieChart以PieEntry对象的形式获取数据。这些对象的构造函数如下所示:
public PieEntry(float value,String label){ ... }
构造函数的第一个参数用于实际的“值”,应将其绘制为饼形图PieChart。String称为“标签” 的第二个参数用于提供对切片的附加描述。考虑以下示例PieChart设置:
List entries = new ArrayList<>();
entries.add(new PieEntry(18.5f, "Green"));
entries.add(new PieEntry(26.7f, "Yellow"));
entries.add(new PieEntry(24.0f, "Red"));
entries.add(new PieEntry(30.8f, "Blue"));
PieDataSet set = new PieDataSet(entries, "Election Results");
PieData data = new PieData(set);
pieChart.setData(data);
pieChart.invalidate(); // refresh
有关设置及图表面和数据的样式信息
刷新
invalidate():在图表上调用此方法将刷新(重绘)吧。这是需要的,以便使在图表上执行的更改生效。
notifyDataSetChanged():让图表知道它的底层数据已更改,并执行所有必要的重新计算(偏移量,图例,最大值,最小值,…)。当这是需要特别是动态添加数据。
记录
setLogEnabled(boolean enabled):将此设置为true将激活图表logcat输出。启用此选项对性能有害,如果不需要,请保持禁用。
一般图表样式
以下是您可以直接在图表上使用的一些一般样式方法:
setBackgroundColor(int color):设置将覆盖整个图表视图的背景颜色。此外,背景颜色可以通过被设置.xml在布局文件中。
setDescription(String desc):设置显示在图表右下角的描述文本。
setDescriptionColor(int color):设置描述文本的颜色。
setDescriptionPosition(float x, float y):在屏幕上以像素为单位设置描述文本的自定义位置。
setDescriptionTypeface(Typeface t):设置Typeface用于绘制的说明文字。
setDescriptionTextSize(float size):设置描述文本的大小(以像素为单位),最小6f,最大16f。
setNoDataText(String text):设置图表为空时应显示的文本。
setDrawGridBackground(boolean enabled):如果启用,将绘制图表绘图区域后面的背景矩形。
setGridBackgroundColor(int color):设置应该绘制网格背景的颜色。
setDrawBorders(boolean enabled):启用/禁用绘制图表边框(图表周围的线条)。
setBorderColor(int color):设置图表边框线的颜色。
setBorderWidth(float width):设置dp中图表边框线的宽度。
setMaxVisibleValueCount(int count):设置图表上最大可见绘制值标签的数量。这个只需要影响时setDrawValues()启用。
线条,条形,散点,蜡烛和气泡图
setAutoScaleMinMaxEnabled(boolean enabled):指示是否启用y轴上的自动缩放的标志。如果启用,当视口改变时,y轴自动调整到当前x轴范围的最小和最大y值。这对于显示财务数据的图表尤其有用。默认值:false
setKeepPositionOnRotation(boolean enabled):设置图表在方向更改后应保持其位置(缩放/滚动)。默认值:false
BarChart
setDrawValueAboveBar(boolean enabled):如果设置为true,所有值都绘制在它们的条形上方,而不是在它们的顶部之下。
setDrawBarShadow(boolean enabled):如果设置为true,则在每个条形图后面绘制一个灰色区域,表示最大值。启用他的能力会降低性能约40%。
setDrawValuesForWholeStack(boolean enabled):如果设置为true,则将单独绘制堆叠条形的所有值,而不仅仅是它们的总和。
setDrawHighlightArrow(boolean enabled):将此设置为true,以在突出显示时在每个栏上方绘制突出显示箭头。
饼形图
setDrawSliceText(boolean enabled):将此设置为true以将x值文本绘制到饼图切片中。
setUsePercentValues(boolean enabled):如果启用此选项,图表中的值将以百分比形式绘制,而不是以原始值绘制。ValueFormatter为格式提供的值随后以百分比形式提供。
setCenterText(SpannableString text):设置绘制在PieChart中心的文本。较长的文本将被自动“包裹”,以避免剪切成饼图。
setCenterTextRadiusPercent(float percent):设置中心文本的边界框的矩形半径,作为饼图孔默认1.f(100%)的百分比。
setHoleRadius(float percent):将饼图中心的孔的半径设置为最大半径的百分比(max =整个图表的半径),默认为50%
setTransparentCircleRadius(float percent):设置饼图中孔旁边的透明圆的半径,以最大半径的百分比(max =整个图表的半径)表示,默认为55% - >比中心孔大5%默认
setTransparentCircleColor(int color):设置透明圆的颜色。
setTransparentCircleAlpha(int alpha):设置透明圆应具有的透明度(0-255)。
setMaxAngle(float maxangle):设置用于计算圆形圆的最大角度。360f意味着它是一个完整的PieChart,180f产生一个半饼图。默认值:360f
RadarChart
setSkipWebLineCount(int count):允许跳过来自图表中心的网络线。如果有很多行特别有用。
此库允许您完全自定义与图表视图的可能的触摸(和手势)交互,并通过回调方法对交互作出反应。
启用/停用互动
setTouchEnabled(boolean enabled):允许启用/禁用图表的所有可能的触摸交互。
setDragEnabled(boolean enabled):启用/禁用图表的拖动(平移)。
setScaleEnabled(boolean enabled):启用/禁用两个轴上图表的缩放。
setScaleXEnabled(boolean enabled):启用/禁用x轴上的缩放。
setScaleYEnabled(boolean enabled):启用/禁用y轴上的缩放。
setPinchZoom(boolean enabled):如果设置为true,则启用双指缩放。如果禁用,x轴和y轴可以单独缩放。
setDoubleTapToZoomEnabled(boolean enabled):将此设置为false,以禁止通过双击对图表进行缩放。
图表快/减速
setDragDecelerationEnabled(boolean enabled):如果设置为true,图表在触摸后继续滚动。默认值:true。
setDragDecelerationFrictionCoef(float coef):减速摩擦系数[0; 1]间隔,较高的值表示速度将缓慢减小,例如,如果它设置为0,它将立即停止。1是无效值,将自动转换为0.9999。
如何允许通过敲击手势突出的条目,并以编程类型为int的描述highlightning部分。
启用/禁用突出显示
setHighlightPerDragEnabled(boolean enabled):将此设置为true,Chart以允许在完全缩小时在图表面上拖动时突出显示。默认值:true
setHighlightPerTapEnabled(boolean enabled):将此设置为false,Chart以防止通过轻击手势突出显示值。值仍然可以通过拖动或编程方式突出显示。默认值:true
setMaxHighlightDistance(float distanceDp):设置dp中的最大高光距离。图表上的点击距离比该距离更远的条目不会触发高亮。默认值:500dp
除此之外,可以为单个DataSet对象配置高亮显示:
dataSet.setHighlightEnabled(true); //允许突出显示DataSet
//将此设置为false以禁用高亮显示指示符(行)
dataSet.setDrawHighlightIndicators(true);
dataSet.setHighlightColor(Color.BLACK); // color for highlight indicator
// and more...
以编程方式突出显示
highlightValue(float x, int dataSetIndex, boolean callListener):突出显示给定DataSet中给定x位置的值。提供-1作为dataSetIndex来撤消所有高亮显示。布尔标志确定应该调用或不调用选择监听器。
highlightValue(Highlight high, boolean callListener):突出显示由提供的Highlight对象表示的值。提供null以撤消所有高亮显示。布尔标志确定应该调用或不调用选择监听器。
highlightValues(Highlight[] highs):突出显示给定Highlight[]数组表示的值。提供null或空数组以撤消所有高亮显示。
getHighlighted():返回一个Highlight[]数组,其中包含所有突出显示的条目,它们的x-index和dataset-index的信息。
选择回调
这个库为交互时的回调提供了许多监听器。其中一个是OnChartValueSelectedListener,用于通过touch突出显示值时的回调:
public interface OnChartValueSelectedListener {
/**
*在图表中选择值时调用。
* @param e所选条目。。
* @param h包含突出
* 显示位置的信息的相应突出显示对象
*/
public void onValueSelected(Entry e, Highlight h);
//当未选择任何内容或执行“取消选择”时调用
public void onNothingSelected();
}
简单地让应该接收回调的类实现此接口并将其设置为图表的监听器:
chart.setOnChartValueSelectedListener(this);
突出显示类
的Highlight类表示与突出相关联的所有数据Entry,如突出显示的Entry对象本身,DataSet它属于,它的绘图表面更上的位置。它可以用来获得关于一个已经强调信息Entry,或者用于向提供信息Chart为一个Entry加以强调。关于这个目的,Highlight类提供了两个构造函数:
/ * *标准高亮的构造函数* /
public Highlight( float x, int dataSetIndex){ ... }
/ * *构造函数用于堆栈BarEntry突出显示* /
public Highlight( float x, int dataSetIndex, int stackIndex){ ... }
这些构造函数可用于创建Highlight允许以编程方式执行突出显示的对象:
//高亮显示第一个(0)DataSet中的条目,x位置50
Highlight highlight = new Highlight(50f, 0);
chart.highlightValue(highlight, false); //突出这个值,不叫监听器
自定义荧光笔
在彰显手势的形式。所有的用户输入在内部被默认的处理ChartHighlighter类。可以使用以下方法使用自定义实现替换默认高亮度:
setHighlighter(ChartHighlighter highlighter):为处理/处理在图表视图上执行的所有突出显示触摸事件的图表设置自定义高亮度对象。您的自定义荧光笔对象需要扩展ChartHighlighter类。
手势回调
该OnChartGestureListener将允许您在图表上所做的手势做出反应:
public interface OnChartGestureListener {
// 回调当触摸手势已经开始图表(ACTION_DOWN)上
void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture);
// 回调,当触摸手势图表(ACTION_UP,ACTION_CANCEL)在结束
void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture);
//当图表longpressed回调。
public void onChartLongPressed(MotionEvent me);
//回调当图表双抽头。
public void onChartDoubleTapped(MotionEvent me);
//回调当图表单抽头。
public void onChartSingleTapped(MotionEvent me);
//图表图表滑动
public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY);
//回调当图表缩放/捏通过缩放手势缩放。
public void onChartScale(MotionEvent me, float scaleX, float scaleY);
//通过拖动手势移动/翻译图表时的回调。
public void onChartTranslate(MotionEvent me, float dX, float dY);
这个wiki页面的重点是AxisBase类,两者的基类XAxis(X轴)和YAxis(Y轴)。在v2.0.0中引入
下面提及的以下方法可用于两个轴。
轴类允许特定的样式,并包含以下组件/部件(可以包括):
标签(以垂直(y轴)或水平(x轴)对齐绘制),包含轴描述值
所谓的“轴线”,被直接画在标签旁边并平行于标签
“网格线”,每个源自水平方向上的轴标签
LimitLines,允许提供特殊信息,如边界或约束
控制绘制哪个部分(轴)
setEnabled(boolean enabled):设置轴启用或禁用。如果禁用,则不管任何其他设置如何,都不会绘制轴的任何部分。
setDrawLabels(boolean enabled):将此设置为true可启用绘制轴的标签。
setDrawAxisLine(boolean enabled):如果应该绘制轴(轴线)旁边的线,请将此设置为true。
setDrawGridLines(boolean enabled):将此设置为true可启用绘制轴的网格线。
自定义轴范围(最小/最大)
setAxisMaximum(float max):为此轴设置自定义最大值。如果设置,该值将不会根据提供的数据自动计算。
resetAxisMaximum():调用此命令可撤销先前设置的最大值。通过这样做,您将再次允许轴自动计算其最大值。
setAxisMinimum(float min):为此轴设置自定义最小值。如果设置,该值将不会根据提供的数据自动计算。
resetAxisMinimum():调用此命令可撤销先前设置的最小值。通过这样做,您将再次允许轴自动计算其最小值。
setStartAtZero(boolean enabled):已过时 -使用setAxisMinValue(…)或setAxisMaxValue(…)代替。
setInverted(boolean enabled):如果设置为true,该轴将反转,这意味着最高的值将在底部,最低的值在顶部。
setSpaceTop(float percent):设置图表中最高值的顶部间距(以轴的总范围的百分比表示)与轴上的最高值的比较。
setSpaceBottom(float percent):设置图表中最低值与轴上的最低值相比较的底部间距(以总轴范围的百分比表示)。
setShowOnlyMinMax(boolean enabled):如果启用,此轴将仅显示其最小值和最大值。这将忽略/覆盖定义的标签计数(如果未强制)。
setLabelCount(int count, boolean force):设置y轴的标签数。请注意,这个数字不是固定的(如果force == false),只能近似。如果强制启用(true),则绘制精确指定的标签数量 - 这可能导致轴上的数字不均匀。
setPosition(YAxisLabelPosition pos):设置轴标签应该绘制的位置。INSIDE_CHART或OUTSIDE_CHART。
setGranularity(float gran):设置y轴值之间的最小间隔。这可以用于在放大到为轴设置的小数位数不再允许在两个轴值之间进行区分的点时避免值重复。
setGranularityEnabled(boolean enabled):启用在放大时限制y轴间隔的粒度特性。默认值:false
样式/修改轴
setTextColor(int color):设置轴标签的颜色。
setTextSize(float size):设置dp中轴标签的文本大小。
setTypeface(Typeface tf):设置自定义Typeface轴标签。
setGridColor(int color):设置此轴的网格线的颜色。
setGridLineWidth(float width):设置此轴的网格线的宽度。
setAxisLineColor(int color):设置此轴的轴线的颜色。
setAxisLineWidth(float width):设置此轴的轴线的宽度。
enableGridDashedLine(float lineLength, float spaceLength, float phase):允许以虚线模式绘制网格线,例如像“ - - - - - - ”。“lineLength”控制线段的长度,“spaceLength”控制线之间的间隔,“phase”控制起始点。
格式化轴值
对于格式化轴值,可以使用IAxisValueFormatter界面,这说明这里。您可以使用axis.setValueFormatter(IAxisValueFormatter formatter)方法您的自定义格式设置为轴心。
限制线
两轴支持所谓的LimitLines,允许提出特殊的信息,如边界或限制。LimitLines加入到YAxis被绘制在水平方向上,并且在垂直方向时添加到XAxis。这是你如何添加和删除LimitLines从轴:
addLimitLine(LimitLine l):添加新的LimitLine这个轴。
removeLimitLine(LimitLine l):删除指定的LimitLine从该轴。
更多的添加/删除可用方法。
setDrawLimitLinesBehindData(boolean enabled):允许控制LimitLines和实际数据之间的z顺序。如果设置为true,LimitLines则绘制在实际数据后面,否则在顶部。默认值:false
限制线(类LimitLine)是(如名称可能指示的)简单和简单的线可以用于为用户提供附加信息。
例如,您的图表可能会显示用户使用应用程序登录的各种血压测量结果。为了通知用户超过140 mmHg的收缩压被认为是健康风险,您可以LimitLine在140 添加一个提供该信息。
示例代码
YAxis leftAxis = chart.getAxisLeft();
LimitLine ll = new LimitLine(140f, "Critical Blood Pressure");
ll.setLineColor(Color.RED);
ll.setLineWidth(4f);
ll.setTextColor(Color.BLACK);
ll.setTextSize(12f);
// .. and more styling options
leftAxis.addLimitLine(ll);
该XAxis是子类AxisBase它所继承的一些造型和方便的方法。
XAxis类(在之前的版本2.0.0 XLabels称呼),是一切相关的横轴的数据和信息的容器。每个线- ,柱状图,散射- ,CandleStick-和RadarChart有一个XAxis对象。
XAxis类允许特定的造型,由(可包括)下列部件/零件:
所谓的“轴线”,被直接画在标签旁边并平行于标签
“网格线”,每个源自垂直方向上的轴标签
为了获得一个实例中的XAxis类,请执行以下操作:
XAxis xAxis = chart.getXAxis();
自定义轴值
setLabelRotationAngle(float angle):设置绘制x轴标签的角度(以度为单位)。
setPosition(XAxisPosition pos):设置所在的位置XAxis应该出现。在TOP,BOTTOM,BOTH_SIDED,TOP_INSIDE或BOTTOM_INSIDE之间选择。
示例代码
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxisPosition.BOTTOM);
xAxis.setTextSize(10f);
xAxis.setTextColor(Color.RED);
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLines(false);
// set a custom value formatter
xAxis.setValueFormatter(new MyCustomFormatter());
该YAxis是的子类AxisBase。本维基条目只介绍了YAxis,不是它的超类。
YAxis类,是数据和一切与垂直轴相关的信息容器。每个线- ,酒吧,图,散点图或CandleStickChart具有左和右YAxis的对象,负责要么向左,或分别右轴。该RadarChart只有一个YAxis。默认情况下,图表的两个轴都已启用并将被绘制。
YAxis leftAxis = chart.getAxisLeft();
YAxis rightAxis = chart.getAxisRight();
YAxis leftAxis = chart.getAxis(AxisDependency.LEFT);
YAxis yAxis = radarChart.getYAxis(); // this method radarchart only
在运行时,使用public AxisDependency getAxisDependency()以确定此轴表示图表的一侧。
影响的轴的数值范围的自定义设定数据之前要施加必要的图表。
每默认情况下,被添加到图表地块对左边的所有数据YAxis的图表。如果没有进一步指定并启用,右侧YAxis被调节到代表相同的比例为左轴。
如果您的图表需要支持不同的轴刻度,您可以通过设置数据应绘制的轴来实现。这可以通过改变来完成AxisDependency你的DataSet目标:
LineDataSet dataSet = ...; //得到一个数据集
dataSet.setAxisDependency(AxisDependency.RIGHT);
除了网格线,即沿着在每个值水平起源YAxis,有所谓的zeroline,这是在轴线上的零(0)值绘制的,是类似于网格线,但可以单独配置。
setDrawZeroLine(boolean enabled):启用/禁用绘制零线。
setZeroLineWidth(float width):设置零线的线宽。
setZeroLineColor(int color):设置零线应具有的颜色。
零行示例代码:
// data has AxisDependency.LEFT
YAxis left = mChart.getAxisLeft();
left.setDrawLabels(false); //无轴标签
left.setDrawAxisLine(false); //无轴线
left.setDrawGridLines(false); //没有网格线
left.setDrawZeroLine(true); //画一条零线
mChart.getAxisRight().setEnabled(false); // 没有y轴
上面的代码将产生一个零线,如下图所示。没有绘制轴值,不绘制网格线或轴线,只是零线。
YAxis yAxis = mChart.getAxisLeft();
yAxis.setTypeface(...); // set a different font
yAxis.setTextSize(12f); // set the text size
yAxis.setAxisMinimum(0f); // start at zero
yAxis.setAxisMaximum(100f); // the axis maximum is 100
yAxis.setTextColor(Color.BLACK);
yAxis.setValueFormatter(new MyValueFormatter());
yAxis.setGranularity(1f); // interval 1
yAxis.setLabelCount(6, true); // force 6 labels
LineDataSet setComp1 = new LineDataSet(valsComp1, "Company 1");
//设置颜色为数据集,资源名称的一个“真实”的色彩分辨率是做内部
setComp1.setColors(new int[] { R.color.red1, R.color.red2, R.color.red3, R.color.red4 }, Context);
LineDataSet setComp2 = new LineDataSet(valsComp2, "Company 2");
setComp2.setColors(new int[] { R.color.green1, R.color.green2, R.color.green3, R.color.green4 }, Context);
除此之外,还有许多其他的方法用于一个设置颜色DataSet。这是完整的文档:
setColors(int [] colors, Context c):设置应该在此DataSet之前使用的颜色。一旦DataSet表示的条目数大于colors数组的大小,就会重新使用颜色。你可以使用“new int [] {R.color.red,R.color.green,…}”为这个方法提供颜色。在内部,颜色是使用解决getResources()。的getColor(…) 。
setColors(int [] colors):设置应该在此DataSet之前使用的颜色。一旦DataSet表示的条目数大于colors数组的大小,就会重新使用颜色。确保已准备的颜色(通过调用getResources()。的getColor(…)将它们添加到数据集之前)。
setColors(ArrayList colors):设置应该在此DataSet之前使用的颜色。一旦DataSet表示的条目数大于colors数组的大小,就会重新使用颜色。确保颜色已经准备好了(通过调用getResources()。getColor(…)),然后将它们添加到DataSet。
setColor(int color):设置应该用于此DataSet的一个和唯一的颜色。在内部,这将重新创建colors数组并添加指定的颜色。
LineDataSet set = new LineDataSet(...);
set.setColors(ColorTemplate.VORDIPLOM_COLORS);
在版本中引入V3.0.0,该接口允许双方的定制造型XAxis和YAxis值绘制前。
创建格式化程序
所有需要做到自定义格式的值的轴是创建一个实现一类IAxisValueFormatter接口,如下所示。此格式化程序用于始终将轴的值格式化为1个十进制数字。
public class MyYAxisValueFormatter implements IAxisValueFormatter {
private DecimalFormat mFormat;
public MyAxisValueFormatter() {
// format values to 1 decimal digit
mFormat = new DecimalFormat("###,###,##0.0");
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
// "value" represents the position of the label on the axis (x or y)
return mFormat.format(value) + " $";
}
/** this is only needed if numbers are returned, else return 0 */
@Override
public int getDecimalDigits() { return 1; }
}
下面的例子演示了如何从一个绘制值String[]数组轴:
public class MyXAxisValueFormatter implements IAxisValueFormatter {
private String[] mValues;
public MyXAxisValueFormatter(String[] values) {
this.mValues = values;
}
@Override
public String getFormattedValue(float value, AxisBase axis) {
// "value" represents the position of the label on the axis (x or y)
return mValues[(int) value];
}
/** this is only needed if numbers are returned, else return 0 */
@Override
public int getDecimalDigits() { return 0; }
}
设置格式化程序
创建格式化程序后,只需将其设置为您选择的轴:
YAxis left = chart.getAxisLeft();
left.setValueFormatter(new MyYAxisValueFormatter());
String[] values = new String[] { ... };
XAxis xAxis = chart.getXAxis();
xAxis.setValueFormatter(new MyXAxisValueFormatter(values));
限制时间间隔
如果您使用基于数组索引的格式化程序(如上所述),将轴的最小间隔限制为“1”是有意义的:
axis.setGranularity(1f); // restrict interval to 1 (minimum)
这将防止格式化程序绘制重复的轴标签(由轴间隔<1引起)。一旦图表的“缩放级别”足够高,它将停止重新计算较小的间隔。
预定义格式化
LargeValueFormatter:可用于格式化较大值>“1.000”。它将“1.000”变为“1k”,“1.000.000”将是“1m”(百万),“1.000.000.000”将是“1b”(十亿),并且一万亿的值将是例如“1t “。
PercentFormatter:用于带1位小数位数的每个值后显示一个“%”的标志。特别是对于有用PieChart。50 - > 50.0%
示例格式程序
DayAxisValueFormatter:此格式转换提供的值绘制成日期String,改变依赖于规模的字符串。
点击查看
等等