# JFreeChart Einstellungen



## LukeVlbg (12. Aug 2009)

Hab da ein paar kleine Probleme die ich nicht gelöst bekomme.

Habe ein Diagramm wo ich Bar Charts und Line Charts vermische. Bei den Line Charts handelt es sich um DefaultCategoryDataset und CategoryItemRenderer.

1. Wie kann ich einstellen, dass die Linie keine Rechtecke oder Kreise beinhaltet, sondern eine gerade Linie ist. (Bei einem XYLineAndShapeRenderer geht dies ja mit renderer.setSeriesShapesVisible(0, false); )

2. Wie kann ich die Dicke der Balken einstellen? renderer.setMaximumBarWidth(..) scheint in Kombination mit Linien nicht zu funktionieren.

3. Im Moment sind die Legendeneinträge nebeneinander positioniert. Gibt es eine Möglichkeit diese untereinander zu positionieren?

Danke für Eure Hilfe.
Luke


----------



## LukeVlbg (12. Aug 2009)

Vielleicht noch ein Screenshot des aktuellen Charts:


----------



## SlaterB (12. Aug 2009)

2.
setStroke()
oder irgendeine Methode mit Stroke im Namen

1.
evtl. was mit setShape, oder mehrerere Renderer, je nachdem ob da ein komisches Standard gesetzt ist,
ich habe das bei mir noch nicht gesehen und aufwändig nachgebaut 
(zwei Renderer, einer für die Linie, einer für das Shape pro Datenpunkt,
also zwei LineAndShapeRenderer in einem CategoryPlot, dein Screenshot kommt mir jetzt auch bekannt vor, ist wohl ein anderer ChartTyp?)

Beispiel posten

3.
wenn die Legende nicht unten sondern links oder rechts ist, dann dürfte sie untereinaner sein, 
sonst keine Ahnung


----------



## LukeVlbg (12. Aug 2009)

Code-Beispiel:


```
import java.awt.Dimension;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberAxis3D;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;



public class LineBarOverlaid extends ApplicationFrame {
	
	/**
	 * Serial version UID
	 */
	private static final long serialVersionUID = 1L;

	public LineBarOverlaid(final String title) {
		super(title);

		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(90, "Rückmeldungen", "Di, 2009-07-21");
		dataset.addValue(75, "Rückmeldungen", "Mi, 2009-07-22");
		dataset.addValue(74, "Rückmeldungen", "Do, 2009-07-23");
		dataset.addValue(0, "Rückmeldungen", "Fr, 2009-07-24");
		dataset.addValue(0, "Rückmeldungen", "Sa, 2009-07-25");
		dataset.addValue(0, "Rückmeldungen", "So, 2009-07-26");
		dataset.addValue(3, "Rückmeldungen", "Mo, 2009-07-27");
		dataset.addValue(5, "Rückmeldungen", "Di, 2009-07-28");
		dataset.addValue(0, "Rückmeldungen", "Mi, 2009-07-29");
		dataset.addValue(0, "Rückmeldungen", "Do, 2009-07-30");
		dataset.addValue(0, "Rückmeldungen", "Fr, 2009-07-31");
		dataset.addValue(0, "Rückmeldungen", "Sa, 2009-08-01");
		dataset.addValue(0, "Rückmeldungen", "So, 2009-08-02");
		dataset.addValue(0, "Rückmeldungen", "Mo, 2009-08-03");
		dataset.addValue(0, "Rückmeldungen", "Di, 2009-08-04");
		dataset.addValue(0, "Rückmeldungen", "Mi, 2009-08-05");
		dataset.addValue(0, "Rückmeldungen", "Do, 2009-08-06");
		dataset.addValue(0, "Rückmeldungen", "Fr, 2009-08-07");
		dataset.addValue(0, "Rückmeldungen", "Sa, 2009-08-08");
		dataset.addValue(0, "Rückmeldungen", "So, 2009-08-09");
		dataset.addValue(38, "Rückmeldungen", "Mo, 2009-08-10");
		
		final BarRenderer renderer = new BarRenderer();
		renderer.setItemLabelsVisible(true);
		
		final CategoryPlot plot = new CategoryPlot();
		plot.setDataset(dataset);
		plot.setRenderer(renderer);
		
		renderer.setBarPainter(new StandardBarPainter());
		renderer.setShadowVisible(true);
		renderer.setMaximumBarWidth(0.9);
		
		plot.setDomainAxis(new CategoryAxis("Datum"));
		plot.setRangeAxis(new NumberAxis("Stunden"));
		
		plot.setOrientation(PlotOrientation.VERTICAL);
		plot.setRangeGridlinesVisible(false);
		plot.setDomainGridlinesVisible(false);
		
		DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();
		dataset2.addValue(28, "Durchschnitt", "Di, 2009-07-21");
		dataset2.addValue(28, "Durchschnitt", "Mi, 2009-07-22");
		dataset2.addValue(28, "Durchschnitt", "Do, 2009-07-23");
		dataset2.addValue(28, "Durchschnitt", "Fr, 2009-07-24");
		dataset2.addValue(28, "Durchschnitt", "Sa, 2009-07-25");
		dataset2.addValue(28, "Durchschnitt", "So, 2009-07-26");
		dataset2.addValue(28, "Durchschnitt", "Mo, 2009-07-27");
		dataset2.addValue(28, "Durchschnitt", "Di, 2009-07-28");
		dataset2.addValue(28, "Durchschnitt", "Mi, 2009-07-29");
		dataset2.addValue(28, "Durchschnitt", "Do, 2009-07-30");
		dataset2.addValue(28, "Durchschnitt", "Fr, 2009-07-31");
		dataset2.addValue(28, "Durchschnitt", "Sa, 2009-08-01");
		dataset2.addValue(28, "Durchschnitt", "So, 2009-08-02");
		dataset2.addValue(28, "Durchschnitt", "Mo, 2009-08-03");
		dataset2.addValue(28, "Durchschnitt", "Di, 2009-08-04");
		dataset2.addValue(28, "Durchschnitt", "Mi, 2009-08-05");
		dataset2.addValue(28, "Durchschnitt", "Do, 2009-08-06");
		dataset2.addValue(28, "Durchschnitt", "Fr, 2009-08-07");
		dataset2.addValue(28, "Durchschnitt", "Sa, 2009-08-08");
		dataset2.addValue(28, "Durchschnitt", "So, 2009-08-09");
		dataset2.addValue(28, "Durchschnitt", "Mo, 2009-08-10");

		DefaultCategoryDataset dataset3 = new DefaultCategoryDataset();
		dataset3.addValue(60, "Plankapazität", "Di, 2009-07-21");
		dataset3.addValue(60, "Plankapazität", "Mi, 2009-07-22");
		dataset3.addValue(60, "Plankapazität", "Do, 2009-07-23");
		dataset3.addValue(60, "Plankapazität", "Fr, 2009-07-24");
		dataset3.addValue(0, "Plankapazität", "Sa, 2009-07-25");
		dataset3.addValue(0, "Plankapazität", "So, 2009-07-26");
		dataset3.addValue(60, "Plankapazität", "Mo, 2009-07-27");
		dataset3.addValue(60, "Plankapazität", "Di, 2009-07-28");
		dataset3.addValue(60, "Plankapazität", "Mi, 2009-07-29");
		dataset3.addValue(60, "Plankapazität", "Do, 2009-07-30");
		dataset3.addValue(60, "Plankapazität", "Fr, 2009-07-31");
		dataset3.addValue(0, "Plankapazität", "Sa, 2009-08-01");
		dataset3.addValue(0, "Plankapazität", "So, 2009-08-02");
		dataset3.addValue(60, "Plankapazität", "Mo, 2009-08-03");
		dataset3.addValue(60, "Plankapazität", "Di, 2009-08-04");
		dataset3.addValue(60, "Plankapazität", "Mi, 2009-08-05");
		dataset3.addValue(60, "Plankapazität", "Do, 2009-08-06");
		dataset3.addValue(60, "Plankapazität", "Fr, 2009-08-07");
		dataset3.addValue(0, "Plankapazität", "Sa, 2009-08-08");
		dataset3.addValue(0, "Plankapazität", "So, 2009-08-09");
		dataset3.addValue(60, "Plankapazität", "Mo, 2009-08-10");

		
		final CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
		plot.setDataset(1, dataset2);
		plot.setRenderer(1, renderer2);

        plot.setDataset(2, dataset3);
        final CategoryItemRenderer renderer3 = new LineAndShapeRenderer();
        plot.setRenderer(2, renderer3);
        
        plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
        
        plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_90);
        plot.getRangeAxis().setRange(0, 100); // legt Größe der Y-Achse fest (min, max)
        
        final JFreeChart chart = new JFreeChart(plot);
        chart.setTitle("Rückmeldungen für Arbeitsplatz 330301 FLACHSCHL.MITTEL");
        
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(1000, 450));
        setContentPane(chartPanel);
        chartPanel.setRangeZoomable(false);
        
	}
	
	public static void main(String args[]) {
		
		final LineBarOverlaid overlaid = new LineBarOverlaid("Line- and Barchart overlaid");
		overlaid.pack();
		RefineryUtilities.centerFrameOnScreen(overlaid);
		overlaid.setVisible(true);
	}
	
}
```


----------



## SlaterB (12. Aug 2009)

final LineAndShapeRenderer renderer2 = new LineAndShapeRenderer();
        renderer2.setShapesVisible(false);


----------



## LukeVlbg (12. Aug 2009)

Ok renderer2.setShapesVisible(false); funktioniert wunderbar.

Bei renderer.setStroke(arg0) hab ich noch ein Problem. Was übergib ich dieser Methode? Also ein "Stroke" aber ich weiss nicht was ein Stroke ist.


----------



## Gast2 (12. Aug 2009)

Uses of Interface java.awt.Stroke (Java 2 Platform SE 5.0)


----------



## LukeVlbg (12. Aug 2009)

Danke.
Weiss aber leider nicht wie ich dadurch den Balken schmaler machen kann.


----------



## LukeVlbg (12. Aug 2009)

Das mit der Legende untereinander scheint nur links oder rechts vom Chart zu funktionieren nicht aber darunter. 

Aber das mit dem dünneren Balken hab ich noch nicht hingebracht. Kann mir da jemand weiterhelfen?


----------



## SlaterB (12. Aug 2009)

Stroke erwäht BasisStroke,
wenn du diese Verbindung nicht selber siehst und dann dort die allgemeine Beschreibung, Konstruktoren und set-Methoden durchliest,
dann war's das wohl mit Programmieren

na nun habe ich es ja nochmal verraten..


----------



## LukeVlbg (12. Aug 2009)

Ja ok hast recht.
Ich habs jetzt mal mit setStroke ausprobiert.


```
final BarRenderer renderer = new BarRenderer();
		renderer.setStroke(new BasicStroke(1.5F));
```

Es ändert sich nichts. Auf bei setBaseStroke nicht.


----------



## SlaterB (12. Aug 2009)

tja, bei einem BarRenderer geht es um den Rand des Balkens,
setOutlineStroke


----------



## LukeVlbg (12. Aug 2009)

Ok, hab jetzt den BarRenderer mit einem CategoryItemRenderer ausgetauscht, aber funktioniert nicht.
LineAndShapeRenderer und XYLineAndShapeRenderer sind ja nicht für Bar- sondern LineCharts. Welchen Renderer benötige ich dann?


----------



## SlaterB (12. Aug 2009)

was willst du denn malen, eine Linie?

Auszug aus deinem Code:
> final CategoryItemRenderer renderer2 = new LineAndShapeRenderer();
>        plot.setDataset(1, dataset2);
>        plot.setRenderer(1, renderer2)

LineAndShapeRenderer, was spricht dagegen?
die Linie kannst du in Farbe, Dicke und sonstigen Stil ändern
das Shape ersetzen oder auf setShapesVisible(false) setzen


----------



## LukeVlbg (12. Aug 2009)

Ich möchte die Dicke des Balkens ändern, weiss aber nicht welchen Renderer verwenden.

Das mit den Linien hab ich jetzt schon so hinbekommen.


----------



## SlaterB (12. Aug 2009)

ach du Schande
> 2. Wie kann ich die Dicke der Balken einstellen? renderer.setMaximumBarWidth(..) scheint in Kombination mit Linien nicht zu funktionieren.

habe ich als 'Wie kann ich die Dicke der Linien einstellen?' gelesen, 

also das funktioniert weiterhin mit setMaximumBarWidth(), wobei man über die Sinnhaftigkeit der übergebenen Werte streiten kann,
setMaximumBarWidth(0.9); macht in jedem Fall keinen Sinn, mehr als 90% allen Platzes braucht eine Bar selten

ab 
setMaximumBarWidth(0.03); 
werden die Bars bei mir in deinem Beispiel dünner, 3%, 

hängt auch von der Anzahl der Bars ab, wenn es 20 Stück sind, kann eine eh nie mehr als 5% belegen,
wie auch immer das genau berechnet wird


----------



## LukeVlbg (12. Aug 2009)

Hab ich bei mir eingebaut, es ändert sich aber nichts. Hängt es davon ab an welcher Stelle es steht?


```
final BarRenderer renderer = new BarRenderer();
		renderer.setMaximumBarWidth(0.03);
```


----------



## SlaterB (12. Aug 2009)

von Vorteil ist es, wenn es einer der Renderer ist, die auch in der Chart verwendet werden, so wie im obigen Code

> final BarRenderer renderer = new BarRenderer();
>        renderer.setItemLabelsVisible(true);

>        final CategoryPlot plot = new CategoryPlot();
>        plot.setDataset(dataset);
>        plot.setRenderer(renderer); <-------------

natürlich muss dann auch der Plot der sein, der später angezeigt wird,
ob von diesen Grundlagen etwas nicht stimmt, läßt sich nur an kompletten Testprogrammen sagen


----------



## LukeVlbg (12. Aug 2009)

Verstehe schon was du meinst, aber ich verwende ihn doch auch durch die Zeile plot.setRenderer(renderer); Und davor setze ich die MaximumBarWidth - erfolglos. Hab gedacht das liegt daran, dass Bars  und Lines vermischt sind.


----------



## SlaterB (12. Aug 2009)

0.03 war bei mir auch geradeso die Grenze, wenn bei dir die Grafik-Rahmenbedinungen minimal anders sind, hat es vielleicht keine Auswirkungen

 renderer.setMaximumBarWidth(0.01);
oder
 renderer.setMaximumBarWidth(0.001);
hast du auch schon probiert?
immer aktiv sein, testen testen testen,
auch mal die Farbe ändern um doch falsche Verknüpfungen auszuschließen


----------



## LukeVlbg (12. Aug 2009)

Ok, Schande über mich. Mit 0.01 gehts . Hab bei nem anderen Beispiel auch viel mit Zahlen gespielt und dort hat es nichts geändert.

Wenn du schon die Farben ansprichst: Gibt es da ne Liste mit RGB-Werten die man dem Color-Konstruktor übergeben kann?


----------



## SlaterB (12. Aug 2009)

wenn ich eine bestimmte suche, nehme ich einen JColorChooser


----------



## LukeVlbg (12. Aug 2009)

Danke für den Tipp. Hab sonst noch diese Auflistung gefunden: http://www.beckyjdesigns.com/DMC_convert.pdf

DANKE auch für die ganzen anderen Tipps!


----------

