具有各种条宽的 MPAndroidChart 条形图
MPAndroidChart Bar Chart with Various Bar Widths
我需要创建一个图表,其中 x 轴为时间,y 轴为面积。该程序将在 activity 的某个时间差上记录数据,并在图形中显示数据,有点像这样 -> https://i.stack.imgur.com/s4MiC.png 但每隔一个条将交替显示颜色以对应一个单独的activity。我还没有找到使用 MPAndroidChart 执行此操作的方法,每个条目似乎都有固定的宽度。如果有人知道如何使用 MPAndroidChart 或其他开源库帮助实现这一点,我们将不胜感激,谢谢!
编辑:
这是我一直尝试使用的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_report);
BarChart barChart = (BarChart) findViewById(R.id.barChart);
List<BarEntry> entries = generateBarEntries();
BarDataSet set = new BarDataSet(entries, "BarDataSet");
BarData data = new BarData(set);
barChart.setData(data);
}
private List<BarEntry> generateBarEntries() {
List<BarEntry> entries = new ArrayList<>();
for (int i = 0; i < timeValues.size(); i++) {
float x = timeValues.get(i);
float y = areaValues.get(i);
entries.add(new BarEntry(x, y));
}
return entries;
}
timeValues 是一个 ArrayList,其值以秒为单位,例如 [3, 9, 21, 26, 33],areaValues 也是一个 ArrayList,其大小与 timeValues 相同,目前每个值为 30(即 [30, 30, 30, 30, 30]).
没有简单的方法可以做到这一点。您必须在 MPAndroidChart 中挖掘条形图源代码并找到名为 BarBuffer 的 class。有一个名为 addBar() 的方法。在那里您可以更改条形宽度。在我的示例中,我仍然有 24 个单独的条,但是如果您更改宽度,您可以使它看起来像大块。
protected void addBar(float left, float top, float right, float bottom) {
buffer[index++] = left;
buffer[index++] = top;
buffer[index++] = right;
buffer[index++] = bottom;
}
好的,所以我想出了如何解决这个问题。我没有创建条形图,而是创建了一个带有水平线的折线图并填充了每条线下方的区域。
LineChart timeChart = (LineChart) findViewById(R.id.timeChart);
List<ILineDataSet> dataSets = generateLineData();
LineData data = new LineData(dataSets);
timeChart.setData(data);
timeChart.invalidate();
private List<ILineDataSet> generateLineData() {
List<ILineDataSet> dataSets = new ArrayList<>();
for (int i = 0; i < areaValues.size(); i++) {
List<Entry> barPoints = new ArrayList<>();
Entry barPoint1;
Entry barPoint2;
LineDataSet dataSet;
if (areaValues.get(i) >= 0) {
barPoint1 = new Entry(timeValues.get(i), areaValues.get(i));
barPoint2 = new Entry(timeValues.get(i+1), areaValues.get(i));
barPoints.add(barPoint1);
barPoints.add(barPoint2);
dataSet = new LineDataSet(barPoints, "");
dataSet.setColor(getResources().getColor(R.color.green));
dataSet.setFillDrawable(ContextCompat.getDrawable(this, R.color.green));
}
dataSet.setDrawCircles(false);
dataSet.setDrawFilled(true);
dataSet.setDrawValues(false);
dataSets.add(dataSet);
}
return dataSets;
}
效果非常好。
我需要创建一个图表,其中 x 轴为时间,y 轴为面积。该程序将在 activity 的某个时间差上记录数据,并在图形中显示数据,有点像这样 -> https://i.stack.imgur.com/s4MiC.png 但每隔一个条将交替显示颜色以对应一个单独的activity。我还没有找到使用 MPAndroidChart 执行此操作的方法,每个条目似乎都有固定的宽度。如果有人知道如何使用 MPAndroidChart 或其他开源库帮助实现这一点,我们将不胜感激,谢谢!
编辑:
这是我一直尝试使用的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_report);
BarChart barChart = (BarChart) findViewById(R.id.barChart);
List<BarEntry> entries = generateBarEntries();
BarDataSet set = new BarDataSet(entries, "BarDataSet");
BarData data = new BarData(set);
barChart.setData(data);
}
private List<BarEntry> generateBarEntries() {
List<BarEntry> entries = new ArrayList<>();
for (int i = 0; i < timeValues.size(); i++) {
float x = timeValues.get(i);
float y = areaValues.get(i);
entries.add(new BarEntry(x, y));
}
return entries;
}
timeValues 是一个 ArrayList,其值以秒为单位,例如 [3, 9, 21, 26, 33],areaValues 也是一个 ArrayList,其大小与 timeValues 相同,目前每个值为 30(即 [30, 30, 30, 30, 30]).
没有简单的方法可以做到这一点。您必须在 MPAndroidChart 中挖掘条形图源代码并找到名为 BarBuffer 的 class。有一个名为 addBar() 的方法。在那里您可以更改条形宽度。在我的示例中,我仍然有 24 个单独的条,但是如果您更改宽度,您可以使它看起来像大块。
protected void addBar(float left, float top, float right, float bottom) {
buffer[index++] = left;
buffer[index++] = top;
buffer[index++] = right;
buffer[index++] = bottom;
}
好的,所以我想出了如何解决这个问题。我没有创建条形图,而是创建了一个带有水平线的折线图并填充了每条线下方的区域。
LineChart timeChart = (LineChart) findViewById(R.id.timeChart);
List<ILineDataSet> dataSets = generateLineData();
LineData data = new LineData(dataSets);
timeChart.setData(data);
timeChart.invalidate();
private List<ILineDataSet> generateLineData() {
List<ILineDataSet> dataSets = new ArrayList<>();
for (int i = 0; i < areaValues.size(); i++) {
List<Entry> barPoints = new ArrayList<>();
Entry barPoint1;
Entry barPoint2;
LineDataSet dataSet;
if (areaValues.get(i) >= 0) {
barPoint1 = new Entry(timeValues.get(i), areaValues.get(i));
barPoint2 = new Entry(timeValues.get(i+1), areaValues.get(i));
barPoints.add(barPoint1);
barPoints.add(barPoint2);
dataSet = new LineDataSet(barPoints, "");
dataSet.setColor(getResources().getColor(R.color.green));
dataSet.setFillDrawable(ContextCompat.getDrawable(this, R.color.green));
}
dataSet.setDrawCircles(false);
dataSet.setDrawFilled(true);
dataSet.setDrawValues(false);
dataSets.add(dataSet);
}
return dataSets;
}
效果非常好。