【问题标题】:Android - set other color for each data point in BarSeries (shinobicharts)Android - 为 BarSeries 中的每个数据点设置其他颜色(shinobicharts)
【发布时间】:2014-04-19 11:24:04
【问题描述】:

我尝试使用 shinobicharts 来设计如下图:

http://www.upsieutoc.com/images/2014/04/19/barseries.png

酒吧系列

我使用了 BarSeries,但遇到以下问题:

  • 我找不到在每个 DataPoint (20, 25, 30) 上设置数据的函数。

  • 我想为每个数据点设置其他颜色,如上图所示。 (红、绿、紫)

  • 标签右对齐。 (法国、马来西亚、西班牙)。

还有这段代码:

 ChartFragment chartFragment = (ChartFragment) getFragmentManager().findFragmentById(R.id.chart);
  ShinobiChart shinobiChart = chartFragment.getShinobiChart();

   NumberAxis xAxis = new NumberAxis();
    xAxis.setPosition(Position.REVERSE);
    shinobiChart.addXAxis(xAxis);
    CategoryAxis yAxis = new CategoryAxis();
    shinobiChart.addYAxis(yAxis);
    BarSeries series = new BarSeries();
    series.setTitle("Country");
    DataAdapter<Integer, String> adapter = new SimpleDataAdapter<Integer, String>(); 

     adapter.add(new DataPoint<Integer, String>(20, "Spain"));
     adapter.add(new DataPoint<Integer, String>(25, "Malaysia"));
     adapter.add(new DataPoint<Integer, String>(30, "France"));

    series.setDataAdapter(adapter);
    shinobiChart.addSeries(series);

请帮帮我!

【问题讨论】:

    标签: android shinobi


    【解决方案1】:

    显然是you can't

    解决方案是有 3 个系列,每个系列有一个值,而不是一个系列有 3 个值。例如:

    ChartFragment chartFragment = (ChartFragment) getFragmentManager().findFragmentById(R.id.chart);
      ShinobiChart shinobiChart = chartFragment.getShinobiChart();
       NumberAxis xAxis = new NumberAxis();
        xAxis.setPosition(Position.REVERSE);
        shinobiChart.addXAxis(xAxis);
        CategoryAxis yAxis = new CategoryAxis();
        shinobiChart.addYAxis(yAxis);
    
        BarSeries series1 = new BarSeries();
        series1.setTitle("Country");
        BarSeriesStyle bss1 = series1.getStyle();
        bss1.setAreaColor(Color.RED);
        DataAdapter<Integer, String> adapter = new SimpleDataAdapter<Integer, String>(); 
        adapter.add(new DataPoint<Integer, String>(20, "Spain"));
        series1.setDataAdapter(adapter);
        shinobiChart.addSeries(series1);
    
        BarSeries series2 = new BarSeries();
        series2.setTitle("Country");
        BarSeriesStyle bss2 = series2.getStyle();
        bss2.setAreaColor(Color.GREEN);
        DataAdapter<Integer, String> adapter = new SimpleDataAdapter<Integer, String>(); 
        adapter.add(new DataPoint<Integer, String>(25, "Malaysia"));
        series2.setDataAdapter(adapter);
        shinobiChart.addSeries(series2);
    
        BarSeries series3 = new BarSeries();
        series3.setTitle("Country");
        BarSeriesStyle bs3 = series3.getStyle();
        bss3.setAreaColor(Color.BLUE);
        DataAdapter<Integer, String> adapter = new SimpleDataAdapter<Integer, String>(); 
        adapter.add(new DataPoint<Integer, String>(30, "France"));
        series3.setDataAdapter(adapter);
        shinobiChart.addSeries(series3);
    

    【讨论】:

      【解决方案2】:

      我或许可以为您的问题的第 2 点提供部分答案:“我想为每个数据点设置其他颜色,如上图所示。(红色、绿色、紫色)”

      您是否尝试过对 SCHartBarSeries 进行子类化?如果没有,试试这个:

      #pragma mark - Custom Styling of Bars
      
      @interface customBarSeries:SChartBarSeries
      
      @end
      
      @implementation customBarSeries
      
      - (SChartBarSeriesStyle *)styleForPoint:(id<SChartData>)point {
      
          SChartBarSeriesStyle *newStyle = [super styleForPoint:point];
      
          int country = [[point sChartXValue] intValue];  
      
          // datapoint specific customization:
          switch (country) {
              case COUNTRY_FRANCE:
                  newStyle.areaColor = [UIColor redColor];
                  break;
              case COUNTRY_MALAYSIA:
                  newStyle.areaColor = [UIColor greenColor];
                  break;
              case COUNTRY_SPAIN:
                  newStyle.areaColor = [UIColor purpleColor];
                  break;
          }
          return newStyle;
      }
      
      @end
      
      
      
      // And in you chart's "sChart: seriesAtIndex:" method, use your custom bars instead of the shinobi default:
      
      -(SChartSeries *)sChart:(ShinobiChart *)chart seriesAtIndex:(NSInteger)index {
          switch (index) {
              case COUNTRY_BARS_SERIE_INDEX:
              {
      // Instead of this:            SChartBarSeries *barSeries = [SChartBarSeries new];
                  customBarSeries *barSeries = [customBarSeries new];   // <-- Here you use your customized sub-class
                  barSeries.title = @"Countries";
      
                  // Style things that are common to all data points in the serie
                  barSeries.style.dataPointLabelStyle.displayValues = SChartDataPointLabelDisplayValuesX;
                  barSeries.style.dataPointLabelStyle.showLabels = YES;  // <-- You may need this as well
      
                  return barSeries;
                  break;
              }           
         }
      }
      

      不知道这个标签部分是否有效,或者标签应该放在哪里。在编写这个示例时,我只是偶然发现了 dataPointStyle 的 label 属性,所以你必须使用它看看会发生什么。

      至于Y轴上的国家名称,需要自定义Y轴,系列没有。

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 1970-01-01
        • 2018-01-14
        相关资源
        最近更新 更多