Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bar color different for negative values #2

Open
sgs1 opened this issue Sep 19, 2014 · 20 comments
Open

bar color different for negative values #2

sgs1 opened this issue Sep 19, 2014 · 20 comments

Comments

@sgs1
Copy link

sgs1 commented Sep 19, 2014

Hello!

My compliments for the project.
Two questions: is possible to change bar color only for negative values? How i can insert negative values for Y column?
Thanks

@mmislam101
Copy link
Owner

Unfortunately I didn't design the graph to handle negative values. I probably should've. As for the bar color, there's a delegate method so that you can set the color of each bar individually by returning the color you want it to be.

@sgs1
Copy link
Author

sgs1 commented Sep 23, 2014

Thanks for the reply.
I suppose that we can develop it by "cloning" the same function that you've used for positive values, but for negative.
What do you think about this idea?

@mmislam101
Copy link
Owner

If you have a graph that is specifically just for negative values then yah, you can probably just flip some logic in the methods where it'll draw the bars going down (or still up but with negative values). But I thought you meant something like where the x-axis is in the center and you can have both positive and negative values. If you can help by reformatting the logic to be flexible for both negative and positive that'd be great.
There are some gotchya's though. Dealing with floating-point numbers and comparisons of them is difficult. You'll come across some bad code around detecting whether a number is NEAR zero instead of equal to zero.

@sgs1
Copy link
Author

sgs1 commented Oct 9, 2014

Thanks for the reply.
Can i set the width of Y label?

@mmislam101
Copy link
Owner

The width of the Y label I made so that it's flexible (sort of) to whatever text is going there. Probably not the best choice for proper charting methods. Again you're totally invited to go in there and fix it up and make a Pull Request to me. The codes open to change.

@sgs1
Copy link
Author

sgs1 commented Oct 18, 2014

Thanks for the reply.

I could fix your code but i don't understand what are the methods that you've used for y label's width and for Y values. Can you help me?

@mmislam101
Copy link
Owner

Sure. I can try.
In SimpleBarChart.m you'll see a method reloadData. Inside reloadData you'll see where I set the _yLabelView.frame
That frame is based on yLabelSize.width (and whether there are yLabels at all). The yLabelSize is determined above that code using sizeWithFont for the LARGEST value of the maximum value in the set of data that is received. Probably not the best idea considering the y-axis labels could and do go above the max, I should've done it better.

Anyways. If you want to set your own custom widths, what you could do is create a property in SimpleBarChart.h that says something like customMaxYLabelWidth. And you can initialize it as 0 on the initWithFrame in SimpleBarChart.m.
Then that line where you set the _yLabelView.frame, you can check if the customMaxYLabelWidth is greater than 0 and if it is then replace the yLabelSize.width to customMaxYLabelWidth.

Would that help you? It'd be cool if you could branch off the current SimbleBarChart master, and then create a pull request so that we keep this up to date for everybody.

@sgs1
Copy link
Author

sgs1 commented Oct 27, 2014

Sorry but in reloadData i don't see _yLabelView.frame...:(

@sgs1
Copy link
Author

sgs1 commented Oct 27, 2014

I've uploaded a screenshot that shows how the Y label appears with values major of 999.
example

@mmislam101
Copy link
Owner

It's in
https://github.com/mmislam101/SimpleBarChart/blob/master/SimpleBarChart/SimpleBarChart.m
Line 155.

And by the way. If you're doing this just so that you can fit a larger data sets, have you tried setting incrementValue property to a large number? The incrementValue determines the increments in which the y-axis labels are calculated. For data sets un the thousands, you should set the incrementValue to 100 or more depending on the maximum value in your data set.

@sgs1
Copy link
Author

sgs1 commented Oct 28, 2014

last

Hi and thanks for the reply!

Yes it works, i attach here another screenshot, but i'll try with modify _yLabelView.frame.

About the values on Y-axis labels, it could be very interesting to see only some values of _values array (like the first, the third and the last)..

I've tried to modify _topValue and i've seen some negative values. Can you explain me, how you assign to Y-axis label the values?
Ideally, i could "clone" this method and assign to the value a negative sign.....

@mmislam101
Copy link
Owner

Actually there is a known bug with that where it'll show -1.0 or something instead of 0. I think that's mainly due to the problem with floating point comparison. I tried putting in some extra logic around it but I think the way I did all this just needs to be refactored honestly. If you're willing to do it that'd be super awesome.
Check out - (void)setupYAxisLabels for the logic on how those labels are calculated and placed

@sgs1
Copy link
Author

sgs1 commented Oct 28, 2014

What are you talking about, in this words:

"Actually there is a known bug with that where it'll show -1.0 or something instead of 0. I think that's mainly due to the problem with floating point comparison. I tried putting in some extra logic around it but I think the way I did all this just needs to be refactored honestly. If you're willing to do it that'd be super awesome."

@mmislam101
Copy link
Owner

Oh don't worry about that, I mis-read what you wrote.

@sgs1
Copy link
Author

sgs1 commented Oct 29, 2014

No problem!

I've another question. Can i modify the frame of bar if they have a negative values?
thanks

@mmislam101
Copy link
Owner

Absolutely, do whatever you need to do.

What would be nice is if you could make the x-axis flexible so that (based on what kind of values are in the data set) it will move up and down so that it can account for negative values with bars going down from the x-axis line and bars going the usual up from the x-axis line.
So it can look like this: http://www.andypope.info/charts/invert_10.gif

@sgs1
Copy link
Author

sgs1 commented Oct 29, 2014

thanks for the reply,and good idea...
But the question is if in the code there is some part where i can change the position of the bar only with negative values.

If you see the previous image that i've uploaded, you can see that the first label is on first bar...and it could be better if the bar is under the value label...

@mmislam101
Copy link
Owner

hmm. That would require you to do a lot of refactoring that includes positioning the start of the rectangle for each bar be at a different value for negative numbers than positive numbers.
That would require you to become familiar with how I draw the bars themselves. You can look at (void)setupBars to see how I set the rects for each bar in the data set. In there you'll have to add logic to shift the y-positions of bars for negative values.
Is that what you wanted to do?

@mmislam101
Copy link
Owner

And I apologize that I didn't comment this code properly the first time. I'll make sure to do that from now on so that collaboration can be easier.

@sgs1
Copy link
Author

sgs1 commented Oct 29, 2014

Yes, you've understand my problem.

Please let me know when you have commented the code...
Thanks for the update!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants