Android - 为 BarSeries 中的每个数据点设置其他颜色(shinobicharts)

Posted

技术标签:

【中文标题】Android - 为 BarSeries 中的每个数据点设置其他颜色(shinobicharts)【英文标题】:Android - set other color for each data point in 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);

请帮帮我!

【问题讨论】:

【参考方案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轴,系列没有。

希望有帮助!

【讨论】:

以上是关于Android - 为 BarSeries 中的每个数据点设置其他颜色(shinobicharts)的主要内容,如果未能解决你的问题,请参考以下文章

Nativescript-vue,如何更改 BarSeries(Radchart) 图形“条形”颜色?

适用于 Android 的 Fabric 插件中的每日新用户身份 - crashlytics

尝试为内部列表视图的每一行膨胀不同的视图 (android.view.InflateException: Binary XML..)

如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?

Java/Android 中的 Firebase:事务被后续集合覆盖

listview中的每一个Item都有edittext,如何能够让listview的item和edittext都能响应点击消息