无法在MPChartView android上的xAxis上设置标签
我无法在反转图表视图上设置标签。我正在使用MPchart库创建我的图形。我必须根据值在顶部显示带标签和等级的倒排图。我无法在X轴上设置标签 我想让我的图表看起来像这样。但我无法在每个图表上显示标签和编号 我得到的是: 这是我的密码:无法在MPChartView android上的xAxis上设置标签,android,graph,mpandroidchart,Android,Graph,Mpandroidchart,我无法在反转图表视图上设置标签。我正在使用MPchart库创建我的图形。我必须根据值在顶部显示带标签和等级的倒排图。我无法在X轴上设置标签 我想让我的图表看起来像这样。但我无法在每个图表上显示标签和编号 我得到的是: 这是我的密码: ArrayList<BarEntry> bargroup1 = new ArrayList<>(); bargroup1.add(new BarEntry(12f, 4)); bargroup1.add(new Ba
ArrayList<BarEntry> bargroup1 = new ArrayList<>();
bargroup1.add(new BarEntry(12f, 4));
bargroup1.add(new BarEntry(16f, 2));
bargroup1.add(new BarEntry(20f, 1));
bargroup1.add(new BarEntry(24f, 3));
bargroup1.add(new BarEntry(28f, 5));
ArrayList<BarEntry> bargroup2 = new ArrayList<>();
bargroup2.add(new BarEntry(13f, 4));
bargroup2.add(new BarEntry(17f, 2));
bargroup2.add(new BarEntry(21f, 1));
bargroup2.add(new BarEntry(25f, 3));
bargroup2.add(new BarEntry(29f, 5));
BarDataSet barDataSet1 = new BarDataSet(bargroup1, "");
barDataSet1.setColors(getResources().getColor(R.color.app_logo_color));
BarDataSet barDataSet2 = new BarDataSet(bargroup2, "");
barDataSet2.setColors(getResources().getColor(R.color.app_grey_color));
final ArrayList<String> labels = new ArrayList<String>();
labels.add("Buy");
labels.add("Over");
labels.add("Hold");
labels.add("Under");
labels.add("Sell");
dataSets = new ArrayList<>();
datasetdemo = new ArrayList<>();
dataSets.add(barDataSet1);
dataSets.add(barDataSet2);
YAxis yAxisRight = barChart.getAxisRight();
yAxisRight.setEnabled(false);
YAxis yAxisLeft = barChart.getAxisLeft();
yAxisLeft.setEnabled(false);
// or use some other logic to save your data in list. For ex.
XAxis xAxis = barChart.getXAxis();
xAxis.setEnabled(false);
xAxis.setEnabled(false);
xAxis.setDrawGridLines(false);
barChart.invalidate();
barChart.setScaleEnabled(false);
barChart.getXAxis().setDrawGridLines(false);
barChart.getAxisLeft().setDrawGridLines(false);
barChart.getAxisRight().setDrawGridLines(false);
xAxis.setValueFormatter(new IndexAxisValueFormatter(labels));
BarData data1 = new BarData(dataSets);
barChart.setData(data1);
ArrayList bargroup1=新的ArrayList();
bargroup1.添加(新巴伦特里(12f,4));
bargroup1.添加(新巴伦特里(16f,2));
bargroup1.添加(新巴伦特里(20f,1));
bargroup1.添加(新巴伦特里(24f,3));
bargroup1.添加(新巴伦特里(28f,5));
ArrayList bargroup2=新的ArrayList();
bargroup2.添加(新巴伦特里(13f,4));
bargroup2.添加(新巴伦特里(17f,2));
bargroup2.添加(新巴伦特里(21f,1));
bargroup2.添加(新巴伦特里(25f,3));
bargroup2.添加(新巴伦特里(29f,5));
BarDataSet barDataSet1=新的BarDataSet(bargroup1,“”);
batataset1.setColors(getResources().getColor(R.color.app_logo_color));
BarDataSet barDataSet2=新的BarDataSet(bargroup2,“”);
batataset2.setColors(getResources().getColor(R.color.app_grey_color));
最终ArrayList标签=新ArrayList();
标签。添加(“购买”);
标签。添加(“超过”);
标签。添加(“保留”);
标签。添加(“下”);
标签。添加(“出售”);
数据集=新的ArrayList();
datasetdemo=newarraylist();
数据集.add(barDataSet1);
数据集.add(barDataSet2);
YAxis yAxisRight=barChart.getAxisRight();
yAxisRight.setEnabled(false);
YAxis yAxisLeft=条形图。getAxisLeft();
yaxisleet.setEnabled(false);
//或者使用其他逻辑将数据保存在列表中。例如。
XAxis XAxis=barChart.getXAxis();
xAxis.setEnabled(false);
xAxis.setEnabled(false);
xAxis.setDrawGridLines(false);
barChart.invalidate();
条形图。setScaleEnabled(假);
getXAxis().setDrawGridLines(false);
getAxisLeft().setDrawGridLines(false);
getAxisRight().setDrawGridLines(false);
setValueFormatter(新的索引xisValueFormatter(标签));
BarData data1=新的BarData(数据集);
条形图.设置数据(数据1);
我必须在每个栏的顶部显示标签和数字数据 以下是您想要实现的图形的解决方案:(下面的代码允许您对条进行分组,反转图形,以及在图形反转时在垂直条下方显示标签) 我已经创建了我自己的“BarChartRenderMine”类,我们需要它在倒置的垂直条下面显示标签。因此,创建“BarChartRenderMine”类并复制下面的粘贴代码:
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import com.github.mikephil.charting.animation.ChartAnimator;
import com.github.mikephil.charting.buffer.BarBuffer;
import com.github.mikephil.charting.data.BarData;
import com.github.mikephil.charting.data.BarEntry;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.github.mikephil.charting.highlight.Highlight;
import com.github.mikephil.charting.highlight.Range;
import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider;
import com.github.mikephil.charting.interfaces.datasets.IBarDataSet;
import com.github.mikephil.charting.model.GradientColor;
import com.github.mikephil.charting.renderer.BarLineScatterCandleBubbleRenderer;
import com.github.mikephil.charting.utils.MPPointF;
import com.github.mikephil.charting.utils.Transformer;
import com.github.mikephil.charting.utils.Utils;
import com.github.mikephil.charting.utils.ViewPortHandler;
import java.util.List;
public class BarChartRendererMine extends BarLineScatterCandleBubbleRenderer {
protected BarDataProvider mChart;
Float commonY1 = 0f;
/**
* the rect object that is used for drawing the bars
*/
protected RectF mBarRect = new RectF();
protected BarBuffer[] mBarBuffers;
protected Paint mShadowPaint;
protected Paint mBarBorderPaint;
public BarChartRendererMine(BarDataProvider chart, ChartAnimator animator,
ViewPortHandler viewPortHandler) {
super(animator, viewPortHandler);
this.mChart = chart;
mHighlightPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mHighlightPaint.setStyle(Paint.Style.FILL);
mHighlightPaint.setColor(Color.rgb(0, 0, 0));
// set alpha after color
mHighlightPaint.setAlpha(120);
mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mShadowPaint.setStyle(Paint.Style.FILL);
mBarBorderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBarBorderPaint.setStyle(Paint.Style.STROKE);
}
@Override
public void initBuffers() {
BarData barData = mChart.getBarData();
mBarBuffers = new BarBuffer[barData.getDataSetCount()];
for (int i = 0; i < mBarBuffers.length; i++) {
IBarDataSet set = barData.getDataSetByIndex(i);
mBarBuffers[i] = new BarBuffer(set.getEntryCount() * 4 * (set.isStacked() ? set.getStackSize() : 1),
barData.getDataSetCount(), set.isStacked());
}
}
@Override
public void drawData(Canvas c) {
BarData barData = mChart.getBarData();
for (int i = 0; i < barData.getDataSetCount(); i++) {
IBarDataSet set = barData.getDataSetByIndex(i);
if (set.isVisible()) {
drawDataSet(c, set, i);
}
}
}
private RectF mBarShadowRectBuffer = new RectF();
protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) {
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
mBarBorderPaint.setColor(dataSet.getBarBorderColor());
mBarBorderPaint.setStrokeWidth(Utils.convertDpToPixel(dataSet.getBarBorderWidth()));
final boolean drawBorder = dataSet.getBarBorderWidth() > 0.f;
float phaseX = mAnimator.getPhaseX();
float phaseY = mAnimator.getPhaseY();
// draw the bar shadow before the values
if (mChart.isDrawBarShadowEnabled()) {
mShadowPaint.setColor(dataSet.getBarShadowColor());
BarData barData = mChart.getBarData();
final float barWidth = barData.getBarWidth();
final float barWidthHalf = barWidth / 2.0f;
float x;
for (int i = 0, count = Math.min((int) (Math.ceil((float) (dataSet.getEntryCount()) * phaseX)), dataSet.getEntryCount());
i < count;
i++) {
BarEntry e = dataSet.getEntryForIndex(i);
x = e.getX();
mBarShadowRectBuffer.left = x - barWidthHalf;
mBarShadowRectBuffer.right = x + barWidthHalf;
trans.rectValueToPixel(mBarShadowRectBuffer);
if (!mViewPortHandler.isInBoundsLeft(mBarShadowRectBuffer.right))
continue;
if (!mViewPortHandler.isInBoundsRight(mBarShadowRectBuffer.left))
break;
mBarShadowRectBuffer.top = mViewPortHandler.contentTop();
mBarShadowRectBuffer.bottom = mViewPortHandler.contentBottom();
c.drawRect(mBarShadowRectBuffer, mShadowPaint);
}
}
// initialize the buffer
BarBuffer buffer = mBarBuffers[index];
buffer.setPhases(phaseX, phaseY);
buffer.setDataSet(index);
buffer.setInverted(mChart.isInverted(dataSet.getAxisDependency()));
buffer.setBarWidth(mChart.getBarData().getBarWidth());
buffer.feed(dataSet);
trans.pointValuesToPixel(buffer.buffer);
final boolean isSingleColor = dataSet.getColors().size() == 1;
if (isSingleColor) {
mRenderPaint.setColor(dataSet.getColor());
}
for (int j = 0; j < buffer.size(); j += 4) {
if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2]))
continue;
if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j]))
break;
if (!isSingleColor) {
// Set the color for the currently drawn value. If the index
// is out of bounds, reuse colors.
mRenderPaint.setColor(dataSet.getColor(j / 4));
}
if (dataSet.getGradientColor() != null) {
GradientColor gradientColor = dataSet.getGradientColor();
mRenderPaint.setShader(
new LinearGradient(
buffer.buffer[j],
buffer.buffer[j + 3],
buffer.buffer[j],
buffer.buffer[j + 1],
gradientColor.getStartColor(),
gradientColor.getEndColor(),
android.graphics.Shader.TileMode.MIRROR));
}
if (dataSet.getGradientColors() != null) {
mRenderPaint.setShader(
new LinearGradient(
buffer.buffer[j],
buffer.buffer[j + 3],
buffer.buffer[j],
buffer.buffer[j + 1],
dataSet.getGradientColor(j / 4).getStartColor(),
dataSet.getGradientColor(j / 4).getEndColor(),
android.graphics.Shader.TileMode.MIRROR));
}
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
buffer.buffer[j + 3], mRenderPaint);
if (drawBorder) {
c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2],
buffer.buffer[j + 3], mBarBorderPaint);
}
}
}
protected void prepareBarHighlight(float x, float y1, float y2, float barWidthHalf, Transformer trans) {
float left = x - barWidthHalf;
float right = x + barWidthHalf;
float top = y1;
float bottom = y2;
mBarRect.set(left, top, right, bottom);
trans.rectToPixelPhase(mBarRect, mAnimator.getPhaseY());
}
@Override
public void drawValues(Canvas c) {
// if values are drawn
if (isDrawingValuesAllowed(mChart)) {
List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();
final float valueOffsetPlus = Utils.convertDpToPixel(4.5f);
float posOffset = 0f;
float negOffset = 0f;
boolean drawValueAboveBar = mChart.isDrawValueAboveBarEnabled();
for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {
IBarDataSet dataSet = dataSets.get(i);
if (!shouldDrawValues(dataSet))
continue;
// apply the text-styling defined by the DataSet
applyValueTextStyle(dataSet);
// calculate the correct offset depending on the draw position of
// the value
float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
posOffset = (drawValueAboveBar ? -valueOffsetPlus : valueTextHeight + valueOffsetPlus);
negOffset = (drawValueAboveBar ? valueTextHeight + valueOffsetPlus : -valueOffsetPlus);
// get the buffer
BarBuffer buffer = mBarBuffers[i];
final float phaseY = mAnimator.getPhaseY();
ValueFormatter formatter = dataSet.getValueFormatter();
MPPointF iconsOffset = MPPointF.getInstance(dataSet.getIconsOffset());
iconsOffset.x = Utils.convertDpToPixel(iconsOffset.x);
iconsOffset.y = Utils.convertDpToPixel(iconsOffset.y);
// if only single values are drawn (sum)
if (!dataSet.isStacked()) {
commonY1 = 0f;
for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {
float x = (buffer.buffer[j] + buffer.buffer[j + 2]) / 2f;
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(buffer.buffer[j + 1])
|| !mViewPortHandler.isInBoundsLeft(x))
continue;
BarEntry entry = dataSet.getEntryForIndex(j / 4);
float val = entry.getY();
if (dataSet.isDrawValuesEnabled()) {
commonY1 = (buffer.buffer[j + 3] + negOffset);
drawValue(c, formatter.getBarLabel(entry), x, val >= 0 ?
(buffer.buffer[j + 1] + posOffset) :
(buffer.buffer[j + 3] + negOffset),
dataSet.getValueTextColor(j / 4));
}
if (entry.getIcon() != null && dataSet.isDrawIconsEnabled()) {
Drawable icon = entry.getIcon();
float px = x;
float py = val >= 0 ?
(buffer.buffer[j + 1] + posOffset) :
(buffer.buffer[j + 3] + negOffset);
px += iconsOffset.x;
py += iconsOffset.y;
Utils.drawImage(
c,
icon,
(int) px,
(int) py,
icon.getIntrinsicWidth(),
icon.getIntrinsicHeight());
}
}
// if we have stacks
} else {
Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
int bufferIndex = 0;
int index = 0;
while (index < dataSet.getEntryCount() * mAnimator.getPhaseX()) {
BarEntry entry = dataSet.getEntryForIndex(index);
float[] vals = entry.getYVals();
float x = (buffer.buffer[bufferIndex] + buffer.buffer[bufferIndex + 2]) / 2f;
int color = dataSet.getValueTextColor(index);
// we still draw stacked bars, but there is one
// non-stacked
// in between
if (vals == null) {
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(buffer.buffer[bufferIndex + 1])
|| !mViewPortHandler.isInBoundsLeft(x))
continue;
if (dataSet.isDrawValuesEnabled()) {
drawValue(c, formatter.getBarLabel(entry), x, buffer.buffer[bufferIndex + 1] +
(entry.getY() >= 0 ? posOffset : negOffset),
color);
}
if (entry.getIcon() != null && dataSet.isDrawIconsEnabled()) {
Drawable icon = entry.getIcon();
float px = x;
float py = buffer.buffer[bufferIndex + 1] +
(entry.getY() >= 0 ? posOffset : negOffset);
px += iconsOffset.x;
py += iconsOffset.y;
Utils.drawImage(
c,
icon,
(int) px,
(int) py,
icon.getIntrinsicWidth(),
icon.getIntrinsicHeight());
}
// draw stack values
} else {
float[] transformed = new float[vals.length * 2];
float posY = 0f;
float negY = -entry.getNegativeSum();
for (int k = 0, idx = 0; k < transformed.length; k += 2, idx++) {
float value = vals[idx];
float y;
if (value == 0.0f && (posY == 0.0f || negY == 0.0f)) {
// Take care of the situation of a 0.0 value, which overlaps a non-zero bar
y = value;
} else if (value >= 0.0f) {
posY += value;
y = posY;
} else {
y = negY;
negY -= value;
}
transformed[k + 1] = y * phaseY;
}
trans.pointValuesToPixel(transformed);
for (int k = 0; k < transformed.length; k += 2) {
final float val = vals[k / 2];
final boolean drawBelow =
(val == 0.0f && negY == 0.0f && posY > 0.0f) ||
val < 0.0f;
float y = transformed[k + 1]
+ (drawBelow ? negOffset : posOffset);
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(y)
|| !mViewPortHandler.isInBoundsLeft(x))
continue;
if (dataSet.isDrawValuesEnabled()) {
drawValue(c, formatter.getBarStackedLabel(val, entry), x, y, color);
}
if (entry.getIcon() != null && dataSet.isDrawIconsEnabled()) {
Drawable icon = entry.getIcon();
Utils.drawImage(
c,
icon,
(int) (x + iconsOffset.x),
(int) (y + iconsOffset.y),
icon.getIntrinsicWidth(),
icon.getIntrinsicHeight());
}
}
}
bufferIndex = vals == null ? bufferIndex + 4 : bufferIndex + 4 * vals.length;
index++;
}
}
MPPointF.recycleInstance(iconsOffset);
}
}
}
@Override
public void drawValue(Canvas c, String valueText, float x, float y, int color) {
mValuePaint.setColor(color);
try{
c.drawText(valueText, x, commonY1 + 30f, mValuePaint);
}catch (Exception e){
c.drawText(valueText, x, y, mValuePaint);
}
}
@Override
public void drawHighlighted(Canvas c, Highlight[] indices) {
BarData barData = mChart.getBarData();
for (Highlight high : indices) {
IBarDataSet set = barData.getDataSetByIndex(high.getDataSetIndex());
if (set == null || !set.isHighlightEnabled())
continue;
BarEntry e = set.getEntryForXValue(high.getX(), high.getY());
if (!isInBoundsX(e, set))
continue;
Transformer trans = mChart.getTransformer(set.getAxisDependency());
mHighlightPaint.setColor(set.getHighLightColor());
mHighlightPaint.setAlpha(set.getHighLightAlpha());
boolean isStack = (high.getStackIndex() >= 0 && e.isStacked()) ? true : false;
final float y1;
final float y2;
if (isStack) {
if (mChart.isHighlightFullBarEnabled()) {
y1 = e.getPositiveSum();
y2 = -e.getNegativeSum();
} else {
Range range = e.getRanges()[high.getStackIndex()];
y1 = range.from;
y2 = range.to;
}
} else {
y1 = e.getY();
y2 = 0.f;
}
prepareBarHighlight(e.getX(), y1, y2, barData.getBarWidth() / 2f, trans);
setHighlightDrawPos(high, mBarRect);
c.drawRect(mBarRect, mHighlightPaint);
}
}
/**
* Sets the drawing position of the highlight object based on the riven bar-rect.
*
* @param high
*/
protected void setHighlightDrawPos(Highlight high, RectF bar) {
high.setDraw(bar.centerX(), bar.top);
}
@Override
public void drawExtras(Canvas c) {
}
}
自定义绘制条形图所需的以下行:
BarChartRendererMine barChartCustomRenderer = new BarChartRendererMine(barChart, barChart.getAnimator(), barChart.getViewPortHandler());
barChart.setRenderer(barChartCustomRenderer);
希望有帮助:)首先,尝试将barChart.invalidate()放在底部,因为invalidate()之后的所有内容都不会应用到图表上。我做到了,但仍然没有标签。感谢您的努力。这是显示标签,但我如何旋转它。是否要旋转“购买”、“持有”和“超过”值或条形图值?我在图像中看不到任何旋转。你能澄清一下吗?我上面的代码和倒转图的代码是一样的,这意味着它将把图旋转180度。但还是让我来说明一下,通过写这行“barChart.getAxisLeft().setinversed(true)”;“图形将旋转180replace”drawValue(c,String.valueOf((int)Float.parseFloat(formatter.getBarLabel(entry)),x,val>=0?(buffer.buffer[j+1]+posOffset):(buffer.buffer[j+3]+negOffset),dataSet.getValueTextColor(j/4));“只要调用drawValue()方法。例如,它在BarchartRenderMine中调用第279、337、408行
"xAxis.setAxisLineColor(getResources().getColor(R.color.colorTransparent));"
BarChartRendererMine barChartCustomRenderer = new BarChartRendererMine(barChart, barChart.getAnimator(), barChart.getViewPortHandler());
barChart.setRenderer(barChartCustomRenderer);