2013-12-08 1 views
0

나는 androidplot에서 bar char를 만들려고합니다. 내 도메인 축에서 타임 스탬프 값을 배치했습니다. 타임 스탬프가 며칠 동안 다른 그래프 값을 배치 할 때 막대 사이에 큰 차이가 있습니다. 아래 이미지에서 확인할 수 있습니다.바 배치 int 안드로이드 플롯

enter image description here

나는 나의 막대 아래의 화면처럼 서로 옆에 있었다합니다.

enter image description here

는 androidplot이 가능합니까? 코드에서

public class ChartActivity extends Activity 
{ 
    private ArrayList<Measure> measures; 
    private XYPlot plot; 

    private MyBarFormatter formatter1; 

    private Number minXSeriesValue; 
    private Number maxXSeriesValue; 
    private Number minYSeriesValue; 
    private Number maxYSeriesValue; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chart); 

     measures = getIntent().getParcelableArrayListExtra(getString(R.string.constant_measures_intent_tag)); 

     plot = (XYPlot) findViewById(R.id.mySimpleXYPlot); 
     plot.setRangeStep(XYStepMode.INCREMENT_BY_VAL, 1); 

     plot.setRangeLowerBoundary(0, BoundaryMode.FIXED); 
     plot.getGraphWidget().setRangeLabelOrientation(-45); 
     plot.getGraphWidget().setGridPadding(30, 10, 30, 0); 


     plot.setTicksPerDomainLabel(2); 

     plot.setDomainValueFormat(new MyDateFormat()); 
     plot.getGraphWidget().setDomainLabelOrientation(-45); 
     plot.getGraphWidget().setDomainLabelVerticalOffset(5); 



     plot.setRangeValueFormat(new Format() { 
      @Override 
      public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 
       Number num = (Number) obj; 
       switch(num.intValue()) { 
        case 1: 
         toAppendTo.append("1"); 
         break; 
        case 2: 
         toAppendTo.append("2"); 
         break; 
        case 3: 
         toAppendTo.append("3"); 
         break; 
        case 4: 
         toAppendTo.append("4"); 
         break; 
        case 5: 
         toAppendTo.append("5"); 
         break; 
        case 6: 
         toAppendTo.append("6"); 
         break; 
        case 7: 
         toAppendTo.append("7"); 
         break; 
        case 8: 
         toAppendTo.append("8"); 
         break; 
        case 9: 
         toAppendTo.append("9"); 
         break; 
        case 10: 
         toAppendTo.append("10"); 
         break; 
        default: 
         toAppendTo.append(""); 
         break; 
       } 
       return toAppendTo; 
      } 

      @Override 
      public Object parseObject(String source, ParsePosition pos) { 
       return null; 
      } 
     }); 

     List<Number> values = new ArrayList<Number>(); 
     List<Number> domain = new ArrayList<Number>(); 



     for(Measure measure : measures) { 
      values.add(measure.getThreshold().getValue()); 
      domain.add(measure.getDate().getTime()); 


     } 

     minXSeriesValue = domain.get(0); 
     maxXSeriesValue = domain.get(0); 

     for(int i=0 ;i<domain.size(); i++) { 
      if(minXSeriesValue == null || minXSeriesValue.doubleValue() > domain.get(i).doubleValue()) 
       minXSeriesValue = domain.get(i); 
      if(maxXSeriesValue == null || maxXSeriesValue.doubleValue() < domain.get(i).doubleValue()) 
       maxXSeriesValue = domain.get(i); 
     } 





     XYSeries series = new SimpleXYSeries(domain,values,""); 

     plot.setRangeTopMin(11); 
     plot.getLegendWidget().setVisible(false); 


     formatter1 = new MyBarFormatter(Color.argb(200, 100, 150, 100), Color.LTGRAY); 

     plot.addSeries(series, formatter1); 

     MyBarRenderer renderer = ((MyBarRenderer)plot.getRenderer(MyBarRenderer.class)); 
     renderer.setBarRenderStyle(BarRenderer.BarRenderStyle.SIDE_BY_SIDE); 
     renderer.setBarWidthStyle(BarRenderer.BarWidthStyle.FIXED_WIDTH); 
     renderer.setBarWidth(10); 
     renderer.setBarGap(5); 

     plot.setDomainBoundaries(minXSeriesValue.longValue()-1,maxXSeriesValue.longValue()+1, BoundaryMode.FIXED); 


     plot.getGraphWidget().getDomainSubGridLinePaint().setColor(Color.TRANSPARENT); 

     plot.redraw(); 
    } 

    class MyBarFormatter extends BarFormatter { 
     public MyBarFormatter(int fillColor, int borderColor) { 
      super(fillColor, borderColor); 
     } 

     @Override 
     public Class<? extends SeriesRenderer> getRendererClass() { 
      return MyBarRenderer.class; 
     } 

     @Override 
     public SeriesRenderer getRendererInstance(XYPlot plot) { 
      return new MyBarRenderer(plot); 
     } 
    } 

    class MyBarRenderer extends BarRenderer<MyBarFormatter> { 

     public MyBarRenderer(XYPlot plot) { 
      super(plot); 
     } 


     //@Override 
     // TODO: figure out why using @Override screws up the Maven builds 
     protected MyBarFormatter getFormatter(int index, XYSeries series) { 
      return getFormatter(series); 
     } 
    } 

    private class MyDateFormat extends Format { 

     private static final long serialVersionUID = 1L;  
     private SimpleDateFormat dateFormat = new SimpleDateFormat("MM.dd");// HH.mm"); 

     @Override 
     public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) { 
      long timestamp = ((Number) obj).longValue(); 
      Date date = new Date(timestamp); 
      return dateFormat.format(date, toAppendTo, pos); 
     } 

     @Override 
     public Object parseObject(String source, ParsePosition pos) { 
      return null;  
     } 
    } 
} 

답변

1

Androidplot가 무리를 할 수있는 좁은 것 plot.setDomainBoundaries(minXSeriesValue.longValue()-1,maxXSeriesValue.longValue()+1, BoundaryMode.FIXED);

설정이

plot.setDomainBoundaries(minXSeriesValue.longValue()-1,maxXSeriesValue.longValue()+5, BoundaryMode.FIXED); 

당신이 볼에 최대 baundary을 증가한다 : 여기 내 코드입니다 비록 익숙해 지려면 약간의 시간이 걸리지 만 말이다.

androidplot에서는 막대 그래프를 만들고 싶을 때만 막대 폭의 간격 폭을 설정할 수 있지만 둘 다 설정할 수는 없습니다. 간격 폭과 막대 너비를 모두 편집 할 수 있으면 그래프의 막대 너비를 두 가지 다른 값으로 설정할 수 있습니다.

BarWidthStyle가 FIXED_WIDTH로 설정되어있는 경우에만 setBarWidth 방법을 사용할 수 있습니다 http://androidplot.com/javadoc/0.6.0/com/androidplot/xy/BarRenderer.html Androidplot 웹 사이트에 대한 설명서에 따르면

,

MyBarRenderer renderer = ((MyBarRenderer)plot.getRenderer(MyBarRenderer.class)); 
    renderer.setBarWidthStyle(BarRenderer.BarWidthStyle.FIXED_WIDTH); 
    renderer.setBarWidth(10); // set the width of each bar; overlapping could occur though for large values 

과 BarWidthStyle가 VARIABLE_WIDTH로 설정된 경우에만 setBarGap을 사용할 수 있습니다

MyBarRenderer renderer = ((MyBarRenderer)plot.getRenderer(MyBarRenderer.class)); 
    renderer.setBarWidthStyle(BarRenderer.BarWidthStyle.VARIABLE_WIDTH); 
    renderer.setBarGap(0f); // close the gap between bars 

희망이 있습니다.