MPAndroidChart:如何在BarChart中将X轴标签旋转90度?

11

我在MPAndroidChart的柱状图的x轴文本太长了。我该如何旋转 x 轴标签 90 度?

4个回答

35

现在在库的版本2.1.6中是可行的

尝试这个

XAxis xAxis=barChart.getXAxis();
xAxis.setLabelRotationAngle(-45); 

@Phillip 当我的标签不适合屏幕大小时,如何仅旋转它们。 - Prabs
根据你拥有的数据来确定角度。例如,如果有6个值适合,则在值的数量超过6之前不要设置旋转,然后在此之后逐渐增加角度,直到达到90度。 - Cognoscis
如果这个答案对您有帮助,请将其标记为正确。 - Hardik Amal

5

很简单,试试这个...

XAxis xAxis = barChart.getXAxis();
xAxis.setLabelRotationAngle(90); 

1
文本重叠在另一段文本上。有没有解决方法? - Luvnish Monga

2
您可以隐藏x轴标签并放置自定义的垂直文本视图。以下是垂直文本视图的代码:

public class VerticalTextView extends TextView {
final boolean topDown;

public VerticalTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    final int gravity = getGravity();
    if (Gravity.isVertical(gravity) && (gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.BOTTOM) {
        setGravity((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) | Gravity.TOP);
        topDown = false;
    } else
        topDown = true;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}

@Override
protected void onDraw(Canvas canvas) {
    TextPaint textPaint = getPaint();
    textPaint.setColor(getCurrentTextColor());
    textPaint.drawableState = getDrawableState();

    canvas.save();

    if (topDown) {
        canvas.translate(getWidth(), 0);
        canvas.rotate(90);
    } else {
        canvas.translate(0, getHeight());
        canvas.rotate(-90);
    }

    canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());

    getLayout().draw(canvas);
    canvas.restore();
}

}


1
我该如何在MPChartAndroid中实现它? - mbagher
将您的图表放置在一个布局中,并将此文本视图放置在图表的左侧。隐藏x轴标签。我已经在我的条形图中使用了这种模式。 - piyush poriya
不好意思,Piyush。我的意思不是x轴标签,而是所有依赖于x值的x轴标签。你明白了吗? - mbagher
ArrayList<String> xVals = new ArrayList<String>(); for (int i = 0; i < count; i++) { xVals.add(Integer.toString(i) ); } - mbagher

0

只需要重写 XAxisRendererrenderAxisLabels(c: Canvas) 方法。

然后将其设置为 barChart itemView.barChart.setXAxisRenderer(CustomBarChartRenderer(itemView.barChart.viewPortHandler, itemView.barChart.xAxis, itemView.barChart.rendererXAxis.transformer))

    import android.graphics.Canvas
import com.github.mikephil.charting.renderer.XAxisRenderer
import com.github.mikephil.charting.utils.ViewPortHandler
import com.github.mikephil.charting.components.XAxis
import com.github.mikephil.charting.utils.MPPointF
import com.github.mikephil.charting.utils.Transformer

class CustomBarChartRenderer(viewPortHandler: ViewPortHandler, xAxis: XAxis, trans: Transformer) : XAxisRenderer(viewPortHandler, xAxis, trans) {

    override fun renderAxisLabels(c: Canvas) {

        if (!mXAxis.isEnabled || !mXAxis.isDrawLabelsEnabled)
            return

        val yoffset = mXAxis.yOffset

        mAxisLabelPaint.typeface = mXAxis.typeface
        mAxisLabelPaint.textSize = mXAxis.textSize
        mAxisLabelPaint.color = mXAxis.textColor

        val pointF = MPPointF.getInstance(0f, 0f)
        if (mXAxis.position == XAxis.XAxisPosition.TOP) {
            pointF.x = 0.5f
            pointF.y = 1.0f
            drawLabels(c, mViewPortHandler.contentTop() - yoffset, pointF)

        } else if (mXAxis.position == XAxis.XAxisPosition.TOP_INSIDE) {
            pointF.x = 0.5f
            pointF.y = 1.0f
            drawLabels(c, mViewPortHandler.contentBottom() - yoffset, pointF)

        } else if (mXAxis.position == XAxis.XAxisPosition.BOTTOM) {
            pointF.x = 0.5f
            pointF.y = 0.0f
            drawLabels(c, mViewPortHandler.contentBottom() + yoffset, pointF)

        } else if (mXAxis.position == XAxis.XAxisPosition.BOTTOM_INSIDE) {
            pointF.x = 0.5f
            pointF.y = 0.0f
            drawLabels(c, mViewPortHandler.contentBottom() - yoffset - mXAxis.mLabelRotatedHeight.toFloat(), pointF)

        } else { // BOTH SIDED
            pointF.x = 0.5f
            pointF.y = 1.0f
            drawLabels(c, mViewPortHandler.contentTop() - yoffset, pointF)
            pointF.x = 0.5f
            pointF.y = 0.0f
            drawLabels(c, mViewPortHandler.contentBottom() + yoffset, pointF)
        }
        MPPointF.recycleInstance(pointF)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接