每个栏的ios图表标签
我正在使用ios图表显示条形图。看起来是这样的: 我想得到的是红色框中的标签(对于所有的条,我只是不想经常重复…:p)。这意味着每个栏都有自己的“标题”标签,因此用户可以看到每个值的类别名称 另一个问题是:我添加的条越多,条越小。我是否可以将条形图视图放入滚动视图,将条形图的宽度设置为静态值,例如,还有20个值,用户只需向右滚动即可看到更多值 编辑代码:每个栏的ios图表标签,ios,swift,ios-charts,Ios,Swift,Ios Charts,我正在使用ios图表显示条形图。看起来是这样的: 我想得到的是红色框中的标签(对于所有的条,我只是不想经常重复…:p)。这意味着每个栏都有自己的“标题”标签,因此用户可以看到每个值的类别名称 另一个问题是:我添加的条越多,条越小。我是否可以将条形图视图放入滚动视图,将条形图的宽度设置为静态值,例如,还有20个值,用户只需向右滚动即可看到更多值 编辑代码: func entries(for chart:ChartType, content:ChartContent, max:Int = In
func entries(for chart:ChartType, content:ChartContent, max:Int = Int.max)->[ChartDataEntry]{
let transactions = manager.transactions.value
let grouped = content == .category ? transactions.categorise({$1.category}) : transactions.categorise({$1.payee})
var entries:[ChartDataEntry] = []
let formatter = NumberFormatter()
formatter.locale = Locale.current
formatter.numberStyle = .currency
for i in 0..<grouped.count {
let c = Array(grouped.keys)[i]
let ts = grouped[c]!
var sum = 0.0
ts.forEach{k,t in
if t.expense{
sum += Double(t.value)
}
}
if chart == .pie{
let entry = PieChartDataEntry(value: sum, label: "\(c)")
if entries.count < max{
entries.append(entry)
}else{
entries.sort(by: {$0.0.y > $0.1.y})
break
}
}else if chart == .bar{
let entry = BarChartDataEntry(x: Double(i), y: sum, data: c as AnyObject?)
if entries.count < max{
entries.append(entry)
}else{
entries.sort(by: {$0.0.y > $0.1.y})
break
}
}
}
return entries
}
func showBarChart(content: ChartContent){
// Do any additional setup after loading the view.
let data = BarChartData()
let content = entries(for: .bar, content: content)
let ds1 = BarChartDataSet(values: content, label: "")
let xAxis=XAxis()
let chartFormmater = ChartFormatter()
chartFormmater.content = content as! [BarChartDataEntry]
for i in 0..<content.count{
chartFormmater.stringForValue(Double(i), axis: xAxis)
}
xAxis.valueFormatter=chartFormmater
barChartView.xAxis.valueFormatter=xAxis.valueFormatter
barChartView.xAxis.labelPosition = .bottom
ds1.colors = ChartColorTemplates.material()
data.addDataSet(ds1)
self.barChartView.data = data
self.barChartView.gridBackgroundColor = NSUIColor.white
self.barChartView.animate(xAxisDuration: 0.0, yAxisDuration: 1.0)
}
@objc(BarChartFormatter)
class ChartFormatter:NSObject,IAxisValueFormatter{
var content:[BarChartDataEntry]!
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
return content[Int(value)].data as! String
}
}
func条目(用于图表:ChartType,内容:ChartContent,max:Int=Int.max)->[ChartDataEntry]{
让事务=manager.transactions.value
let grouped=content==.category?transactions.category({$1.category}):transactions.category({$1.paye})
变量条目:[ChartDataEntry]=[]
let formatter=NumberFormatter()
formatter.locale=locale.current
formatter.numberStyle=.currency
对于i(0..$0.1.y})
打破
}
}如果图表==.bar,则为else{
let entry=BarChartDataEntry(x:Double(i),y:sum,data:c作为任意对象?)
如果entries.count$0.1.y})
打破
}
}
}
返回条目
}
func showBarChart(内容:ChartContent){
//加载视图后执行任何其他设置。
let data=BarChartData()
让内容=条目(对于:.bar,内容:content)
设ds1=BarChartDataSet(值:内容,标签:“”)
设xAxis=xAxis()
让chartFormmater=ChartFormatter()
chartFormmater.content=内容为![BarChartDataEntry]
对于0..String中的i{
返回内容[Int(value)]。数据为!字符串
}
}
新截图:
您可以在自己的类中实现:
为此,您只需实现此方法:
func stringForValue(_ value: Double, axis: AxisBase?) -> String
示例:
- ->在这里,您可以使用块添加自定义计算
// MARK: axisFormatDelegate
extension ViewController: IAxisValueFormatter {
func stringForValue(_ value: Double, axis: AxisBase?) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = “HH:mm.ss”
return dateFormatter.string(from: Date(timeIntervalSince1970: value))
}
}
回答第一个和第二个问题。我建议你做的是有一个侧面滚动的集合视图。在每个集合视图单元格中,可以包含标题栏和值。这将有助于您重复尽可能多的图形,就像您希望滚动视图的请求一样 您可以实现下面的代码,以解决这两个问题 在下面的函数中,我传递了两个参数,即数据点:x轴标签和值:条的值。它还解决了您的滚动问题
func setChart(dataPoints: [String], values: [Float])
{
barChartView.noDataText = "You need to provide data for the chart."
for i in 1..<values.count
{
let dataEntry = BarChartDataEntry(x: Double(i), yValues: [Double(values[i])])
dataEntries.append(dataEntry)
}
let chartDataSet:BarChartDataSet!
let chartDataSet = BarChartDataSet(values: dataEntries, label: "BarChart Data")
let chartData = BarChartData(dataSet: chartDataSet)
barChartView.data = chartData
barChartView.xAxis.valueFormatter = IndexAxisValueFormatter(values: dataPoints)
barChartView.xAxis.granularityEnabled = true
barChartView.xAxis.drawGridLinesEnabled = false
barChartView.xAxis.labelPosition = .bottom
barChartView.xAxis.labelCount = 30
barChartView.xAxis.granularity = 2
barChartView.leftAxis.enabled = true
//barChartView.leftAxis.labelPosition = .outsideChart
//barChartView.leftAxis.decimals = 0
let minn = Double(values.min()!) - 0.1
barChartView.leftAxis.axisMinimum = Double(values.min()! - 0.1)
//barChartView.leftAxis.granularityEnabled = true
//barChartView.leftAxis.granularity = 1.0
//barChartView.leftAxis.labelCount = 5
barChartView.leftAxis.axisMaximum = Double(values.max()! + 0.05)
barChartView.data?.setDrawValues(false)
barChartView.pinchZoomEnabled = true
barChartView.scaleYEnabled = true
barChartView.scaleXEnabled = true
barChartView.highlighter = nil
barChartView.doubleTapToZoomEnabled = true
barChartView.chartDescription?.text = ""
barChartView.rightAxis.enabled = false
barChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInOutQuart)
chartDataSet.colors = [UIColor(red: 0/255, green: 76/255, blue: 153/255, alpha: 1)]
}
希望对您有所帮助。为了补充前面的答案,如果您确实希望显示所有值,并且您的值超过25个,请记住修改AxisBase.swift中LabelCount的硬编码限制,如下所示:
open var labelCount: Int
{
get
{
return _labelCount
}
set
{
_labelCount = newValue
// WHY?
// This limits the Amount of Labels We can Display: (Removing) -> Comment OUT
//
// if _labelCount > 25
// {
// _labelCount = 25
// }
// if _labelCount < 2
// {
// _labelCount = 2
// }
//
forceLabelsEnabled = false
}
}
打开变量标签计数:Int
{
得到
{
返回标签计数
}
设置
{
_labelCount=newValue
//为什么??
//这限制了我们可以显示的标签数量:(删除)->注释掉
//
//如果_labelCount>25
// {
//_labelCount=25
// }
//如果_labelCount<2
// {
//_labelCount=2
// }
//
ForceLabelEnabled=false
}
}
我希望这有帮助:-)请添加您的代码。您是如何创建的?您是如何使用格式化程序的?@user2529173这几乎可以正常工作了,谢谢。它只显示每秒钟一条的标签(将在一分钟内更新代码和屏幕截图)
content[Int(value)]。数据如下!字符串
->那么你的内容
没有你的值
?调试你得到的值是多少?@muescha Ashish你能帮我做这个Hello@Harshit,我没有使用组合条形图和折线图,但我建议你浏览这个链接。。。他们已经解释了带x轴标签的组合条形图和折线图。也请看一下这个答案,他们已经为组合图表设置了x轴标签,希望对您有所帮助。
open var labelCount: Int
{
get
{
return _labelCount
}
set
{
_labelCount = newValue
// WHY?
// This limits the Amount of Labels We can Display: (Removing) -> Comment OUT
//
// if _labelCount > 25
// {
// _labelCount = 25
// }
// if _labelCount < 2
// {
// _labelCount = 2
// }
//
forceLabelsEnabled = false
}
}