IOS —— 折線圖 Echart隨筆
阿新 • • 發佈:2018-12-12
前陣子在尋覓折線圖第三方工具的時候,找了許久都沒太滿意。(要麼太簡單,要麼相容不了)
在幾經波折下找到了百度的Echarts,在學習的過程中也踩了幾波坑。這裡分享下自己學習的程式碼以及相應的備註
1.折線圖
- (void)viewDidLoad { [super viewDidLoad]; //折線圖 // [self createLineCharts]; self.view.backgroundColor = [UIColor whiteColor]; [self createScrollView]; [self showLineDemo];//傳送引數,通過引數獲取並讀取圖表 [self.xgEchartView loadEcharts]; } - (void)createScrollView { //Echart 本質為webView,載入呼叫JS方法顯示資料。如果需要資料之間不擁擠並且將具有滑動效果 //則需要將webView新增到scrollView上 _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 100, SCREEN_WIDTH, 300)]; [self.view addSubview:self.scrollView];//更變實際內容頁 self.scrollView.contentSize = CGSizeMake(SCREEN_WIDTH * 2, 0); //取消豎直滑動 self.scrollView.showsHorizontalScrollIndicator = NO; } - (void)showLineDemo { /* 圖表選項 */ PYOption *option = [[PYOption alloc] init]; //是否啟用拖拽重計算特性,預設關閉 option.calculable = NO; //折線顏色 option.color = @[@"#20BCFC",@"#ff6347"]; //圖示背景色 option.backgroundColor = [[PYColor alloc] initWithColor:[UIColor whiteColor]]; //提示框 PYTooltip *tooltip = [[PYTooltip alloc] init]; //觸發型別,預設資料觸發 tooltip.trigger = @"axis"; //豎線寬度 tooltip.axisPointer.lineStyle.width = @1; //提示框,文字樣式設定 tooltip.textStyle = [[PYTextStyle alloc] init]; tooltip.textStyle.fontSize = @12; //提示框 顯示自定義 // tooltip.formatter = @""; //新增到圖示選擇中 option.tooltip = tooltip; /* 圖例 */ PYLegend *legend = [[PYLegend alloc] init]; //設定資料 第一條線、第二條線 legend.data = @[@"掛牌價",@"成交價"]; //新增到圖示選擇中 option.legend = legend; /* 直角座標系內繪圖網格 */ PYGrid *grid = [[PYGrid alloc] init]; /* x:網格圖左上角頂點距座標系背景左側的距離 y:網格圖左上角頂點距座標系背景上側的距離 x2:網格圖右下角頂點距座標系背景右側的距離 y2:網格圖右下角距座標系背景下側的距離 */ grid.x = @(45); grid.y = @(20); grid.x2 = @(20); grid.y2 = @(30); grid.borderWidth = @(0); //新增到圖示選擇中 option.grid = grid; /* x軸設定 */ PYAxis *xAxis = [[PYAxis alloc] init]; //橫軸預設為類目型(就是座標系自己設定,座標系中僅有這些指定類目座標) xAxis.type = @"category"; //起始和結束倆端空白 xAxis.boundaryGap = @(YES); //分隔線 xAxis.splitArea.show = NO; //座標軸線 xAxis.axisLine.show = NO; //X軸座標資料 xAxis.data = @[@"一月",@"二月",@"三月",@"四月",@"五月",@"六月",@"七月",@"八月",@"九月",@"十月",@"十一月",@"十二月" ]; //座標軸小標記 xAxis.axisTick = [[PYAxisTick alloc] init]; xAxis.axisTick.show = YES; //新增到圖示選擇中 option.xAxis = [[NSMutableArray alloc] initWithObjects:xAxis, nil ]; /* Y軸設定 */ PYAxis *yAxis = [[PYAxis alloc] init]; yAxis.axisLine.show = NO; //縱軸預設為數值型(就是座標系統自動生成,座標軸內包含數值區間內容全部座標) ,改為@"category "會有問題 yAxis.type = @"value"; //y軸分隔段數,預設不修改為5 yAxis.splitNumber = @4; //分割線型別 // yAxis.splitLine.lineStyle.type = @"dashed"; //'solid' | 'dotted' | 'dashed' 虛線型別 //單位設定,最大值、最小值 // yAxis.axisLabel.formatter = @"{value} k "; // yAxis.max = @"9000"; // yAxis.min = @"5000"; //新增到圖示選擇中 option.yAxis = [[NSMutableArray alloc] initWithObjects:yAxis, nil]; /* 定義座標點陣列 */ NSMutableArray *seriesArr = [NSMutableArray array]; /* 第一條折線設定 */ PYCartesianSeries *series1 = [[PYCartesianSeries alloc] init]; series1.name = @"掛牌價"; //型別為折線 series1.type = @"line"; //曲線平滑 series1.smooth = YES; //座標點大小 series1.symbolSize = @(1.5); //座標點樣式,設定連線的寬度 series1.itemStyle = [[PYItemStyle alloc] init]; series1.itemStyle.normal = [[PYItemStyleProp alloc] init]; series1.itemStyle.normal.lineStyle = [[PYLineStyle alloc] init]; series1.itemStyle.normal.lineStyle.width = @(1.5); //新增座標點 y軸資料 (如果某一點無資料,可以傳@"-",斷開連線 如: @[@"1000",@"-", @"7571"]) series1.data = @[@"7566",@"7980",@"7651",@"7777",@"7528",@"7328",@"7890",@"7999",@"7265",@"7123",@"7663",@"7813"]; [seriesArr addObject:series1]; /* 第二條折線設定 */ PYCartesianSeries *series2 = [[PYCartesianSeries alloc] init]; series2.name = @"成交價"; series2.type = @"line"; series2.smooth = YES; series2.symbolSize = @(1.5); series2.itemStyle = [[PYItemStyle alloc] init]; series2.itemStyle.normal = [[PYItemStyleProp alloc] init]; series2.itemStyle.normal.lineStyle = [[PYLineStyle alloc] init]; series2.itemStyle.normal.lineStyle.width = @(1.5); series2.data = @[@"7466",@"7780",@"7751",@"7377",@"7428",@"7628",@"7590",@"7799",@"7565",@"7423",@"7263",@"7113"]; [seriesArr addObject:series2]; [option setSeries:seriesArr]; /* 初始化圖示 */ self.xgEchartView = [[PYZoomEchartsView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH * 2, 300)]; //新增到scrollView上 [self.scrollView addSubview:self.xgEchartView]; //設定圖示資料 [self.xgEchartView setOption:option]; }
2.柱型圖
無獨有偶,柱形圖和折線圖的實現方法差不多,僅是資料型別將 'Line' -> 'Bar'
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor whiteColor]; [self createScrollView]; //標準柱狀圖 [self showBarDemo]; [self.xgBarChartView loadEcharts]; } - (void)createScrollView { _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 100, SCREEN_WIDTH, 300)]; // _scrollView.contentSize = CGSizeMake(SCREEN_WIDTH *2, 0); //禁止上下滑動 _scrollView.showsHorizontalScrollIndicator = NO; [self.view addSubview:self.scrollView]; } - (void)showBarDemo { /* 圖表 */ PYOption *option = [[PYOption alloc] init]; // option.calculable = YES; /** 如果顏色程式碼輸入錯誤,則柱形圖不顯示 **/ option.color = @[@"#20BCFC",@"#ff6347"]; // option.backgroundColor = [[PYColor alloc] initWithColor:[UIColor redColor]]; /* 圖表標題 */ PYTitle *title = [[PYTitle alloc] init]; title.text = @"某地區資源分佈"; title.subtext = @"純屬虛構"; option.title = title; PYTooltip *tooltip = [[PYTooltip alloc] init]; //柱形圖採用item觸發 tooltip.trigger = PYTooltipTriggerAxis; //豎線寬度 tooltip.axisPointer.lineStyle.width = @1; //提示框,文字樣式設定 tooltip.textStyle = [[PYTextStyle alloc] init]; tooltip.textStyle.fontSize = @12; option.tooltip = tooltip; /* 圖例 */ PYLegend *legend = [[PYLegend alloc] init]; //設定柱狀圖表示資料 legend.data = @[@"降雨量",@"蒸發量"]; option.legend = legend; /* 直角座標系內繪圖網格 */ PYGrid *grid = [[PYGrid alloc] init]; grid.x = @(50); grid.y = @(60); grid.x2 = @(50); grid.y2 = @(60); //新增到圖示選擇中 option.grid = grid; /* x軸設定 */ PYAxis *xAxis = [[PYAxis alloc] init]; xAxis.type = PYAxisTypeCategory; xAxis.boundaryGap = @(YES); xAxis.position = @"bottom"; xAxis.scale = YES; //軸標記點 xAxis.splitArea.show = NO; //軸線 xAxis.axisLine.show = NO; //文字標籤 xAxis.axisLabel.interval = @"auto"; //座標軸小標記 xAxis.axisTick = [[PYAxisTick alloc] init]; xAxis.axisTick.show = YES; NSMutableArray *data = [NSMutableArray arrayWithObjects:@"週一",@"週二",@"週三",@"週四",@"週五",@"週六",@"週日", nil]; xAxis.data = data; option.xAxis = [[NSMutableArray alloc] initWithObjects:xAxis, nil]; /* y軸設定 */ PYAxis *yAxis = [[PYAxis alloc] init]; //軸線 yAxis.axisLine.show = YES; yAxis.type = PYAxisTypeValue; yAxis.splitNumber = @7; //頂部線條型別 yAxis.splitLine.lineStyle.type = @"dashed"; yAxis.axisLabel.formatter = @"{value}ml"; //最大值最小值 //yAxis.max = @250; //yAxis.min = @0; option.yAxis = [[NSMutableArray alloc] initWithObjects:yAxis, nil]; NSMutableArray *seriesArr = [NSMutableArray array]; PYCartesianSeries *series1 = [[PYCartesianSeries alloc] init]; /* 設定柱狀圖1型別 */ series1.type = @"bar"; //所代表資料 series1.name = @"降雨量"; //柱間間距 預設30% //series1.barGap = @"30%"; //類目間柱形距離,預設為類目間距的20% //series1.barCategoryGap = @"20%"; //柱條最低高度,防止item過小影響互動 //series1.barMinHeight = 0; //柱條寬度 不設定時自適應 //series1.barWidth = @100; //柱條最大寬度 不設定時自適應 //series1.barMaxWidth = @200; //series1.stack = @"group1"; //設定柱狀圖樣式 //series1.itemStyle = [[PYItemStyle alloc] init]; //series1.itemStyle.normal = [[PYItemStyleProp alloc] init]; //柱狀圖邊框顏色 //series1.itemStyle.normal.barBorderColor = [UIColor blueColor]; /*柱狀圖邊框圓角,單位px。預設為0,支援傳入陣列指定圓角半徑 例如[5,5,0,0] 分別 順時針 對應左上 右上 右下 左下 */ //series1.itemStyle.normal.barBorderRadius = @[@5,@5,@0,@0]; //柱狀圖邊框線寬度 //series1.itemStyle.normal.barBorderWidth = @100; //定義座標點資料 series1.data = @[@126.2,@80.2,@96.0,@64.6,@81.3,@100.8,@140.4]; [seriesArr addObject:series1]; /* 設定柱狀圖2型別 */ PYCartesianSeries *series2 = [[PYCartesianSeries alloc] init]; series2.type = @"bar"; series2.name = @"蒸發量"; series2.data = @[@140.4,@120.4,@80.1,@64.8,@178.9,@99.9,@177.9]; [seriesArr addObject:series2]; [option setSeries:seriesArr]; /* 初始化圖示 */ self.xgBarChartView = [[PYZoomEchartsView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH , 300)]; //新增到scrollView上 [self.scrollView addSubview:self.xgBarChartView]; //設定圖示資料 [self.xgBarChartView setOption:option]; }
3.餅圖
餅圖在效果實現上與頁面的不同,這可能是因為編譯環境的差異。
這是餅圖的基本實現程式碼,此處有坑。背景屬性PYEchartsView與折線圖的 PYZoomEchartsView是不一樣的。
如果運用了後者折線圖本身是不會顯示出來的,即使你設定正確(被坑慘了)
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor whiteColor]; [self createScrollView]; [self showCircleDemo]; [self.xgPieEchartsView loadEcharts]; } - (void)createScrollView { _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 100, SCREEN_WIDTH , 300)]; [self.view addSubview:self.scrollView]; // self.scrollView.contentSize = CGSizeMake(SCREEN_WIDTH *2, 0); self.scrollView.showsHorizontalScrollIndicator = NO; } - (void)showCircleDemo { /* 建立圖表 */ PYOption *option = [[PYOption alloc] init]; //拖拽重計算,設定no可以提高載入速度 option.calculable = NO; // option.backgroundColor = [[PYColor alloc] initWithColor:[UIColor redColor]]; // option.color = @[@"#20BCFC",@"#ff6347"]; // PYTitle *title = [[PYTitle alloc] init]; // title.text = @"訪問資料"; // title.subtext = @"都是假的"; // option.title = title; PYTooltip *tooltip = [[PYTooltip alloc] init]; tooltip.trigger = PYTooltipTriggerItem; tooltip.formatter = @"{a} <br/>{b}:{c}({d}%)"; option.tooltip = tooltip; PYLegend *legend = [[PYLegend alloc] init]; //提示欄 佈局方式 'horizontal' 橫| 'vertical' 豎 legend.orient = PYOrientVertical; //對齊位置 legend.x = PYPositionLeft; // legend.y = PYPositionCenter; legend.data = @[@"直接訪問",@"郵件營銷",@"聯盟廣告",@"視屏廣告",@"搜尋引擎"]; option.legend = legend; //toolbox 用於切換資料檢視,暫且不寫 NSMutableArray *dataArr = [NSMutableArray array]; PYPieSeries *series1 = [[PYPieSeries alloc] init]; series1.name = @"訪問來源"; series1.type = PYSeriesTypePie; //傳單個數據為圓半徑,傳陣列資料1為內半徑,資料2為外半徑 series1.radius = @[@"50%",@"70%"]; //圓心座標 // series1.center = @[@"50%",@"50%"]; series1.itemStyle = [[PYItemStyle alloc] init]; //圈外資料 normal // series1.itemStyle.normal = [[PYItemStyleProp alloc] init]; //圈外資料資訊label series1.itemStyle.normal.label.show = YES; //圈外資料圓柱圖連線 series1.itemStyle.normal.labelLine.show = YES; //圈內文字 // series1.itemStyle.emphasis = [[PYItemStyleProp alloc] init]; // series1.itemStyle.emphasis.label.show = YES; // series1.itemStyle.emphasis.labelLine.show = NO; // series1.itemStyle.emphasis.label.position = @"center"; // series1.itemStyle.emphasis.label.textStyle.fontSize = @(45); // series1.itemStyle.emphasis.label.textStyle.fontWeight = @"bold"; // series1.selectedMode = @"single"; series1.data = @[@{@"value":@(335),@"name":@"直接訪問"}, @{@"value":@(310),@"name":@"郵件營銷"}, @{@"value":@(234),@"name":@"聯盟廣告"}, @{@"value":@(135),@"name":@"視屏廣告"}, @{@"value":@(1548),@"name":@"搜尋引擎"}]; [dataArr addObject:series1]; [option setSeries:dataArr]; /* 初始化圖示 */ self.xgPieEchartsView = [[PYEchartsView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH , 300)]; //新增到scrollView上 [self.scrollView addSubview:self.xgPieEchartsView]; //設定圖示資料 [self.xgPieEchartsView setOption:option]; }
4.散點圖
散點圖因為資料問題,明天抽空改一改在鋪上來
5.雷達圖
雷達圖同餅圖,背景是PYEchartsView。
剩餘屬性相同的就不一一贅述了
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor whiteColor]; [self createScrollView]; [self showRadar]; [self.xgEchartsView loadEcharts]; } - (void)createScrollView { _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,100, SCREEN_WIDTH, 300)]; [self.view addSubview:self.scrollView]; _scrollView.contentSize = CGSizeMake(SCREEN_WIDTH * 2, 0); self.scrollView.showsHorizontalScrollIndicator = NO; } - (void)showRadar { PYOption *option = [[PYOption alloc] init]; PYTitle *title = [[PYTitle alloc] init]; title.text = @"預算 vs 開銷 (Budget vs spending)"; title.subtext = @"純屬虛構"; option.title = title; PYTooltip *tooltip = [[PYTooltip alloc] init]; tooltip.trigger = @"axis"; option.tooltip = tooltip; PYLegend *legend = [[PYLegend alloc] init]; legend.orient = @"vertical"; legend.x = @"right"; legend.y = @"bottom"; legend.data = @[@"預算分配 (Allocated)",@"實際開銷 (Actual Spending)"]; option.legend = legend; // PYGrid *grid = [[PYGrid alloc] init]; // grid.x = @(20); // grid.y = @(40); // grid.x2 = @(20); // grid.y2 = @(40); // // option.grid = grid; //極座標 PYPolar *polar = [[PYPolar alloc] init]; //indicator 雷達指示座標 NSMutableArray *polarArr= [[NSMutableArray alloc] initWithObjects:@{@"text":@"銷售 (sales)",@"max":@(6000)}, @{@"text":@"管理 (Administartion)",@"max":@(16000)}, @{@"text":@"資訊科技 (Information Techology)",@"max":@(30000)}, @{@"text":@"客服 (Customer Support)",@"max":@(38000)}, @{@"text":@"研發 (Development)",@"max":@(52000)}, @{@"text":@"市場 (Marketing)",@"max":@(25000)} , nil]; polar.indicator = polarArr; option.polar = [NSMutableArray arrayWithObject:polar]; NSMutableArray *dataArr = [NSMutableArray array]; PYRadarSeries *series = [[PYRadarSeries alloc] init]; series.name = @"預算 vs 開銷 (Budget vs spending)"; series.type = @"radar"; //填充樣式areStyle series.itemStyle = [[PYItemStyle alloc] init]; // series.itemStyle.normal = [[PYItemStyleProp alloc] init]; series.itemStyle.normal.areaStyle = [[PYAreaStyle alloc] init]; series.itemStyle.normal.areaStyle.type = PYAreaStyleTypeDefault; series.data = @[@{@"value":@[@(4300),@(10000),@(28000),@(35000),@(50000),@(19000)], @"name":@"預算分配 (Allocated)"}, @{@"value":@[@(5000),@(14000),@(28000),@(31000),@(42000),@(21000)], @"name":@"實際開銷 (Actual Spending)"},]; [dataArr addObject:series]; option.series = dataArr; _xgEchartsView = [[PYEchartsView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH * 2, 300)]; [self.scrollView addSubview:self.xgEchartsView]; [self.xgEchartsView setOption:option]; }
結語:百度的Echart實質只是一個webView,用於提交引數載入其自身的html5程式碼實現圖表。
所以第一次讀取圖示會明顯的卡頓,並且需要網路才能完成運算這也是一個不足的地方
但是勝在功能足夠強大,型別足夠多。以上提供的程式碼只是實現了冰山的一角。但是也是最基礎的模組
可以在這基礎模組上慢慢新增各種裝飾,就以此筆記存放此處
不足的地方還是有很多的。請多多指教。天色已晚就先行歇息了