JFreeChart: nur jeden n-ten Wert auf der X-Achse anzeigen

Rol

Aktives Mitglied
Ich erzeuge mit JFreeChart einen Balken Chart. Dabei gibt es u.U. sehr viele Balken (Kategorien). Standardmäßig wird wird für jeden Balken ein Label unter der x-Achse gesetzt, was dann zur Foge hat, dass die Beschriftungen ineinanderlaufen und nicht mehr lesbar sind.

Wie erreiche ich, dass nur für jeden n-ten Balken eine Beschriftung gesetzt wird?
 
S

SlaterB

Gast
die Beschriftungen gibst du doch selber, modifiziere deinen Code zur Initialisierung des DataSets,
wobei gleiche Identifer, also String null oder "" oder " " glaube ich nicht so toll sind, ich hatte mir dafür einmal extra eine neue Klasse angelegt, vielleicht geht auch new String(" "); ?
wenn du dahingehend was machst und Probleme hast, dann sag Bescheid, am besten mit Beispielprogramm

oder meinst du wirklich Kategorien statt einzelner Werte? ein Beispielprogramm würde alles eindeutig erklären
 

Rol

Aktives Mitglied
die Beschriftungen gibst du doch selber, modifiziere deinen Code zur Initialisierung des DataSets,

Ich erzeuge für jeden Balken einen Datensatz im DataSet mit:

public void addValue(Number value, Comparable rowKey, Comparable columnKey)
also:
Java:
datasetDays.setValue((daysHisto[i] / 1000000f), "", String.valueOf(i));

"String.valueOf(i)" ist also mein "columnKey" und dieser wird (leider) als x-Achenbeschriftung angezeigt.
Kann ich irgendwie den columnKey und die x-Achenbeschriftung getrennt angeben?

(String.valueOf(i) ist die "Nummer" des aktuellen Arrayfeldes, später soll das mal ein Datumswert sein, aber zum testen geht das so)

oder meinst du wirklich Kategorien statt einzelner Werte?

Es ist ein Balkendiagramm das Werte einer täglich stattfindenden Aktion darstellen soll, also ein Balken pro Tag. Bei einem darzustellenden Zeitfenster von ein paar Tagen ist die Beschriftung jedes Balkens o.k., wenn aber ein ganzes Jahr dargestellt werden soll, ist die x-Achensbeschriftung nur noch ein Batzen in sich verschlungener Schrift. Dann sollte z.B. nur jeder 10. Balken beschriftet werden
 
S

SlaterB

Gast
hier
ChartJava
gibt es Beispiel-Klassen für alle Charts,
wäre schön wenn du dir eine aussuchst, mit Schleife viele Dummy-Daten einfügst und das ganze dann postest,
damit ich es auch ausführen und das Problem sehen kann

ich habe selber sowohl mit allgemeinen Kategorien als auch mit Einzelwerten viel experimentiert,
es lohnt sich also wenn mir das ganze verständlich machen würdest ;)
 

Rol

Aktives Mitglied
Ich habe "Bar Chart Demo 3" aus Deinem Link jetzt so verändert, dass das dataSet aus einem Array mit 100 Felden (das könnten in echt dann auch ein paar hundert werden) erzeugt wird.

Java:
//package org.jfree.chart.demo;

import java.awt.Color;
import java.awt.Paint;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.TextAnchor;

/**
 * A bar chart that uses a custom renderer to display different colors within a series.
 * No legend is displayed because there is only one series but the colors are not consistent.
 *
 */
public class BarChartDemo3 extends ApplicationFrame {

    /**
     * A custom renderer that returns a different color for each item in a single series.
     */
    class CustomRenderer extends BarRenderer {

        /** The colors. */
        private Paint[] colors;

        /**
         * Creates a new renderer.
         *
         * @param colors  the colors.
         */
        public CustomRenderer(final Paint[] colors) {
            this.colors = colors;
        }

        /**
         * Returns the paint for an item.  Overrides the default behaviour inherited from
         * AbstractSeriesRenderer.
         *
         * @param row  the series.
         * @param column  the category.
         *
         * @return The item color.
         */
        public Paint getItemPaint(final int row, final int column) {
            return this.colors[column % this.colors.length];
        }
    }
    /**
     * Creates a new demo.
     *
     * @param title  the frame title.
     */
    int[] myArray = new int[365];

    public BarChartDemo3(final String title) {
        super(title);
        fillArray();
        final CategoryDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        setContentPane(chartPanel);
    }

    private void fillArray() {
        for (int i = 0; i < 365; i++) {
            myArray[i] = (int) Math.round(Math.random() * 100);
        }
    }

    /**
     * Creates a sample dataset.
     *
     * @return a sample dataset.
     */
    private CategoryDataset createDataset() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        int[] myArray = new int[100];
        for (int i = 0; i < 100; i++) {
            myArray[i] = (int) Math.round(Math.random() * 100);
        }

        for (int i = 0; i < myArray.length; i++) {
            dataset.addValue((myArray[i] / 1000000f), "", String.valueOf(i));
        }
        return dataset;
    }

    /**
     * Creates a sample chart.
     *
     * @param dataset  the dataset.
     *
     * @return a sample chart.
     */
    private JFreeChart createChart(final CategoryDataset dataset) {

        final JFreeChart chart = ChartFactory.createBarChart(
                "Bar Chart Demo 3", // chart title
                "Date", // domain axis label
                "Value", // range axis label
                dataset, // data
                PlotOrientation.VERTICAL, // the plot orientation
                false, // include legend
                true,
                false);

        chart.setBackgroundPaint(Color.lightGray);

        // get a reference to the plot for further customisation...
        final CategoryPlot plot = chart.getCategoryPlot();
        plot.setNoDataMessage("NO DATA!");

        // change the margin at the top of the range axis...
        final ValueAxis rangeAxis = plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        rangeAxis.setLowerMargin(0.15);
        rangeAxis.setUpperMargin(0.15);

        return chart;

    }

    /**
     * Starting point for the demonstration application.
     *
     * @param args  ignored.
     */
    public static void main(final String[] args) {

        final BarChartDemo3 demo = new BarChartDemo3("Bar Chart Demo 3");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }
}

Man sieht wie die Beschriftung der x-Achse unleserlich ineinander läuft. Das könnte man verhindern in dem man nur jeden n-ten (vielleicht 10-100-ten) Balken beschriftet. Und genau das bekomme ich nicht hin...
 
S

SlaterB

Gast
der normale Weg wäre
Java:
for (int i = 0; i < myArray.length; i++)  {
            String id = "";
            if (i % 10 == 0) id = String.valueOf(i);
            dataset.addValue((myArray[i] / 1000000f), "", id);
        }
einfach die id überwiegend auf "" stellen,

leider gefällt JFreeChart das nicht bzw. macht duchaus auch Sinn, jeder Value ist durch seinen Identifer bestimmt,
mehrmals "" ist immer derselbe Eintrag,

ich habe mir dafür eine Extra-Klasse geschrieben, die trotz gleichen Inhalt bei compare nicht 0 zurückgibt,
intern wird noch eine eindeutige nummer vergeben und nach dieser nachrangig sortiert,
damit die compareTo-Rückgabe nicht völlig willkürlich ist, vielleicht unnötig

Java:
class IdentiferWrapper
    implements Comparable<IdentiferWrapper>
{
    private static int count;
    private int number;
    private Comparable identifer;

    public IdentiferWrapper(Comparable identifer)
    {
        this.identifer = identifer;
        this.number = count++;
    }

    public String toString()
    {
        return this.identifer.toString();
    }

    public int compareTo(IdentiferWrapper o)
    {
        if (this == o)
        {
            return 0;
        }
        int c = this.identifer.compareTo(o.identifer);
        if (c == 0)
        {
            return this.number - o.number;
        }
        return c;
    }
}
dann new IdentiferWrapper(id) statt id einfügen

------

Problem könnte noch sein, dass selbst die wenigen Labels nur als .. dargestellt werden,
das hier müsste dagegen helfen:

Java:
        CategoryAxis domainAxis = plot.getDomainAxis();
        double factor = 0;
        CategoryLabelPositions pos = CategoryLabelPositions.createUpRotationLabelPositions(factor);
        domainAxis.setCategoryLabelPositions(pos);
mit einem anderen factor als 0 werden die Labels schräg dargestellt, auch recht praktisch, im kleinen Bereich bis PI/2 sinnvoll
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
H JFreeChart BarDiagramm Balken der gleichen Serie unterschiedliche Farbe zuordnen AWT, Swing, JavaFX & SWT 2
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H JFreeChart Charts überlagern AWT, Swing, JavaFX & SWT 2
C JFreeChart x-Achse mit absteigenden Werten AWT, Swing, JavaFX & SWT 1
K JFreeChart nicht ohne BarChartDemo startklar? AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
B JFreeChart Gantt Höhe Tasks AWT, Swing, JavaFX & SWT 1
V JFreeChart: Tooltip auf Knopfdruck anzeigen AWT, Swing, JavaFX & SWT 2
V JFreechart: In Linechart Linien einzeichnen und Bereiche färben AWT, Swing, JavaFX & SWT 4
M In JFreeChart Geraden erzeugen AWT, Swing, JavaFX & SWT 11
M JFreechart Zoom out AWT, Swing, JavaFX & SWT 2
M Swing JFreechart X-Achse Tick auslesen AWT, Swing, JavaFX & SWT 13
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
D JFreeChart range der Y Achse verändern. AWT, Swing, JavaFX & SWT 1
G JFreeChart - SetSeriesColor Problem AWT, Swing, JavaFX & SWT 3
K 2D-Grafik JFreeChart plot.setBackgroundImage() AWT, Swing, JavaFX & SWT 1
K 2D-Grafik JFreeChart DateAxis AWT, Swing, JavaFX & SWT 9
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
M JFreeChart in ein File schreiben (bzw. JFrame in ein File Schreiben) AWT, Swing, JavaFX & SWT 2
A JFreeChart in GUI AWT, Swing, JavaFX & SWT 3
E JFreeChart: Timeseries-Chart und Area-Chart "überlappen" lassen AWT, Swing, JavaFX & SWT 6
B JFreeChart-Erweiterungen AWT, Swing, JavaFX & SWT 4
E JFreeChart in einer dynamischen Aufzeichnung neue Serien hinzufügen? AWT, Swing, JavaFX & SWT 7
I XML - JFreeChart AWT, Swing, JavaFX & SWT 15
N Dynamische JFreechart updated UI nicht AWT, Swing, JavaFX & SWT 5
S JFreeChart - Schriftgröße der Legende AWT, Swing, JavaFX & SWT 2
O Swing JFreechart subtitle formatieren AWT, Swing, JavaFX & SWT 3
N JFreeChart: Plot soll mit skalieren AWT, Swing, JavaFX & SWT 5
R JFreeChart Plots AWT, Swing, JavaFX & SWT 6
J JFreechart spezielles Balkendiagramm AWT, Swing, JavaFX & SWT 2
R JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern AWT, Swing, JavaFX & SWT 8
T JFreeChart Linine einzeichnen AWT, Swing, JavaFX & SWT 2
M JFreeChart Ausrichtung der Balken AWT, Swing, JavaFX & SWT 2
R jFreeChart in eine NetBeans Projekt integrieren AWT, Swing, JavaFX & SWT 24
D JFreeChart Breite (width) ändern AWT, Swing, JavaFX & SWT 6
A Swing JFreeChart, Gantt, Schichtplan AWT, Swing, JavaFX & SWT 3
R JFreeChart Skalierung zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
F Wie lade ich eine CategoryDataset aus XML ins JFreeChart? AWT, Swing, JavaFX & SWT 9
J JFreeChart - mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
A JFreeChart: 2 X-Achsen für ein Dataset AWT, Swing, JavaFX & SWT 2
T JFreeChart export Problem AWT, Swing, JavaFX & SWT 4
S JFreeChart Achse immer sichtbar AWT, Swing, JavaFX & SWT 2
D JFreechart maximalangezeigter Wertebereich AWT, Swing, JavaFX & SWT 3
B AWT [JFreeChart] malt nicht so wie ich will :-( AWT, Swing, JavaFX & SWT 2
B JFreeChart Balkendiagramm ActionEvent AWT, Swing, JavaFX & SWT 2
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
A Schachbrettartiges Diagramm mit JFreeChart AWT, Swing, JavaFX & SWT 4
E JFreeChart AWT, Swing, JavaFX & SWT 2
L Gantt Chart - JFreeChart AWT, Swing, JavaFX & SWT 5
K JFreeChart im JScrollPane ausblenden AWT, Swing, JavaFX & SWT 2
L JFreeChart Labelrotation AWT, Swing, JavaFX & SWT 2
L JFreeChart Farbe von Balken AWT, Swing, JavaFX & SWT 5
L JFreeChart Balkenanordnung AWT, Swing, JavaFX & SWT 10
L JFreeChart Achsenskalierung AWT, Swing, JavaFX & SWT 4
L JFreeChart - Dataset befüllen AWT, Swing, JavaFX & SWT 2
L JFreeChart - Line Shapes AWT, Swing, JavaFX & SWT 15
N JFreeChart - Basics AWT, Swing, JavaFX & SWT 2
L NullPointerException JFreeChart AWT, Swing, JavaFX & SWT 10
L JFreeChart - Legende vertikal AWT, Swing, JavaFX & SWT 5
L JFreeChart - Linienstärke einstellen AWT, Swing, JavaFX & SWT 2
L JFreeChart Einstellungen AWT, Swing, JavaFX & SWT 22
L JFreeChart - Gitterfarbe schwarz AWT, Swing, JavaFX & SWT 4
L JFreeChart StackedBar + Line-Chart kombinieren AWT, Swing, JavaFX & SWT 4
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
L JFreeChart - Legende beliebig positionieren AWT, Swing, JavaFX & SWT 16
G JFreechart Balken einfärben AWT, Swing, JavaFX & SWT 6
F Probleme mit NumberAxis bei JFreeChart AWT, Swing, JavaFX & SWT 5
G jfreechart (Diagramm speichern mit ein vorgegebenen Namen) AWT, Swing, JavaFX & SWT 6
S JFreeChart neu zeichnen sich das Datenset geändert hat. AWT, Swing, JavaFX & SWT 4
K JFreeChart Eigentschaften des Charts ändern AWT, Swing, JavaFX & SWT 8
G JFreeChart und das updaten AWT, Swing, JavaFX & SWT 7
G Ausser Jfreechart, Chart Programme? AWT, Swing, JavaFX & SWT 11
S Dimensionen JFreeChart AWT, Swing, JavaFX & SWT 5
S JFreeChart Stufendiagramm AWT, Swing, JavaFX & SWT 2
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K JFreeChart: Platz zwischen Balken AWT, Swing, JavaFX & SWT 3
M JFreeChart Handbuch? AWT, Swing, JavaFX & SWT 8
P JFreeChart - TimeSeriesDiagram AWT, Swing, JavaFX & SWT 2
C Swing MouseEntered(?) für jeden Node im JTree AWT, Swing, JavaFX & SWT 4
J JPanel.addKeyListener() - JEDEN Tastendruck im Panel abfangen AWT, Swing, JavaFX & SWT 2
_user_q ThreadPool schedule Wert auf false setzen AWT, Swing, JavaFX & SWT 1
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
L Swing Wert vom Textfield in Array List hinzufügen AWT, Swing, JavaFX & SWT 2
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
S hashCode int wert AWT, Swing, JavaFX & SWT 6
B Slider-Wert an anderen Slider übergeben AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
S Caps-Lock Überprüfung gibt falschen Wert zurück AWT, Swing, JavaFX & SWT 1
Z Swing Wert aus Textfeld auslesen -- null Fehler AWT, Swing, JavaFX & SWT 4
Hatsi09 JCombobox default wert AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben