GraphView:旋转水平日期标签,指定视口的固定大小,并将项目符号点与日期标签对齐

时间:2015-02-21 04:04:10

标签: java android graph android-graphview

这是一个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个日期?

enter image description here

代码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个点。有什么想法吗?

enter image description here

代码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);
        }
    }
});

2 个答案:

答案 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(...)功能。