ExtJs 4 was released yesterday and the reason I am pretty excited about this new ExtJs version is Charting. I have been using HighCharts with ExtJs till now. Although HighCharts work and look great, there isn’t a standard adapter/bridge provided by either ExtJs or HighCharts team to make them work together seamlessly.
An ExtJs user going by the handle buz had earlier posted HighCharts Adapter and plugin for ExtJs 3 (here), that I subsequentaly adpated to work with HighCharts 2.x (available here). Although this worked, I was never too satisfied with the solution as the integration was not perfect (things like re-sizing containers disoriented the charts) and subsequent ExtJs and HighCharts releases needed regular tweaks and changes to the adapter.
So, a native ExtJs Charting solution finally meant no more fiddling around with diverse frameworks trying to make them work together.
And yesterday, I released my first ExtJs 4 based chart to a client for evaluation. It was for financial performance monitoring with multiple side-by-side charts demonstrating financial data from different periods. And I had a brief hell-of-a-time to make the Charts work the way I wanted them to. There were 2 main areas I was having problems with:
- I needed vertically stacked charts.
- I needed multiple side-by-side charts.
Before discussing further, you can see a simplified version of the Charts I needed below (Click here to open the example in a new window):
ExtJs 4 docs are nowhere near perfect nor complete. There are so many config options and utility methods that I have came across over the last 2 weeks that are not there in the API docs yet for ExtJs 4. For the present scenario, the docs do not mention anything about Stacked charts, but ExtJs 4 examples present one particular sample of a Stacked Bar chart.
I used that as a guide, and it took over an hour for me to finally realize that the “stacked: true” config option is also supported for Column charts.
So, a single chart was ready now and displaying nicely. The next challenge was to have multiple side-by-side charts. I tought it should be pretty easy to accompolish this with a Column layout for a panel and 3 charts being equal width children of the panel (Remember, an ExtJs 4 Chart is a regular ExtJs component, so it shouldn’t be an issue housing it in any ExtJs container with any layout available. This in fact is one of the most highlighted features of ExtJs 4 charts).
However doing so, none of the charts rendered. I checked the Developer Tools to notice that although the Charts were rendering in the browser, their height was virtually 0. So, it must be some issue with the layout. I played around with Column Layout, HBox layout and others but Charts never rendered with their full height.
This continued until I realized that the layoutConfig option is no longer supported for ExtJs 4 containers, rather the layout configuration has to be specified with the layout option itself. Having found this, it became simple now to configure the parent with a HBox layout and align set to stretch and the Charts rendered perfectly.
Now one last issue was exact determination of the stacked component for displaying an appropriate tooltip when mouse is hovered over the vertical columns (try moving mouse over the green and blue portions of the charts above). You would notice that it correctly displayes the stacked column portion as belonging to “grossAmount” or “commission” store field. However the charts themselves do not help you in determining this. I have used value comparisons in the code to detect the stacked column portion (please see the attached code below for details). But this is not perfect and would fail if grossAmount and commission for a record happen to have the same values. I will try to figure out a better solution for this issue and post it in a separate blog entry (I haven’t found anything in the docs or a example which shows determining the portion of the stacked chart the mouse is hovering over).
See my post here about a possible hack that would give you the hex code for the color you are clicking on as well as the bar name from the store so you could determine what bar you are on that way.
a.attr = This will return the attributes of the bar that you clicked on, one way to differentiate the actual bar in an example like the one above id to get the color as it is a constant, but this would require a sloppy bit of code that would equate a color in hex code to a category. This is definitely not a best practice!
http://www.learnsomethings.com/2011/05/12/look-ma-no-flash-extjs-4-0-chart-click-event-tips-tricks-and-at-least-one-hack-to-identify-which-grouped-bar-instance-has-been-clicked-in-a-grouped-bar-chart/
Hi Rahul,
Do you mean the new Ext JS 4 charting function is a good replacement of HighCharts? or it is still has some flaw, so still need to use HighCharts?
I am looking for a good enough javascript library to draw charts.
Sincerely,
Micky
Hi Rahul ,
Did you get any solution for the issue you mentioned above in the orignial post(Not able to identify which bar is clicked).
Also you are using itemmousedown event, i found itemclick event is yet not supported. itmemousedown means mouse click on any button, do you have any solution for it as well.
Thanks
Lalit
Thank you for taking the time to put this together and for sharing it. God bless you.
Hi Rahul,
Is it same thing is possible in ExtJS 3.4? If yes please share any example link.
I have stacked column chart where I have used code for label in display as “insideEnd”,
label: {
display: ‘insideEnd’,
‘text-anchor’: ‘middle’,
renderer: Ext.util.Format.numberRenderer(‘0’),
orientation: ‘vertical’,
fill: ‘#fff’
}
but with this I want total of full bar(all stacks togather) to be shown outside of bar chart along with the stacks showing their own total inside the stacks?
Any suggestion or solution for this or I need to customize or calculate total differently….???