这是一个3部分问题。
1)首先,是否可以旋转水平X值。目前,当我试图在X轴(2015年4月1日,2015年4月2日等等)上显示一个月内的所有日期时,它们将全部聚集并变得不可读。 有没有办法旋转X轴标签,使它们垂直?
2)要设置视口,文档建议使用:
graphview.getViewport().setScalable(true); graphview.getViewport().setScrollable(true); // To set a fixed manual viewport use this: // set manual X bounds graph.getViewport().setXAxisBoundsManual(true); graph.getViewport().setMinX(0.5); graph.getViewport().setMaxX(3.5); // set manual Y bounds graph.getViewport().setYAxisBoundsManual(true); graph.getViewport().setMinY(3.5); graph.getViewport().setMaxY(8);
但是,getViewport().setMinX(...)
函数需要加倍,而不是日期。 有没有办法滚动视口以一次显示3-5个日期?
代码2):
GraphView graph = (GraphView) graphView.findViewById(R.id.graph);
DataPoint[] stockArr = new DataPoint[dplist.size()];
stockArr = dplist.toArray(stockArr);
LineGraphSeries<DataPoint> series = new LineGraphSeries<DataPoint>(stockArr);
graph.addSeries(series);
graph.setTitle("TEST GRAPH");
// set date label formatter
graph.getGridLabelRenderer().setLabelFormatter(new DateAsXAxisLabelFormatter(context));
graph.getViewport().setScalable(true);
graph.getViewport().setScrollable(true);
graph.getGridLabelRenderer().setNumHorizontalLabels(data.size()-1); // Approx 28-30
graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setMinX(firstDate.getTime());
graph.getViewport().setMaxX(lastDate.getTime());
3)有没有办法将项目符号与日期标签对齐?我使用以下代码修改了我的X标签。然而,即使在改变之前,似乎没有排列的子弹点。在下图中,1/1应该是第一个点,1/2应该是第2个点,1/3应该是第3个点。有什么想法吗?
代码3):
graph.getGridLabelRenderer().setLabelFormatter(new DateAsXAxisLabelFormatter(context) {
@Override
public String formatLabel(double value, boolean isValueX) {
if (isValueX) {
// show normal x values
Calendar c = Calendar.getInstance();
// set time in milliseconds
c.setTimeInMillis(((long)value));
int mYear = c.get(Calendar.YEAR);
int mMonth = c.get(Calendar.MONTH);
int mDay = c.get(Calendar.DAY_OF_MONTH);
System.out.println((mMonth+1) + "/" + mDay);
// Return Month/Day
return (mMonth+1) + "/" + mDay;
//return super.formatLabel(newDate.toString(), isValueX);
} else {
// show currency for y values
return super.formatLabel(value, isValueX);
}
}
});
答案 0 :(得分:3)
1)目前不支持旋转标签。已经有一个问题,但我不能说何时会实施。你可以在这里观看: https://github.com/jjoe64/GraphView/issues/293
如果你想自己实现它,你将在这个代码点执行此操作 - 它应该是相对容易的: https://github.com/jjoe64/GraphView/blob/master/src/main/java/com/jjoe64/graphview/GridLabelRenderer.java#L934
2)视口需要一个双精度型,如果你想使用日期,你必须通过date.getTime()
将日期转换为毫秒的unix时间纪元。
如果我了解您,您希望一次显示3天的时间跨度。因此,您必须将水平标签的数量设置为3,将视口设置为3天的大小。应该这样做:
graph.getViewport().setXAxisBoundsManual(true);
graph.getGridLabelRenderer().setNumHorizontalLabels(3);
graph.getViewport().setMinX(firstDate.getTime());
graph.getViewport().setMaxX(firstDate.getTime() + 3*24*60*60*1000); // + 3 days
答案 1 :(得分:0)
晚些时候,但为事情添加了一些亮点:
1)尽管“ x labels rendered at an angle”的问题仍然存在,但现在有可能。
已通过 GraphView 4.2.2 测试。假设graph
是您的GraphView
对象:
graph.getGridLabelRenderer().setHorizontalLabelsAngle(90);
在某些情况下,角度
135°
可以在 更紧凑,更优雅的方式。
2)看看@appsthatmatter的answer。
如果继续执行点 3),则必须根据 3)的最后一部分来调整@appsthatmatter的答案:“指定固定大小的视口...“
graph.getGridLabelRenderer().setNumHorizontalLabels(3); graph.getViewport().setXAxisBoundsManual(true); graph.getViewport().setMinX(getDaysSinceEpoch(firstDate)); graph.getViewport().setMaxX(getDaysSinceEpoch(firstDate) + 3); // + 3 days
3),因为您想在X轴(2015年4月1日,2015年4月2日等)上显示一个月中的天。 ),建议您使用自Epoch起的天数,而不要使用java.util.Date#getTime()
返回的毫秒数。因此要表示的数据之间没有中间值。
这意味着:
您不能使用以下方法初始化DataPoint
:
new DataPoint(date, value);
相反,您应该使用以下内容:
new DataPoint(getDaysSinceEpoch(date), value);
getDaysSinceEpoch(...)
收到日期并返回自该Date
对象表示的1970年1月1日格林尼治标准时间00:00:00开始的天数。使用Joda Time:
private int getDaysSinceEpoch(Date date) {
return Days.daysBetween(new LocalDate(0), new LocalDate(date.getTime())).getDays();
}
您不能使用DateAsXAxisLabelFormatter
。
相反,您必须实现自己的LabelFormatter
:
graph.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter() {
@Override
public String formatLabel(double value, boolean isValueX) {
return isValueX
? getFormattedDate((int) value, "M/d")
: super.formatLabel(value, isValueX);
}
});
getFormattedDate(...)
接收自Epoch以来的天数,以及描述日期格式的模式,并返回格式化的日期。使用Joda Time:
private String getFormattedDate(int daysSinceEpoch, String pattern) {
return new LocalDate(0).plusDays(daysSinceEpoch).toString(pattern);
}
您不应该{strong>不禁用“将边界四舍五入为易于理解的数字” 功能,如Use dates as labels所建议。
将其设置为true
,添加评论或直接删除以下行:
// graph.getGridLabelRenderer().setHumanRounding(false);
如果要指定固定大小的视口,请使用:
graph.getViewport().setMinX(...);
graph.getViewport().setMaxX(...);
您无法使用date.getTime()
将日期转换为自大纪元以来的毫秒数。
相反,您必须使用上述getDaysSinceEpoch(...)
功能。