Linha tracejada no JFreeChart

17 respostas
B

Alguém poderia me ajudar me dizendo como eu faço para uma linha do meu gráfico ficar tracejada usando JFreeChart.

Obrigado

Bruno Moura

17 Respostas

D

Pega o plot do seu chart e altera a propriedade.

B

Tudo bem … mas eu não estou conseguindo encontrar qual propriedade seria esta do plot.

obrigado novamente

D

Vê se isso ajuda:

JFreeChart jfreechart = ChartFactory.create.... CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot(); LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer(); lineandshaperenderer.setShapesVisible(true); lineandshaperenderer.setDrawOutlines(true); lineandshaperenderer.setUseFillPaint(true); lineandshaperenderer.setFillPaint(Color.white);

B

Ocorreram alguns problemas.
O fato é que eu estpu extendendo o IReport para aceitar gráficos timeseries.
Até agora deu tudo certo e a última coisa que eu queria é que uma das linhas ficasse tracejada.
Tentei utilizar as dicas que me passou, mas da uma ClassCast Exception
na linha CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();

passo meu código:

JFreeChart chart = org.jfree.chart.ChartFactory.createTimeSeriesChart("Title", 
                    Misc.nvl(props.getProperty("categoryLabel"),""),
                    Misc.nvl(props.getProperty("valueLabel"),""),
                    dataset,                   
                    showLegend,                    // include legend
                    showTooltips,                     // tooltips?
                    false                     // URLs?
                    );

                       
            CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
            LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
            lineandshaperenderer.setShapesVisible(true);
            lineandshaperenderer.setDrawLines(true);
            lineandshaperenderer.setUseFillPaintForShapeOutline(true);
           lineandshaperenderer.setFillPaint(Color.white);

obrigado pela atenção

D

Você está usando Time series e não category. Use o plot correspondente.

B

O plot corresponde que eu uso para instanciar outros renderes é o XYPlot,
mas quando tento:

LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)xyPlot.getRenderer();
também ocorre ClassCastException, não com qual classe devo instanciar o render para poder mudar as propriedades da linha de um timeseries…

obrigado mesmo

D

Eu apenas coloquei o exemplo que vem no DEMO do JFreeChart, que é um gráfico de linhas tracejadas, pro categoria.

Era só pra vc ter uma idéia do que se passa.

Descubra as classes que você está manipulando e veja se tem algo do tipo.

Boa sorte.

B

acabei conseguindo.
obrigado pela ajuda.

vou posta o código, para que se alguém estiver com o mesmo problema, ter uma ajuda.

XYItemRenderer renderer = cplot.getRenderer();
            if (renderer instanceof StandardXYItemRenderer) {
                StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;
                rr.setPlotShapes(false);
                // Formata a espessura da linha
                rr.setSeriesStroke(0,new BasicStroke(2));
                rr.setSeriesStroke(1,new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                        1.0f, new float[] { 10.0f, 6.0f }, 0.0f));
            }
D

Parabéns e obrigado!

I

Engraçado, tô tentando fazer uma linha tracejada no meu gráfico, mas se eu usar esse trecho que o Daniel passou:

CategoryPlot categoryplot = (CategoryPlot)chart.getPlot();
             LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
             lineandshaperenderer.setShapesVisible(true);
             lineandshaperenderer.setDrawLines(true);
             lineandshaperenderer.setUseFillPaintForShapeOutline(true);
            lineandshaperenderer.setFillPaint(Color.white);

O meu gráfico todo fica em branco!Alguém mais já fez isso(linha tracejada pelo gráfico) com JFreeChart?

Obs.: gráfico de barras(2D mesmo) na vertical.

I

bbmoura,
com esse código que vc postou vc deixou a linha tracejada, ou apenas mudou a espessura dela?Tou usando um Marker em BarChart mas não consigo tracejar a linha de nenhuma forma! :roll:

I

Ai,Iron! O animal aqui tava usando um método que não existia…
Bom para setar num Marker uma linha tracejada é só usar setStroke.É quase igual com o exemplo do bbmoura:

seuMarker.setStroke(new java.awt.BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND,
                         1.0f, new float[] { 10.0f, 6.0f }, 0.0f));
M

ai galera gostaria de saber como fasso para mudar o o valor do eixo y do grafico em jfreechart, ou seja, colocaro o minimo de 0 ao maximo de 24. Como devo proceder?

F

Que eu me lembre, não tem como fazer isso…talvez tu possa até sugerir, mas limitar parece que não…posso estar enganado.

M

Sou iniciante em jfreechart. Encontrei esta classe para customizar, mas não entendi e não funciona na minha aplicação web, pois da erro quando chega na ActegoryPlot.

public class Barras3D implements JRChartCustomizer{

public void customize(JFreeChart chart, JRChart jasperChart){

CategoryPlot plot = (CategoryPlot)chart.getPlot();
	
	// Seta o range do eixo Y de 0 a 24 (e somente numeros inteiros)  
    NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
//		 NumberAxis rangeAxis = new NumberAxis();

rangeAxis.setRange(0, 24);

rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// Seta a quantidade de linhas para quebra da label    
	   plot.getDomainAxis().setMaximumCategoryLabelLines(24);  
	          
	//Seta a Fonte/tamanho das labels:  Tamanho 5, SansSerif  
	CategoryItemRenderer renderer = plot.getRenderer();  
	renderer.setBaseItemLabelFont(new Font("SansSerif", Font.PLAIN, 5));

}
}

M

Sou iniciante em jfreechart. Encontrei esta classe para customizar, mas não entendi e não funciona na minha aplicação web, pois da erro quando chega na ActegoryPlot.

public class Barras3D implements JRChartCustomizer{

public void customize(JFreeChart chart, JRChart jasperChart){

CategoryPlot plot = (CategoryPlot)chart.getPlot();

// Seta o range do eixo Y de 0 a 24 (e somente numeros inteiros)

NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();

// NumberAxis rangeAxis = new NumberAxis();

rangeAxis.setRange(0, 24);

rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

// Seta a quantidade de linhas para quebra da label
plot.getDomainAxis().setMaximumCategoryLabelLines(24);

//Seta a Fonte/tamanho das labels: Tamanho 5, SansSerif

CategoryItemRenderer renderer = plot.getRenderer();

renderer.setBaseItemLabelFont(new Font(SansSerif, Font.PLAIN, 5));

}

}
M

Pode ser útil ainda hoje…

CategoryPlot plot = chart.getCategoryPlot();
        CategoryItemRenderer itemRerender = plot.getRenderer();
        itemRerender.setSeriesPaint(0, Color.GREEN);//coloca cor na barra
        itemRerender.setSeriesPaint(1, Color.BLUE);
        itemRerender.setSeriesPaint(2, Color.YELLOW);
        ValueAxis eixoY = plot.getRangeAxis();
        eixoY.setRange(0, 110);// define o valor minimo e máximo do eixo y
        ValueMarker valueMarker = new ValueMarker(meta, Color.red, new BasicStroke(2.0f, BasicStroke.CAP_SQUARE, BasicStroke.CAP_SQUARE, 1.0f, new float[]{6.0f, 6.0f}, 2.0f));// criar linha tracejada de meta. Para não tracejada, edite o Basic stroke +- assim new BasicStroke(2)
        plot.addRangeMarker(valueMarker);//adiciona  ao plot a linha
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setAutoRange(false);// marcação de valores no eixo y não automatico
        rangeAxis.setTickUnit(new NumberTickUnit(10));// distancia entre marcações
        itemRerender.setItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.00")));//colocar o valor da barra sobre a barra  
        itemRerender.setItemLabelsVisible(true);
Criado 20 de junho de 2005
Ultima resposta 17 de set. de 2013
Respostas 17
Participantes 6