条值的自定义位置
Custom position for bar values
我正在使用 MPAndroidChart 库创建条形图。
我们可以使用以下内容在条形图顶部显示条形图值。
mChart.setDrawValueAboveBar(false);
或者我们可以使用这个:
barDataSet.setDrawValues(true);
在条形图本身内显示条形图值。
我想知道我们是否可以为值设置自定义位置。例如在 y 轴下方。
解决方案
public class TextBarChartRenderer extends BarChartRenderer {
public TextBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(chart, animator, viewPortHandler);
}
@Override
public void drawValues(Canvas c) {
List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();
final float valueOffsetPlus = Utils.convertDpToPixel(22f)
float negOffset;
for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {
IBarDataSet dataSet = dataSets.get(i);
applyValueTextStyle(dataSet);
float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
negOffset = valueTextHeight + valueOffsetPlus;
BarBuffer buffer = mBarBuffers[i];
float left;
float right;
float top;
float bottom;
for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {
left = buffer.buffer[j];
right = buffer.buffer[j + 2];
top = buffer.buffer[j + 1];
bottom = buffer.buffer[j + 3];
float x = (left + right) / 2f;
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x))
continue;
BarEntry entry = dataSet.getEntryForIndex(j / 4);
float val = entry.getY();
if(val > 0) {
drawValue(c, dataSet.getValueFormatter(), val, entry, i, x,
(bottom + negOffset),
dataSet.getValueTextColor(j / 4));
}
}
}
}
}
还必须添加这个以便值可见
mChart.setExtraOffsets(0, 0, 0, 20);
公开的 API 中没有将值标签的位置更改为 YAxis 下方的方法。您可能需要扩展和修改库以满足您不常见的要求。
尝试的一个选项是在 XAxis 上实现 IAxisValueFormatter
以呈现 y 值而不是 x 值。一个简单的例子可以重用现有的 IndexAxisValueFormatter
。假设您在名为 yLabels
的 String []
中拥有 y 值的标签。您现在可以这样做:
mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(yLabels));
如果这不起作用,您将不得不查看 BarChartRenderer
的来源。有一个名为 drawValues()
的方法,您可以覆盖它以达到您想要的效果。
所以你会得到类似的东西:
public class MyBarChartRenderer extends BarChartRenderer {
//TODO: a constructor matching the superclass
@Override
public void drawValues(Canvas c) {
//TODO: copy and paste the code from the superclass and simply
//change the offset for drawing the labels
}
}
在 3.1.0 版本的 MPAndroidCharts 设置中 mChart.setDrawValueAboveBar(false);
将在条形图顶部下方绘制值。
我正在使用 MPAndroidChart 库创建条形图。
我们可以使用以下内容在条形图顶部显示条形图值。
mChart.setDrawValueAboveBar(false);
或者我们可以使用这个:
barDataSet.setDrawValues(true);
在条形图本身内显示条形图值。 我想知道我们是否可以为值设置自定义位置。例如在 y 轴下方。
解决方案
public class TextBarChartRenderer extends BarChartRenderer {
public TextBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
super(chart, animator, viewPortHandler);
}
@Override
public void drawValues(Canvas c) {
List<IBarDataSet> dataSets = mChart.getBarData().getDataSets();
final float valueOffsetPlus = Utils.convertDpToPixel(22f)
float negOffset;
for (int i = 0; i < mChart.getBarData().getDataSetCount(); i++) {
IBarDataSet dataSet = dataSets.get(i);
applyValueTextStyle(dataSet);
float valueTextHeight = Utils.calcTextHeight(mValuePaint, "8");
negOffset = valueTextHeight + valueOffsetPlus;
BarBuffer buffer = mBarBuffers[i];
float left;
float right;
float top;
float bottom;
for (int j = 0; j < buffer.buffer.length * mAnimator.getPhaseX(); j += 4) {
left = buffer.buffer[j];
right = buffer.buffer[j + 2];
top = buffer.buffer[j + 1];
bottom = buffer.buffer[j + 3];
float x = (left + right) / 2f;
if (!mViewPortHandler.isInBoundsRight(x))
break;
if (!mViewPortHandler.isInBoundsY(top) || !mViewPortHandler.isInBoundsLeft(x))
continue;
BarEntry entry = dataSet.getEntryForIndex(j / 4);
float val = entry.getY();
if(val > 0) {
drawValue(c, dataSet.getValueFormatter(), val, entry, i, x,
(bottom + negOffset),
dataSet.getValueTextColor(j / 4));
}
}
}
}
}
还必须添加这个以便值可见
mChart.setExtraOffsets(0, 0, 0, 20);
公开的 API 中没有将值标签的位置更改为 YAxis 下方的方法。您可能需要扩展和修改库以满足您不常见的要求。
尝试的一个选项是在 XAxis 上实现 IAxisValueFormatter
以呈现 y 值而不是 x 值。一个简单的例子可以重用现有的 IndexAxisValueFormatter
。假设您在名为 yLabels
的 String []
中拥有 y 值的标签。您现在可以这样做:
mChart.getXAxis().setValueFormatter(new IndexAxisValueFormatter(yLabels));
如果这不起作用,您将不得不查看 BarChartRenderer
的来源。有一个名为 drawValues()
的方法,您可以覆盖它以达到您想要的效果。
所以你会得到类似的东西:
public class MyBarChartRenderer extends BarChartRenderer {
//TODO: a constructor matching the superclass
@Override
public void drawValues(Canvas c) {
//TODO: copy and paste the code from the superclass and simply
//change the offset for drawing the labels
}
}
在 3.1.0 版本的 MPAndroidCharts 设置中 mChart.setDrawValueAboveBar(false);
将在条形图顶部下方绘制值。