I have some problems with RadarChart
labels. Specifically, if I use long texts (e.g. 15-20 chars), and the available space is not too big, the chart gets collapsed and the labels are positioned inside the collapsed chart (but there is clearly more space available).
I tried to use ValueFormatter
for the label axis that truncates labels if they are longer than 5 chars, but as I see, the chart size calculaction is based on the full label text, as the chart got collapsed the same way I described before.
XAxis xAxis = radarChart.getXAxis();
xAxis.setValueFormatter(new XAxisValueFormatter() {
@Override
public String getXValue(String original, int index, ViewPortHandler viewPortHandler) {
return original.length() > 5 ? original.substring(0, 5) + "…" : original;
}
});
Here are some pictures to clarify the problem. The charts are displayed inside CardView
s and as you can see, there is plenty of space remaining on all sides. The first two pictures are taken with the ValueFormatter
set, the last two are without it.
Probably you are having some mistakes, here are some solutions:
1) Set your radar data after you set your RadarChart
parameters then call invalidate()
;
2) Set AxisMinimum
and AxisMaximum
in radarChart.getXAxis()
and radarChart.getYAxis()
3) Call yAxis.calculate(min,max)
after step 2;
4) If needed use radarChart.setExtraOffsets(?,?,?,?)
I am using com.github.PhilJay:MPAndroidChart:v3.0.1
This is my solution
public class MyRadarChart extends RadarChart {
public MyRadarChart(Context context) {
super(context);
}
public MyRadarChart(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyRadarChart(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void init() {
super.init();
setXAxisRenderer();
}
private void setXAxisRenderer(){
this.mXAxisRenderer = new MyXAxisRendererRadarChart(mViewPortHandler,mXAxis,this);
}}
and
import android.graphics.Canvas;
import com.github.mikephil.charting.charts.RadarChart;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.renderer.XAxisRendererRadarChart;
import com.github.mikephil.charting.utils.FSize;
import com.github.mikephil.charting.utils.MPPointF;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;
public class MyXAxisRendererRadarChart extends XAxisRendererRadarChart {
public MyXAxisRendererRadarChart(ViewPortHandler viewPortHandler, XAxis xAxis, RadarChart chart) {
super(viewPortHandler, xAxis, chart);
}
@Override
protected void drawLabels(Canvas c, float pos, MPPointF anchor) {
super.drawLabels(c, pos, anchor);
}
@Override
protected void computeSize() {
String longest = mXAxis.getLongestLabel();
String line[] = longest.split("\n");
if(line .length >1){
longest = line[0];
}
mAxisLabelPaint.setTypeface(mXAxis.getTypeface());
mAxisLabelPaint.setTextSize(mXAxis.getTextSize());
final FSize labelSize = Utils.calcTextSize(mAxisLabelPaint, longest);
final float labelWidth = labelSize.width;
final float labelHeight = Utils.calcTextHeight(mAxisLabelPaint, "Q");
final FSize labelRotatedSize = Utils.getSizeOfRotatedRectangleByDegrees(
labelWidth,
labelHeight,
mXAxis.getLabelRotationAngle());
mXAxis.mLabelWidth = Math.round(labelWidth);
mXAxis.mLabelHeight = Math.round(labelHeight);
mXAxis.mLabelRotatedWidth = Math.round(labelRotatedSize.width);
mXAxis.mLabelRotatedHeight = Math.round(labelRotatedSize.height);
FSize.recycleInstance(labelRotatedSize);
FSize.recycleInstance(labelSize);
}
@Override
protected void drawLabel(Canvas c, String formattedLabel, float x, float y, MPPointF anchor, float angleDegrees) {
String line[] = formattedLabel.split("\n");
if(line .length >1){
Utils.drawXAxisValue(c, line[0], x, y, mAxisLabelPaint, anchor, angleDegrees);
Utils.drawXAxisValue(c, line[1], x + mAxisLabelPaint.getTextSize(), y + mAxisLabelPaint.getTextSize(), mAxisLabelPaint, anchor, angleDegrees);
}else{
super.drawLabel(c,formattedLabel,x,y,anchor,angleDegrees);
}
}}
Now replace RadarChart in your layout file with MyRadarChart
At last,setValueFormatter
XAxis xAxis = radarChart.getXAxis();
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override
public String getFormattedValue(float value, AxisBase axis) {
String title = "you title";
if(title.length()>6){
title = title.substring(0,6)+"\n"+title.substring(6,title.length());
}
return title;
}
});