Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » BIRT » [chart] with multiple categories (on x)
[chart] with multiple categories (on x) [message #908333] Wed, 05 September 2012 07:25 Go to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
i need to visualize pivot tables (cross tables) in bar charts. i just switched from jfree chart (mainly beacuse of bad svg output), but with it i created such a chart:

index.php/fa/11388/0/

Is it possible to get multiple categories on x-Axis (a hierarchical grouping)?
Re: [chart] with multiple categories (on x) [message #908607 is a reply to message #908333] Wed, 05 September 2012 16:29 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

Currently the only way to do this is with some scripting to move the
labels around. If you want an example of this I can post one. BTW for
crosstabs and tables, they can automatically be converted to charts.
See this post:
http://birtworld.blogspot.com/2010/04/multi-view-report-items.html

Jason

On 9/5/2012 3:25 AM, moritz du wrote:
> i need to visualize pivot tables (cross tables) in bar charts. i just switched from jfree chart (mainly beacuse of bad svg output), but with it i created such a chart:
>
>
>
> Is it possible to get multiple categories on x-Axis (a hierarchical grouping)?
>
Re: [chart] with multiple categories (on x) [message #908875 is a reply to message #908607] Thu, 06 September 2012 06:46 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx jason,

In my case the tables are self made and table representation in web, pdf, excel, csv is done. Now i only need the chart. First we tried jfreechart but their svg output is unusable (no interactivity).
thx to you i can create charts from all tables as specified. the only problem remaining is the formatting of x labels for pivot tables. they have up to 3 dimension on one axis and concatenating all dimensions will be too much (the real label are much longer than in the example). in most cases the regional dimension should be separated (R3, R8 in example).

So an example how to achieve the label moving will be great.

[Updated on: Thu, 06 September 2012 07:14]

Report message to a moderator

Re: [chart] with multiple categories (on x) [message #909208 is a reply to message #908875] Thu, 06 September 2012 18:27 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

Take a look at the attached example.

Jason
Re: [chart] with multiple categories (on x) [message #909445 is a reply to message #909208] Fri, 07 September 2012 06:47 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx again Jason,

i opened it in eclipse (created an report project first). Only the "Layout" and the "XML Source" tabs are showing something.

On Layout tab a normal stacked chart is shown - without special labels on x. Can you please give me a hint what to do or how to get multiline x-labels?

and a hint how to integrate such stuff into my java code would be also much appreciated.
Re: [chart] with multiple categories (on x) [message #909721 is a reply to message #909445] Fri, 07 September 2012 16:38 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

If you imported the report, you should have layout, Master Page, Script, XML Source and Preview tabs. If you create a new report do you get those? You can always select the xml tab and copy and paste the report contents in. Specifically this was done with chart script. Select the chart and click on the script tab:


last = "";
function beforeDrawAxisLabel( axis, label, icsc )
{
importPackage(
Packages.org.eclipse.birt.chart.model.attribute.impl );
importPackage(
Packages.org.eclipse.birt.chart.model.attribute );
if( axis.getType() == AxisType.TEXT_LITERAL ){
var cp =label.getCaption().getValue();
if( cp.substr(0,2) == last ){
label.getCaption().setValue(cp.substr( (cp.length()-2)));
}else{
label.getCaption().setValue(cp.substr( (cp.length()-2))+"\n\r "+cp.substr(0,2));
}
last = cp.substr(0,2);
}
}

It uses a beforeDrawAxisLabel script. When using the Chart API you can set a script like:

ChartWithAxes cwaBar = ChartWithAxesImpl.create( );

cwaBar.setScript( "function afterDataSetFilled( series, idsp,Iicsc )"
+ "{importPackage(Packages.java.lang); "
+ "if (series.getLabel().isVisible() == true)"
+ "{System.out.println(\"ok\");} "
+ "else"
+ "{System.out.println(\"false\");}} "
);


Jason
Re: [chart] with multiple categories (on x) [message #910643 is a reply to message #909721] Mon, 10 September 2012 06:33 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx jason,

i added the script to script tab of your report "adjustxaxislabelsmultiline". but what now? the preview tab and "view report" remains empty. (on saving eclipse had to convert the report to new version of birt - i use 4.2)
Re: [chart] with multiple categories (on x) [message #910955 is a reply to message #910643] Mon, 10 September 2012 17:42 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

Do you mean there is no preview tab or the report comes back empty? Did you download the BIRT all in one?

Jason
Re: [chart] with multiple categories (on x) [message #911259 is a reply to message #910955] Tue, 11 September 2012 08:59 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
the tab(preview) and the view(report viewer) are there but both are empty. On layout tab i see a chart with stacked bars but with normal labels (A...E) and KPI1, KPI2 in legend.

i installed all but the wtp plugins.
Re: [chart] with multiple categories (on x) [message #911408 is a reply to message #911259] Tue, 11 September 2012 14:37 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

I may be missing something, but can you create a report using the sample db? I am trying to determine if you have a working designer. If you select the xml tab does it show the report xml?

Jason
Re: [chart] with multiple categories (on x) [message #911687 is a reply to message #911408] Wed, 12 September 2012 06:04 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
the xml tab shows exactly the file that you attached "adjustxaxislabelsmultiline.rptdesign".

I just tried some of the other "view report" options and most of them seem to work!
It works as long as i don't use "View report in web viewer" or preview.

No i see the second line on x-Axis "KF", "PF", "SF" - at last.

Can you please give me some additional advice how to integrate this script? Should i safe beforeDrawAxisLabel function in a text file or as string in java?

And what is the relation between afterDataSetFilled (you said i should add this to java) and beforeDrawAxisLabel?

Re: [chart] with multiple categories (on x) [message #912470 is a reply to message #911687] Thu, 13 September 2012 16:31 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

The afterDataSetFilled was just an example of one event that you could override. You need to put the script in a Java String and use the setScript to set in on the chart. For a list of all events look at this post:
http://birtworld.blogspot.com/2010/08/birt-charting-scripting-overview.html

You could also use setScript to set a fully qualified classname that extends the ChartEventHandlerAdapter class. Like:

import org.eclipse.birt.chart.model.attribute.AxisType;
import org.eclipse.birt.chart.model.component.Axis;
import org.eclipse.birt.chart.model.component.Label;
import org.eclipse.birt.chart.script.ChartEventHandlerAdapter;
import org.eclipse.birt.chart.script.IChartScriptContext;

/**
*
*/

public class AxisScript extends ChartEventHandlerAdapter
{
/*
* (non-Javadoc)
*
* @see org.eclipse.birt.chart.script.IChartItemScriptHandler#beforeDrawAxisLabel(org.eclipse.birt.chart.model.component.Axis,
* org.eclipse.birt.chart.model.component.Label,
* org.eclipse.birt.chart.script.IChartScriptContext)
*/
public void beforeDrawAxisLabel( Axis axis, Label label,
IChartScriptContext icsc )
{
if (axis.getType() == AxisType.TEXT_LITERAL)
{
label.getCaption( ).getColor( ).set( 140, 198, 62 );
}else
{
label.getCaption().getColor( ).set( 208, 32, 0);
}
}

/*
* (non-Javadoc)
*
* @see org.eclipse.birt.chart.script.IChartItemScriptHandler#beforeDrawAxisTitle(org.eclipse.birt.chart.model.component.Axis,
* org.eclipse.birt.chart.model.component.Label,
* org.eclipse.birt.chart.script.IChartScriptContext)
*/
public void beforeDrawAxisTitle( Axis axis, Label label,
IChartScriptContext icsc )
{
if (axis.getType() == AxisType.TEXT_LITERAL)
{
label.getCaption( ).getColor( ).set( 140, 198, 62 );
}else
{
label.getCaption().getColor( ).set( 208, 32, 0);
}
}
}

and in your code you could do chart.setScript("AxisScript"); Note that this name you be fully qualified. In my example I did not have AxisScript in a package.

Jason
Re: [chart] with multiple categories (on x) [message #912773 is a reply to message #912470] Fri, 14 September 2012 06:54 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx again jason,

that should me get started!
Re: [chart] with multiple categories (on x) [message #916847 is a reply to message #912470] Wed, 19 September 2012 14:46 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
jason could you probably come back here, i have some difficulties to adopt the given report to java code and hence the given script. especially the data structure given with "sourcedata" i don't understand.
It seem that you give 2 labels to each series SF|KF|PF and 19|20. How to achieve this in java?
Before i could move around the labels i should be able to give multiple labels - thats my problem.

Could you please "convert" the chart in "adjustxaxislabelsmultiline" to java(scripting isn't needed) - i didn't found any similar example in "Chart Examples"-View.

Re: [chart] with multiple categories (on x) [message #916986 is a reply to message #916847] Wed, 19 September 2012 17:57 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

In the report example I use row["FILIAL"]+" Week "+row["weekno"] as the expression in the birt design. This would result in category value of something like "SF Week 19". The script splits this up. When the chart engine is used in the BIRT designer it implements its on data set processor that does aggregations, etc before passing the data to the chart engine. So you need to either modify your data before passing it to the chart or implement your own data set process. Here is an example of that:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import org.eclipse.birt.chart.api.ChartEngine;
import org.eclipse.birt.chart.device.IDeviceRenderer;
import org.eclipse.birt.chart.device.IDisplayServer;
import org.eclipse.birt.chart.exception.ChartException;
import org.eclipse.birt.chart.factory.GeneratedChartState;
import org.eclipse.birt.chart.factory.Generator;
import org.eclipse.birt.chart.factory.IDataRowExpressionEvaluator;
import org.eclipse.birt.chart.factory.IGenerator;
import org.eclipse.birt.chart.factory.RunTimeContext;
import org.eclipse.birt.chart.model.Chart;
import org.eclipse.birt.chart.model.ChartWithAxes;
import org.eclipse.birt.chart.model.ChartWithoutAxes;
import org.eclipse.birt.chart.model.attribute.Anchor;
import org.eclipse.birt.chart.model.attribute.AxisType;
import org.eclipse.birt.chart.model.attribute.Bounds;
import org.eclipse.birt.chart.model.attribute.ChartDimension;
import org.eclipse.birt.chart.model.attribute.DataType;
import org.eclipse.birt.chart.model.attribute.SortOption;
import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl;
import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl;
import org.eclipse.birt.chart.model.attribute.impl.GradientImpl;
import org.eclipse.birt.chart.model.component.Axis;
import org.eclipse.birt.chart.model.component.Series;
import org.eclipse.birt.chart.model.component.impl.SeriesImpl;
import org.eclipse.birt.chart.model.data.BaseSampleData;
import org.eclipse.birt.chart.model.data.DataFactory;
import org.eclipse.birt.chart.model.data.OrthogonalSampleData;
import org.eclipse.birt.chart.model.data.Query;
import org.eclipse.birt.chart.model.data.SampleData;
import org.eclipse.birt.chart.model.data.SeriesDefinition;
import org.eclipse.birt.chart.model.data.impl.QueryImpl;
import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl;
import org.eclipse.birt.chart.model.impl.ChartWithAxesImpl;
import org.eclipse.birt.chart.model.impl.ChartWithoutAxesImpl;
import org.eclipse.birt.chart.model.layout.Legend;
import org.eclipse.birt.chart.model.layout.Plot;
import org.eclipse.birt.chart.model.type.LineSeries;
import org.eclipse.birt.chart.model.type.PieSeries;
import org.eclipse.birt.chart.model.type.impl.LineSeriesImpl;
import org.eclipse.birt.chart.model.type.impl.PieSeriesImpl;
import org.eclipse.birt.core.framework.PlatformConfig;


/**
* Test decription:
* </p>
* Chart script: afterDataSetFilled()
* </p>
*/

public class AfterDatasetFilled
{
private static String OUTPUT = "output/DataRowEvaluator.png";

/**
* The swing rendering device
*/
private IDeviceRenderer dRenderer = null;
private IDisplayServer dServer = null;

private GeneratedChartState gcs = null;
private IGenerator gr = null;
/**
* A chart model instance
*/
private Chart cm = null;

/**
* execute application
*
* @param args
*/
public static void main( String[] args )
{
new AfterDatasetFilled( );
System.out.println("finished");
System.exit(0);
}

/**
* Constructor
*/
public AfterDatasetFilled( )
{
PlatformConfig pf = new PlatformConfig();
pf.setProperty("STANDALONE", true);

//Returns a singleton instance of the Chart Engine
ChartEngine ce = ChartEngine.instance(pf);
//Returns a singleton instance of the Generator
gr = ce.getGenerator();

try {
//device renderers for dv.SWT, dv.PNG, dv.JPG
//dv.PDF, dv.SVG, dv.SWING, dv.PNG24, div.BMP
dRenderer = ce.getRenderer("dv.PNG");
dServer = dRenderer.getDisplayServer();
} catch (Exception ex) {
ex.printStackTrace();
}

cm = createChart( );
bindGroupingData( cm );

BufferedImage img = new BufferedImage(
600,
600,
BufferedImage.TYPE_INT_ARGB );
Graphics g = img.getGraphics( );

Graphics2D g2d = (Graphics2D) g;
dRenderer.setProperty( IDeviceRenderer.GRAPHICS_CONTEXT, g2d );
dRenderer.setProperty( IDeviceRenderer.FILE_IDENTIFIER, OUTPUT ); //$NON-NLS-1$

Bounds bo = BoundsImpl.create( 0, 0, 600, 600 );
bo.scale( 72d / dRenderer.getDisplayServer( ).getDpiResolution( ) );



try
{
gcs = gr.build(
dServer,
cm,
bo,
null,
null,
null );
gr.render( dRenderer, gcs );
}
catch ( ChartException e )
{
// TODO Auto-generated catch block
e.printStackTrace( );
}



}
public Chart GetChartModel(){
return cm;
}

private void bindGroupingData( Chart chart )

{

//IDataRowExpressionEvaluator
// close, evaluate, first, and next
// Data Set
final Object[][] data =
new Object[][]
{{"x1", new Integer( 1 ), "g1"},
{"x1", new Integer( 2 ), "g2"},
{"x1", new Integer( 3 ), "g1"},
{"x1", new Integer( 4 ), "g3"},
{"x1", new Integer( 5 ), "g2"},
{"x2", new Integer( 6 ), "g1"},
{"x2", new Integer( 7 ), "g3"},
{"x2", new Integer( 8 ), "g2"},
{"x2", new Integer( 9 ), "g2"},
{"x0", new Integer( 0 ), "g2"},};
try
{
//Binds data to chart model
gr.bindData( new IDataRowExpressionEvaluator( ) {

int idx = 0;

public void close( )
{
}

public Object evaluate( String expression )
{
if ( "X".equals( expression ) )
{
return data[idx][0];
}
else if ( "Y".equals( expression ) )
{
return data[idx][1];
}
else if ( "G".equals( expression ) )
{
return data[idx][2];
}
return null;
}

public Object evaluateGlobal( String expression )
{
return evaluate( expression );
}

public boolean first( )
{
idx = 0;
return true;
}

public boolean next( )
{
idx++;
return ( idx < 9 );
}
}, chart, new RunTimeContext( ) );

}
catch ( ChartException e )
{
e.printStackTrace( );

}
}

private Chart createChart( )

{
ChartWithAxes cwaBar = ChartWithAxesImpl.create( );


// X-Axis
Axis xAxisPrimary = cwaBar.getPrimaryBaseAxes( )[0];
xAxisPrimary.setType( AxisType.TEXT_LITERAL );

// Y-Axis
Axis yAxisPrimary = cwaBar.getPrimaryOrthogonalAxis( xAxisPrimary );
yAxisPrimary.setType( AxisType.LINEAR_LITERAL );



// X-Series
Series seCategory = SeriesImpl.create( );
Query xQ = QueryImpl.create( "G" );
seCategory.getDataDefinition( ).add( xQ );
SeriesDefinition sdX = SeriesDefinitionImpl.create( );
xAxisPrimary.getSeriesDefinitions( ).add( sdX );
sdX.getSeries( ).add( seCategory );

// -------------------------------------------------------------

sdX.setSorting( SortOption.ASCENDING_LITERAL );
sdX.getGrouping( ).setEnabled( true );
sdX.getGrouping( ).setGroupType( DataType.TEXT_LITERAL );
sdX.getGrouping( ).setAggregateExpression( "Sum" );
sdX.getGrouping( ).setGroupingInterval( 0 );


// -------------------------------------------------------------

// Y-Series
LineSeries ls = (LineSeries) LineSeriesImpl.create( );
ls.getLabel( ).setVisible( true );
Query yQ = QueryImpl.create( "Y" );
ls.getDataDefinition( ).add( yQ );
SeriesDefinition sdY = SeriesDefinitionImpl.create( );
Query query = QueryImpl.create( "X" );//$NON-NLS-1$
sdY.setQuery( query );
yAxisPrimary.getSeriesDefinitions( ).add( sdY );
sdY.getSeriesPalette( ).shift( 0 );
sdY.getSeries( ).add( ls );

return cwaBar;

}
}

Jason
Re: [chart] with multiple categories (on x) [message #916987 is a reply to message #916986] Wed, 19 September 2012 17:58 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

Notice the example implements a IDataRowExpressionEvaluator.

Jason
Re: [chart] with multiple categories (on x) [message #917478 is a reply to message #908333] Thu, 20 September 2012 05:54 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx jason

i came to work, the first thing i did was pressing f5 on this thread's tab and i am glad to see your answer.

i just tired your example it yields an line chart with 2 lines. But i don't get the link to your "adjustxaxislabelsmultiline.rptdesign" report.
I probably don't understand "In the report example I use row["FILIAL"]+" Week "+row["weekno"] as the expression in the birt design."
Or how to do this in java. In this example it seems that each bar has 2 labels given via separate array indexes. And your "beforeDrawAxisLabel" moves the second label - the filial name. I don't really understand the moving - or how it would look without this script. i guess "var cp =label.getCaption().getValue();" will only return the filial name not the week number?
(i attached the output as pdf, as i mentioned some day ago i can't preview the report nor use "Web Viewer", only the other file formats work. i also attached the source - it was converted to birt 4.2 by eclipse - don't no if this changed something else)

so at the moment my problem is the same - how to get a bar chart like "adjustxaxislabelsmultiline" with java. and if i got this i could try to apply your script. (but probably i misunderstood some other things?)


[Updated on: Thu, 20 September 2012 07:05]

Report message to a moderator

Re: [chart] with multiple categories (on x) [message #917956 is a reply to message #917478] Thu, 20 September 2012 15:42 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

The x-axis does not have two labels, it has one that that the script splits into two lines. From a Java perspective this would look like:

TextDataSet dsStringValue = TextDataSetImpl.create( new String[]{
"SF Week 19", "SF Week 20", "KF Week 19", "KF Week 20", "PF Week 19", "PF Week 20" } );

Series seCategory = SeriesImpl.create( );
seCategory.setDataSet( dsStringValue );


So this script:
last = "";
function beforeDrawAxisLabel( axis, label, icsc )
{
importPackage(
Packages.org.eclipse.birt.chart.model.attribute.impl );
importPackage(
Packages.org.eclipse.birt.chart.model.attribute );
if( axis.getType() == AxisType.TEXT_LITERAL ){
var cp =label.getCaption().getValue();
if( cp.substr(0,2) == last ){
label.getCaption().setValue(cp.substr( (cp.length()-2)));
}else{
label.getCaption().setValue(cp.substr( (cp.length()-2))+"\n\r "+cp.substr(0,2));
}
last = cp.substr(0,2);
}
}

So for the first label that comes in this line:
label.getCaption().setValue(cp.substr( (cp.length()-2))+"\n\r "+cp.substr(0,2));
puts the week number on top and the Fial number on the bottom. The second label will just put the week number on top:
label.getCaption().setValue(cp.substr( (cp.length()-2)));

The reason I posted the afterdatasetfilled example was to show you how the data for a chart could be made to be dynamic if you wanted it to.

Jason
Re: [chart] with multiple categories (on x) [message #918612 is a reply to message #917956] Fri, 21 September 2012 07:06 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx again,

i was confused by the script-code:
sourcedata[0][0] = "SF";
sourcedata[0][1] = 19;
sourcedata[0][2] = 1085;
sourcedata[0][3] = 1018;
sourcedata[0][4] = "grp1";


this made me think that you give different labels. Meanwhile i played around a bit with
ChartEventHandlerAdapter.beforeDrawAxisLabel(Axis axis, Label label, IChartScriptContext icsc)

(using the normal java chart examples)
My first try was just to print out the labels set - but all were empty! Then i forced all to same value:
    public void beforeDrawAxisLabel(Axis axis, Label label, IChartScriptContext icsc) {
        // TODO Auto-generated method stub
        Label la = LabelImpl.create();
        la.setCaption(TextImpl.create("blubber"));
        super.beforeDrawAxisLabel(axis, la, icsc);
    }

but this didn't change the chart in any way (all labels remains the "category values" and "series identifier in legend").
Is this probably the cause why you used "IDataRowExpressionEvaluator" in your example?
Re: [chart] with multiple categories (on x) [message #919079 is a reply to message #918612] Fri, 21 September 2012 17:03 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

public static final Chart createBarChart( )
{
ChartWithAxes cwaBar = ChartWithAxesImpl.create( );


// Chart Type
cwaBar.setType( "Bar Chart" );
cwaBar.setScript("AxisScriptSplit");

cwaBar.getTitle().setVisible(false);
cwaBar.getBlock( ).setBackground( ColorDefinitionImpl.WHITE( ) );

// Legend
Legend lg = cwaBar.getLegend( );
lg.setVisible( false );

// X-Axis
Axis xAxisPrimary = ( (ChartWithAxesImpl) cwaBar ).getPrimaryBaseAxes( )[0];
xAxisPrimary.getTitle( ).setVisible( false );

xAxisPrimary.setType( AxisType.TEXT_LITERAL );
xAxisPrimary.getOrigin( ).setType( IntersectionType.VALUE_LITERAL );
//xAxisPrimary.getLabel( ).getCaption( ).setColor(
// ColorDefinitionImpl.GREEN( ).darker( ) );
xAxisPrimary.getLabel( ).getCaption( ).getFont( ).setSize(6);
xAxisPrimary.setLabelSpan(30);


// Y-Axis
Axis yAxisPrimary = ( (ChartWithAxesImpl) cwaBar )
.getPrimaryOrthogonalAxis( xAxisPrimary );
yAxisPrimary.getLabel( ).getCaption( ).setValue( "Sales Growth" ); //$NON-NLS-1$
yAxisPrimary.getLabel( ).getCaption( ).setColor(
ColorDefinitionImpl.BLUE( ) );
yAxisPrimary.getLabel( ).getCaption( ).getFont( ).setSize(6);
yAxisPrimary.getTitle( ).setVisible( false );
yAxisPrimary.setType( AxisType.LINEAR_LITERAL );
yAxisPrimary.getOrigin( ).setType( IntersectionType.VALUE_LITERAL );


TextDataSet dsStringValue = TextDataSetImpl.create( new String[]{
"SF Week 19", "SF Week 20", "KF Week 19", "KF Week 20", "PF Week 19", "PF Week 20" } );

NumberDataSet dsNumericValues1 = NumberDataSetImpl
.create( new double[]{43.26, 56.55, 75.25, 47.56, 55.55, 32.1} );

// X-Series
Series seBase = SeriesImpl.create( );
seBase.setDataSet( dsStringValue );

SeriesDefinition sdX = SeriesDefinitionImpl.create( );
xAxisPrimary.getSeriesDefinitions( ).add( sdX );
sdX.getSeries( ).add( seBase );

// Y-Series
BarSeries bs = (BarSeries) BarSeriesImpl.create( );
bs.getLabel( ).getCaption( ).setColor( ColorDefinitionImpl.RED( ) );
bs.getLabel( ).setBackground( ColorDefinitionImpl.CYAN( ) );
bs.getLabel( ).setVisible( true );
bs.setDataSet( dsNumericValues1 );
bs.setStacked( false );

SeriesDefinition sdY = SeriesDefinitionImpl.create( );
yAxisPrimary.getSeriesDefinitions( ).add( sdY );
sdY.getSeriesPalette( ).update( ColorDefinitionImpl.GREEN( ) );
sdY.getSeries( ).add( bs );


return cwaBar;

}


Use the following for the AxisScriptSplit class:



import org.eclipse.birt.chart.model.attribute.AxisType;
import org.eclipse.birt.chart.model.component.Axis;
import org.eclipse.birt.chart.model.component.Label;
import org.eclipse.birt.chart.script.ChartEventHandlerAdapter;
import org.eclipse.birt.chart.script.IChartScriptContext;

/**
*
*/

public class AxisScriptSplit extends ChartEventHandlerAdapter
{
String last ="";
public void beforeDrawAxisLabel( Axis axis, Label label,
IChartScriptContext icsc )
{
if (axis.getType() == AxisType.TEXT_LITERAL)
{
String cp =label.getCaption().getValue();
if( cp.substring(0,2).compareToIgnoreCase(last) == 0){
label.getCaption().setValue(cp.substring( (cp.length()-2)));
}else{

label.getCaption().setValue(cp.substring( (cp.length()-2))+"\n\r "+cp.substring(0,2));
last = cp.substring(0,2);
}
}
}

}

If you put the AxisScriptClass in a package make sure to change the setScript method to include the package name. A pic out the output is attached.
Re: [chart] with multiple categories (on x) [message #932821 is a reply to message #919079] Thu, 04 October 2012 13:12 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
I am back from vacation so better late than never: Thank You!

I tried your code first by simple merging the code with "StandAloneChart" (from an Example-Zip Package). i simply substituted createStackedBar() method with the code you gave: the result:
index.php/fa/11727/0/

As you see the result is not the same. But on first sight the results reflects exactly the script: <weeknumber>+ "\n\r " + <Region>
So Region is in next line (not always) with one space-character before region's name. (since your first answer i asked myself how your script centers the next line)
Since i have to rewrite the script for my special use case this problem is not a real "problem"
but
A second and more eminent problem occurred if i tried to adopt your solution to other examples (more similar to my use case): i substituted "createStackedBar()" with the code given in "Side By Side Bar" example (first example in Birts' Chart Examples view in eclipse). Then i just added the setscript() and copied the data from your example:
index.php/fa/11726/0/

so for some reason the second line is cut off - how to solve this problem?


[Updated on: Thu, 04 October 2012 13:25]

Report message to a moderator

Re: [chart] with multiple categories (on x) [message #932986 is a reply to message #932821] Thu, 04 October 2012 16:28 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

Did you use these two lines?
xAxisPrimary.getLabel( ).getCaption( ).getFont( ).setSize(6);
xAxisPrimary.setLabelSpan(30);

Jason
Re: [chart] with multiple categories (on x) [message #933689 is a reply to message #932986] Fri, 05 October 2012 08:42 Go to previous messageGo to next message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
no -

THX! that solved the problem.

do you have any hints about centering the second line. are there any means to get the center position from a group of bars (in your example 2 bars but in general one group has n bars)?
Re: [chart] with multiple categories (on x) [message #934166 is a reply to message #933689] Fri, 05 October 2012 18:19 Go to previous messageGo to next message
Jason Weathersby is currently offline Jason WeathersbyFriend
Messages: 9167
Registered: July 2009
Senior Member

This is a bit tougher. In the beforeGeneration you should be able to get the number of series count (in this case bars)

//global bar count
bar_count=0;
function beforeGeneration(chart, icsc)
{
importPackage( Packages.org.eclipse.birt.chart.model.attribute );

xAxis = chart.getBaseAxes()[0];
yAxis = chart.getOrthogonalAxes( xAxis, true)[0]
seriesDef = yAxis.getSeriesDefinitions().get(0)
runSeries = seriesDef.getRunTimeSeries();
bar_count = runSeries.size();
}

You should be able to use bar count in your script as it runs later. You should be able to convert this script to Java as well.
Take a look at this post to see how wide a datapoint set will be:
http://birtworld.blogspot.com/2012/06/birt-area-chart-modifications.html
You should be able to come up with a calculation to add a number of spaces.

Jason
Re: [chart] with multiple categories (on x) [message #936594 is a reply to message #934166] Mon, 08 October 2012 06:17 Go to previous message
moritz du is currently offline moritz duFriend
Messages: 98
Registered: February 2010
Member
thx again -

i' will play around with it.

i think there won't be any further questions Smile.

[Updated on: Mon, 08 October 2012 06:17]

Report message to a moderator

Previous Topic:birt kills tomcat randomly
Next Topic:BIRT Viewer page Navigation.
Goto Forum:
  


Current Time: Mon Nov 24 08:18:49 GMT 2014

Powered by FUDForum. Page generated in 0.09848 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software