一个简单优雅的LineChart和pieChart库,动画丰富。不久后将有更多类型的图表。
WYLineChart
让创建折线图变得简单,可滚动,可捏缩,可动化
WYPieChart
让创建饼图变得简单,可旋转,可拖动,可选择,可动化
WYRadarChart
让创建雷达图变得简单,可动化
经过一段时间,WYChart版本0.2.0已发布,它支持折线图中多条线。
如果你喜欢WYChart,用一颗星鼓励我
如果你喜欢WYChart,给我一个星星
另外,关于WYChart技术及其它介绍的文章已开始撰写并逐步发布,
WYChart适用于iOS7+,兼容ARC。需要一些框架,如下
上述框架通常包含在大多数Xcode项目中。
WYChart在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。
项目包含一个示例,演示了两个图表以及如何使用属性和方法来使用图表的代码。特别是,有两个图表的设置页面,您可以更改属性并查看发生了什么变化。为了运行示例项目,首先从Example目录中克隆存储库,然后从示例目录中运行pod install
。示例页面显示以下内容
主表
饼图设置页面
折线图设置页面
WYChart可通过CocoaPods获得。要安装它,请简单地将其添加到您的Podfile中以下行
pod "WYChart"
只需将WYChart文件夹拖放到您的下载项目中,然后拖放到您的项目中。
WYChart设计了类似于UIKit框架中大多数控件(如UITableView、UICollection)的接口,您需要实现所需的代理和数据源方法,并设置一些基本属性。
将以下行添加到您使用图表的.h
或.m
文件中
#import "WYLineChart.h"
或者
#import "WYPieChart.h"
以下行将向您展示如何以不同方式初始化WYLineChart和WYPieChart。
首先,将以下行添加到遵循WYLineChartViewDelegate和WYLineChartViewDataSource的行中
@interface SomeViewController () <WYLineChartViewDelegate, WYLineChartViewDatasource>
其次,为WYLineChartView初始化实例
_chartView = [[WYLineChartView alloc] initWithFrame:frame];
_chartView.delegate = self;
_chartView.datasource = self;
第三,设置线图表数据数组,包含多个WYLineChartPoint
NSMutableArray *mutableArray = [NSMutableArray array];
// line_1
NSArray *points = [WYLineChartPoint pointsFromValueArray:@[@(70706.89),@(75623.4),@(90980.f),@(80890.34),@(60321.2)]];
[mutableArray addObject:points];
// line_2
points = [WYLineChartPoint pointsFromValueArray:@[@(50503.134),@(50446.85),@(50555.67),@(60216.48),@(50664.45),@(80890.34),@(30321.2)]];
[mutableArray addObject:points];
// set data
_lineChart.points = mutableArray;
在v0.2.0之后,lineChart.points包含多行点,因此数据结构发生了变化,具体请参看头文件WYLineChartView.h
// all the points of lines on the graph
// the content should be:
// /* points */@[
// /* line 0 */ @[
// /* point 0 */ (WYLineChartPoint *)point0, point1, point2 ...
// ],
// /* line 1 */ @[
// /* point 0 */ (WYLineChartPoint *)point0, point1, point2 ...
// ],
// ]
// v0.2.0
最后,将图表添加到控制器的视图中并更新线图表
[self.view addSubview:_chartView];
[_chartView updateGraph];
除此之外,您还需要实现所需的代理和数据源方法
代理
- (CGFloat)gapBetweenPointsHorizontalInLineChartView:(WYLineChartView *)chartView;
数据源
- (NSString *)lineChartView:(WYLineChartView *)chartView contentTextForXAxisLabelAtIndex:(NSInteger)index
- (WYLineChartPoint *)lineChartView:(WYLineChartView *)chartView pointReferToXAxisLabelAtIndex:(NSInteger)index
上述工作还不够,还有很多可选属性可以配置线图表的外观和交互。顺便说一下,从v0.2.0开始,我们使用字典(键值对)通过数据源方法-(NSDictionary *)lineChartView:(WYLineChartView *)chartView attributesForLineAtIndex:(NSUInteger)index;
配置线的属性,因此,如果需要配置某个属性,比如线条样式,您必须实现上面的数据源方法。
渐变前景 渐变前景
是一个可选的线条属性,您应该使用数据源方法中的kWYLineChartLineAttributeDrawGradient
键。为了让线表格看起来更优雅,您可以选择为它添加渐变前景,添加以下行
- (NSDictionary *)lineChartView:(WYLineChartView *)chartView attributesForLineAtIndex:(NSUInteger)index {
NSMutableDictionary *resultAttributes = [NSMutableDictionary dictionary];
resultAttributes[kWYLineChartLineAttributeDrawGradient] = @YES;
...
// other line attributes config
...
return resultAttributes;
}
在v0.2.0之后,无需设置渐变颜色,因为它与线条颜色一致,所以我们只需要决定是否显示渐变。
以下是这样显示渐变前景的示例
渐变前景
否则
没有渐变前景
可滚动的
WYLineChart支持您水平滚动图表,只需添加以下简单行
_chartView.scrollable = YES;
然后,您可以滚动图表
滚动图表
可捏合的
您也可以添加以下行
_chartView.pinchable = YES;
来使图表可捏合,当您想调整图表的数据范围时很有用,您可以向外或向内捏合来重新加载数据,而在- (void)lineChartView:didEndedPinchGraphWithOption:
方法中会收到通知,在这些通知中,您可以重新设置数据数组和更新图表。
线条样式
线条样式是可选的线条属性,您应该使用数据源方法中的kWYLineChartLineAttributeLineStyle
键。WYLineChart支持三种线条样式
kWYLineChartMainStraightLine,
kWYLineChartMainBezierWaveLine,
kWYLineChartMainBezierTaperLine
如果不想画线而只显示点,可以选择数据源方法中的kWYLineChartMainNoneLine
作为kWYLineChartLineAttributeLineStyle
键。
波浪样式
直线样式
短划线样式
波浪、直线、短划线样式
没有线条
动画样式
动画不是线条属性,它是线图表属性,一旦设置,则所有线条都一致。图表有几种动画
kWYLineChartAnimationDrawing,
kWYLineChartAnimationAlpha,
kWYLineChartAnimationWidth,
kWYLineChartAnimationRise,
kWYLineChartAnimationSpring,
kWYLineChartNoneAnimation
例如,kWYLineChartAnimationDrawing
表示为
绘制动画
和kWYLineChartAnimationSpring
表示为
弹簧动画
接头样式是可选的线条属性,您应该使用数据源方法中的kWYLineChartLineAttributeJunctionStyle
键。您可以以下面所述的方式选择接头样式
kWYLineChartJunctionShapeNone,
kWYLineChartJunctionShapeSolidCircle,
kWYLineChartJunctionShapeHollowCircle,
kWYLineChartJunctionShapeSolidSquare,
kWYLineChartJunctionShapeHollowSquare,
kWYLineChartJunctionShapeSolidRectangle,
kWYLineChartJunctionShapeHollowRectangle,
kWYLineChartJunctionShapeSolidStar,
kWYLineChartJunctionShapeHollowStar
例如,kWYLineChartJunctionShapeHollowRectangle
将表示为
空心矩形
触摸点/线
WYLineChart包含一个长按手势,用于在触摸线上显示您触摸的位置,并通过以下代理方法返回点
- (void)lineChartView:didBeganTouchAtSegmentOfPoint:value:
- (void)lineChartView:didMovedTouchToSegmentOfPoint:value:
- (void)lineChartView:didEndedTouchToSegmentOfPoint:value:
触摸点
但是,从v0.2.0开始,这个属性仅在lineChartView中只有一行时才有效。
点的标签
从v0.2.0版本开始,它支持您自定义标签以显示在点附近的附近。只需实现dataSource方法- (NSString *)lineChartView:(WYLineChartView *)chartView contextTextForPointAtIndexPath:(NSIndexPath *)indexPath
,如果您返回nil,则indexPath处的标签将不会显示。
WYLineChart中有很多特性,如果您对此感兴趣,请参阅接口和定义文件。
首先,按顺序遵循WYPieChartViewDelegate和WYPieChartViewDataSource
@interface SomeViewController () <WYLineChartViewDelegate, WYLineChartViewDatasource>
其次,初始化WYPieChartView实例
_pieView = [[WYPieChartView alloc] initWithFrame:CGRectMake(0, 70, self.view.wy_boundsWidth, 300)];
_pieView.delegate = self;
_pieView.datasource = self;
第三,设置包含多个扇区值的饼图数据数组
_pieView.values = @[@50, @200, @40, @300, @100];
最后,将图表添加到控制器的视图并更新饼图
[self.view addSubview:_pieView];
[_pieView update];
除此之外,dataSource方法- (UIColor *)pieChartView:sectorColorAtIndex:
需要扇区颜色,您必须实现该方法以着色您的饼图。
与WYLineChart类似,还有很多可选属性可供您配置线形图的外观和交互。
饼图样式
您可以在kWYPieChartNormalStyle
和kWYPieChartGearStyle
之间选择样式,如下所示
普通饼图样式
齿轮饼图样式
在初始化饼图时添加以下行
_pieView.style = kWYPieChartNormalStyle/kWYPieChartGearStyle;
可旋转
如果您想让饼图更具交互性,可以添加以下代码
_pieView.rotatable = YES;
使其可旋转。
饼图可旋转
选择
WYPieChart支持您选择扇区,并且有2种类型的动画,选择时将回调到代理方法pieChartView:didSelectedSectorAtIndex:
,您可以选择选择类型,如下所示kWYPieChartSectorSelectedExtraction
和kWYPieChartSectorSelectedPull
_pieView.selectedStyle = kWYPieChartSectorSelectedExtraction;
提取样式
拉动样式
动画样式
有6种动画样式可以选择,在重新加载饼图时进行动画处理
kWYPieChartAnimationOrderlySpreading,
kWYPieChartAnimationAllSpreading,
kWYPieChartAnimationStretching,
kWYPieChartAnimationAlpha,
kWYPieChartAnimationScale
例如,kWYPieChartAnimationAllSpreading
样式如下所示
均匀展开样式
您可以选择其他动画样式来查看演示中的效果。
内圆
属性showInnerCircle
定义是否应在图表中绘制空心圆,您可以在上面添加标签,例如总和标签。
内圆
渐变
默认情况下,fillByGradient
属性为NO,如果您将其设置为YES,则每个扇区都将使用渐变填充。
渐变填充
一些其他功能也包括在WYPieChart中,您可以在PieChartView.h中找到它们
首先,创建一个符合协议WYRadarChartViewDataSource
的类
@interface SomeClass <WYRadarChartViewDataSource>
其次,构建一个WYRadarChartDimension
数组,它描述了WYRadarChartView的顶点
self.dimensions = [NSMutableArray new];
for (NSInteger index = 0; index < self.dimensionCount; index++) {
WYRadarChartDimension *dimension = [WYRadarChartDimension new];
dimension.title = @"title";
dimension.titleColor = [UIColor whiteColor];
[self.dimensions addObject:dimension];
}
第三,使用维度数组和dataSource创建WYRadarChartView
self.radarChartView = [[WYRadarChartView alloc] initWithFrame:CGRectMake(0, 0, 100,100)
dimensions:self.dimensions
gradient:1];
self.radarChartView.dataSource = self;
最后,您可以更改WYRadarChartView
的UI,如gradient
(确定圆的数量,至少为1)、lineWidth
、lineColor
。然后用reloadData
或reloadDataWithAnimation:duration:
重新加载
维度
雷达图视图必须使用维度数组创建。
维度
项目
从数据源获取项目数据并配置WYRadarChartItem
的UI样式
self.items = [NSMutableArray new];
for (NSInteger index = 0; index < self.itemCount; index++) {
WYRadarChartItem *item = [WYRadarChartItem new];
NSMutableArray *value = [NSMutableArray new];
for (NSInteger i = 0; i < self.dimensionCount; i++) {
[value addObject:@(arc4random_uniform(100)*0.01)];
}
item.value = value;
item.borderColor = [UIColor wy_colorWithHex:0xffffff];
item.fillColor = [UIColor wy_colorWithHex:arc4random_uniform(0xffffff) alpha:0.5];
item.junctionShape = kWYLineChartJunctionShapeSolidCircle;
[self.items addObject:item];
}
#pragma mark - WYRadarChartViewDataSource
- (NSUInteger)numberOfItemInRadarChartView:(WYRadarChartView *)radarChartView {
return self.items.count;
}
- (WYRadarChartItem *)radarChartView:(WYRadarChartView *)radarChartView itemAtIndex:(NSUInteger)index {
return self.items[index];
}
- (id<WYRadarChartViewItemDescription>)radarChartView:(WYRadarChartView *)radarChartView descriptionForItemAtIndex:(NSUInteger)index {
return nil;
}
项目
渐变
self.radarChartView.gradient = self.gradient;
[self.radarChartView reloadDataWithAnimation:self.animation duration:kAnimationDuration];
渐变
动画
以动画和动画持续时间重新加载
typedef NS_ENUM(NSUInteger, WYRadarChartViewAnimation) {
WYRadarChartViewAnimationNone,
WYRadarChartViewAnimationScale,
WYRadarChartViewAnimationScaleSpring,
WYRadarChartViewAnimationStrokePath
};
[self.radarChartView reloadDataWithAnimation:self.animation duration:kAnimationDuration];
均匀展开样式
接头样式
您可以使用与WYLineChart的接头样式相同的样式配置WYRadarChartItem
的junctionShape
属性
/*
* default is kWYLineChartJunctionShapeNone
*/
@property (nonatomic, assign) WYLineChartJunctionShapeStyle junctionShape;
如果您有任何问题或有了想法,您可以很高兴通过一个#issue
与我分享,或者通过以下[email protected]电子邮件,或者在我个人博客上找到有关WYChart或其他主题的一些技术内容。