扩展jfreechart实现对于每一个bar颜色的控制

  在jfreechart中,对于显示bar的控制,是通过对于series设置实现的,从而,在同一个series中,所有的bar的颜色都是一致的。这在一些需要更细控制的环境中,会存在一些问题。

   为了实现在jfreechart中对于每一个bar的颜色显示控制,这里我选择XYBarchart作为例子,进行了相应的扩展。在jfreechart中,对于图形的控制,可以分为数据和绘制两个部分。在数据方面层次为:dataset->series->item;在绘制方面为:renderer->painter。基于这样的架构,这里扩展了XYInternalSeries、XYInternalDataItem、XYBarRenderer、XYBarPainter四个类,分别如下:

XYInternalSeries扩展类ExtendedXYInternalSeries,在其中定义了一个add方法,增加了一个Color的传入参数:

import java.awt.Color;

import org.jfree.data.xy.XYIntervalSeries;

public class ExtendedXYIntervalSeries extends XYIntervalSeries {

	public ExtendedXYIntervalSeries(Comparable key) {
		super(key);
		// TODO Auto-generated constructor stub
	}


	public void add(double x, double xLow, double xHigh, double y, double yLow,
			double yHigh,Color color) {
		// TODO Auto-generated method stub
		super.add(new ExtendedXYInternalDataItem(x,xLow,xHigh,y,yLow,yHigh,color), true);
	}


	/* (non-Javadoc)
	 * @see org.jfree.data.xy.XYIntervalSeries#add(double, double, double, double, double, double)
	 */
	@Override
	public void add(double x, double xLow, double xHigh, double y, double yLow,
			double yHigh) {
		// TODO Auto-generated method stub
		super.add(new ExtendedXYInternalDataItem(x,xLow,xHigh,y,yLow,yHigh), true);
	}
	
	

 XYInternalDataItem的扩展类ExtendedXyInternalDataItem,其中,增加了一个属性color,在jfreechart中,Item代表的是一个显示的单元,在BarChart中就是一个Bar,原来是没有color属性的,这里增加了这个属性,在后面的绘制时将被用到:

import java.awt.Color;

import org.jfree.data.xy.XYIntervalDataItem;

public class ExtendedXYInternalDataItem extends XYIntervalDataItem {

	private Color color = null;
	
	public ExtendedXYInternalDataItem(double x, double xLow, double xHigh, double y,
			double yLow, double yHigh,Color color) {
		super(x, xLow, xHigh, y, yLow, yHigh);
		// TODO Auto-generated constructor stub
		this.color = color;
	}

	/**
	 * @param x
	 * @param xLow
	 * @param xHigh
	 * @param y
	 * @param yLow
	 * @param yHigh
	 */
	public ExtendedXYInternalDataItem(double x, double xLow, double xHigh, double y,
			double yLow, double yHigh) {
		super(x, xLow, xHigh, y, yLow, yHigh);
		// TODO Auto-generated constructor stub
	}

	/**
	 * @return the color
	 */
	public Color getColor() {
		return color;
	}

	/**
	 * @param color the color to set
	 */
	public void setColor(Color color) {
		this.color = color;
	}

}

 

上面的扩展在数据方面,做好了准备,已经可以在每一个显示单元中设置一个颜色属性了,下面在绘制过程中,利用这个属性来控制bar的颜色。

  在ExtendedBarRenderer中,重载drawItem函数,当bar有颜色定义时,调用扩展的BarPainter:

import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.labels.XYItemLabelGenerator;
import org.jfree.chart.plot.CrosshairState;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.PlotRenderingInfo;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRendererState;
import org.jfree.data.extend.xy.ExtendedXYInternalDataItem;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYIntervalSeriesCollection;
import org.jfree.ui.RectangleEdge;


public class ExtendedXYBarRenderer extends XYBarRenderer {

	/**
	 * 
	 */
	private static final long serialVersionUID = -2257416613878068969L;

	/* (non-Javadoc)
	 * @see org.jfree.chart.renderer.xy.XYBarRenderer#drawItem(java.awt.Graphics2D, org.jfree.chart.renderer.xy.XYItemRendererState, java.awt.geom.Rectangle2D, org.jfree.chart.plot.PlotRenderingInfo, org.jfree.chart.plot.XYPlot, org.jfree.chart.axis.ValueAxis, org.jfree.chart.axis.ValueAxis, org.jfree.data.xy.XYDataset, int, int, org.jfree.chart.plot.CrosshairState, int)
	 */
	@Override
	
	public void drawItem(Graphics2D g2, XYItemRendererState state,
			Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot,
			ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset,
			int series, int item, CrosshairState crosshairState, int pass) {
		// TODO Auto-generated method stub
        if (!getItemVisible(series, item)) {
            return;
        }
        XYIntervalSeriesCollection intervalDataset = (XYIntervalSeriesCollection) dataset;
        
        ExtendedXYInternalDataItem myXYItem = (ExtendedXYInternalDataItem) intervalDataset.getSeries(series).getDataItem(item);

        double value0;
        double value1;
        if (this.useYInterval) {
            value0 = intervalDataset.getStartYValue(series, item);
            value1 = intervalDataset.getEndYValue(series, item);
        }
        else {
            value0 = this.base;
            value1 = intervalDataset.getYValue(series, item);
        }
        if (Double.isNaN(value0) || Double.isNaN(value1)) {
            return;
        }
        if (value0 <= value1) {
            if (!rangeAxis.getRange().intersects(value0, value1)) {
                return;
            }
        }
        else {
            if (!rangeAxis.getRange().intersects(value1, value0)) {
                return;
            }
        }

        double translatedValue0 = rangeAxis.valueToJava2D(value0, dataArea,
                plot.getRangeAxisEdge());
        double translatedValue1 = rangeAxis.valueToJava2D(value1, dataArea,
                plot.getRangeAxisEdge());
        double bottom = Math.min(translatedValue0, translatedValue1);
        double top = Math.max(translatedValue0, translatedValue1);

        double startX = intervalDataset.getStartXValue(series, item);
        if (Double.isNaN(startX)) {
            return;
        }
        double endX = intervalDataset.getEndXValue(series, item);
        if (Double.isNaN(endX)) {
            return;
        }
        if (startX <= endX) {
            if (!domainAxis.getRange().intersects(startX, endX)) {
                return;
            }
        }
        else {
            if (!domainAxis.getRange().intersects(endX, startX)) {
                return;
            }
        }

        // is there an alignment adjustment to be made?
        if (this.barAlignmentFactor >= 0.0 && this.barAlignmentFactor <= 1.0) {
            double x = intervalDataset.getXValue(series, item);
            double interval = endX - startX;
            startX = x - interval * this.barAlignmentFactor;
            endX = startX + interval;
        }

        RectangleEdge location = plot.getDomainAxisEdge();
        double translatedStartX = domainAxis.valueToJava2D(startX, dataArea,
                location);
        double translatedEndX = domainAxis.valueToJava2D(endX, dataArea,
                location);

        double translatedWidth = Math.max(1, Math.abs(translatedEndX
                - translatedStartX));

        double left = Math.min(translatedStartX, translatedEndX);
        if (getMargin() > 0.0) {
            double cut = translatedWidth * getMargin();
            translatedWidth = translatedWidth - cut;
            left = left + cut / 2;
        }

        Rectangle2D bar = null;
        PlotOrientation orientation = plot.getOrientation();
        if (orientation == PlotOrientation.HORIZONTAL) {
            // clip left and right bounds to data area
            bottom = Math.max(bottom, dataArea.getMinX());
            top = Math.min(top, dataArea.getMaxX());
            bar = new Rectangle2D.Double(
                bottom, left, top - bottom, translatedWidth);
        }
        else if (orientation == PlotOrientation.VERTICAL) {
            // clip top and bottom bounds to data area
            bottom = Math.max(bottom, dataArea.getMinY());
            top = Math.min(top, dataArea.getMaxY());
            bar = new Rectangle2D.Double(left, bottom, translatedWidth,
                    top - bottom);
        }

        boolean positive = (value1 > 0.0);
        boolean inverted = rangeAxis.isInverted();
        RectangleEdge barBase;
        if (orientation == PlotOrientation.HORIZONTAL) {
            if (positive && inverted || !positive && !inverted) {
                barBase = RectangleEdge.RIGHT;
            }
            else {
                barBase = RectangleEdge.LEFT;
            }
        }
        else {
            if (positive && !inverted || !positive && inverted) {
                barBase = RectangleEdge.BOTTOM;
            }
            else {
                barBase = RectangleEdge.TOP;
            }
        }
        if (getShadowsVisible()) {
            this.barPainter.paintBarShadow(g2, this, series, item, bar, barBase,
                !this.useYInterval);
        }
        if(myXYItem.getColor() == null)
        {
            this.barPainter.paintBar(g2, this, series, item, bar, barBase);
       	
        }
        else
        {
        	((ExtendedXYBarPainter)this.barPainter).paintBar(g2, this, series, item, bar, barBase,myXYItem.getColor());
        }
        if (isItemLabelVisible(series, item)) {
            XYItemLabelGenerator generator = getItemLabelGenerator(series,
                    item);
            drawItemLabel(g2, dataset, series, item, plot, generator, bar,
                    value1 < 0.0);
        }

        // update the crosshair point
        double x1 = (startX + endX) / 2.0;
        double y1 = dataset.getYValue(series, item);
        double transX1 = domainAxis.valueToJava2D(x1, dataArea, location);
        double transY1 = rangeAxis.valueToJava2D(y1, dataArea,
                plot.getRangeAxisEdge());
        int domainAxisIndex = plot.getDomainAxisIndex(domainAxis);
        int rangeAxisIndex = plot.getRangeAxisIndex(rangeAxis);
        updateCrosshairValues(crosshairState, x1, y1, domainAxisIndex,
                rangeAxisIndex, transX1, transY1, plot.getOrientation());

        EntityCollection entities = state.getEntityCollection();
        if (entities != null) {
            addEntity(entities, bar, dataset, series, item, 0.0, 0.0);
        }
	}

	
}

 

在ExtendBarPainter中,实现对于每一个Bar的颜色设置:

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;
import java.awt.geom.Rectangle2D;
import java.awt.geom.RectangularShape;

import org.jfree.chart.renderer.xy.GradientXYBarPainter;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.ui.RectangleEdge;

public class ExtendedXYBarPainter extends GradientXYBarPainter {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7874550052210278757L;
	XYBarRenderer myrenderer;
	private double g1;
	private double g2;
	private double g3;

	public void paintBar(Graphics2D g2, XYBarRenderer renderer, int row,
			int column, RectangularShape bar, RectangleEdge base, Color color) {
		// TODO Auto-generated method stub
        Paint itemPaint = renderer.getItemPaint(row, column);

        Color c0, c1;
        if (itemPaint instanceof Color) {
            c0 = color;
            c1 = c0.brighter();
        }
        else if (itemPaint instanceof GradientPaint) {
            GradientPaint gp = (GradientPaint) itemPaint;
            c0 = gp.getColor1();
            c1 = gp.getColor2();
        }
        else {
            c0 = Color.blue;
            c1 = Color.blue.brighter();
        }

        // as a special case, if the bar colour has alpha == 0, we draw
        // nothing.
        if (c0.getAlpha() == 0) {
            return;
        }

        if (base == RectangleEdge.TOP || base == RectangleEdge.BOTTOM) {
            Rectangle2D[] regions = splitVerticalBar(bar, this.g1, this.g2,
                    this.g3);
            GradientPaint gp = new GradientPaint((float) regions[0].getMinX(),
                    0.0f, c0, (float) regions[0].getMaxX(), 0.0f, Color.white);
            g2.setPaint(gp);
            g2.fill(regions[0]);

            gp = new GradientPaint((float) regions[1].getMinX(), 0.0f,
                    Color.white, (float) regions[1].getMaxX(), 0.0f, c0);
            g2.setPaint(gp);
            g2.fill(regions[1]);

            gp = new GradientPaint((float) regions[2].getMinX(), 0.0f, c0,
                    (float) regions[2].getMaxX(), 0.0f, c1);
            g2.setPaint(gp);
            g2.fill(regions[2]);

            gp = new GradientPaint((float) regions[3].getMinX(), 0.0f, c1,
                     (float) regions[3].getMaxX(), 0.0f, c0);
            g2.setPaint(gp);
            g2.fill(regions[3]);
            
         

            }
        else if (base == RectangleEdge.LEFT || base == RectangleEdge.RIGHT) {
            Rectangle2D[] regions = splitHorizontalBar(bar, this.g1, this.g2,
                    this.g3);
            GradientPaint gp = new GradientPaint(0.0f,
                    (float) regions[0].getMinY(), c0, 0.0f,
                    (float) regions[0].getMaxX(), Color.white);
            g2.setPaint(gp);
            g2.fill(regions[0]);

            gp = new GradientPaint(0.0f, (float) regions[1].getMinY(),
                    Color.white, 0.0f, (float) regions[1].getMaxY(), c0);
            g2.setPaint(gp);
            g2.fill(regions[1]);

            gp = new GradientPaint(0.0f, (float) regions[2].getMinY(), c0,
                    0.0f, (float) regions[2].getMaxY(), c1);
            g2.setPaint(gp);
            g2.fill(regions[2]);

            gp = new GradientPaint(0.0f, (float) regions[3].getMinY(), c1,
                     0.0f, (float) regions[3].getMaxY(), c0);
            g2.setPaint(gp);
            g2.fill(regions[3]);

        }

        // draw the outline...
        if (renderer.isDrawBarOutline()) {
            Stroke stroke = renderer.getItemOutlineStroke(row, column);
            Paint paint = renderer.getItemOutlinePaint(row, column);
            if (stroke != null && paint != null) {
                g2.setStroke(stroke);
                g2.setPaint(paint);
                g2.draw(bar);
            }
        }
	}

	private Rectangle2D[] splitVerticalBar(RectangularShape bar, double a,
			double b, double c) {
		Rectangle2D[] result = new Rectangle2D[4];
		double x0 = bar.getMinX();
		double x1 = Math.rint(x0 + (bar.getWidth() * a));
		double x2 = Math.rint(x0 + (bar.getWidth() * b));
		double x3 = Math.rint(x0 + (bar.getWidth() * c));
		result[0] = new Rectangle2D.Double(bar.getMinX(), bar.getMinY(), x1
				- x0, bar.getHeight());
		result[1] = new Rectangle2D.Double(x1, bar.getMinY(), x2 - x1, bar
				.getHeight());
		result[2] = new Rectangle2D.Double(x2, bar.getMinY(), x3 - x2, bar
				.getHeight());
		result[3] = new Rectangle2D.Double(x3, bar.getMinY(), bar.getMaxX()
				- x3, bar.getHeight());
		return result;
	}

	/**
	 * Splits a bar into subregions (elsewhere, these subregions will have
	 * different gradients applied to them).
	 * 
	 * @param bar
	 *            the bar shape.
	 * @param a
	 *            the first division.
	 * @param b
	 *            the second division.
	 * @param c
	 *            the third division.
	 * 
	 * @return An array containing four subregions.
	 */
	private Rectangle2D[] splitHorizontalBar(RectangularShape bar, double a,
			double b, double c) {
		Rectangle2D[] result = new Rectangle2D[4];
		double y0 = bar.getMinY();
		double y1 = Math.rint(y0 + (bar.getHeight() * a));
		double y2 = Math.rint(y0 + (bar.getHeight() * b));
		double y3 = Math.rint(y0 + (bar.getHeight() * c));
		result[0] = new Rectangle2D.Double(bar.getMinX(), bar.getMinY(), bar
				.getWidth(), y1 - y0);
		result[1] = new Rectangle2D.Double(bar.getMinX(), y1, bar.getWidth(),
				y2 - y1);
		result[2] = new Rectangle2D.Double(bar.getMinX(), y2, bar.getWidth(),
				y3 - y2);
		result[3] = new Rectangle2D.Double(bar.getMinX(), y3, bar.getWidth(),
				bar.getMaxY() - y3);
		return result;
	}

}

 最后利用XYBarChartDemo7,对于实现的的扩展测试如下:

import java.awt.Color;

import javax.swing.JPanel;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.SymbolAxis;
import org.jfree.chart.extend.ExtendedChartPanel;
import org.jfree.chart.extend.renderer.xy.ExtendedXYBarPainter;
import org.jfree.chart.extend.renderer.xy.ExtendedXYBarRenderer;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.extend.xy.ExtendedXYIntervalSeries;
import org.jfree.data.time.Day;
import org.jfree.data.time.RegularTimePeriod;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYIntervalSeries;
import org.jfree.data.xy.XYIntervalSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

@SuppressWarnings("serial")
public class XYBarChartDemo7 extends ApplicationFrame
{

    public XYBarChartDemo7(String s)
    {
        super(s);
        ChartPanel jpanel = (ChartPanel) createDemoPanel();
        
//        JScrollPane scroll = new JScrollPane(jpanel);
        
//        jpanel.setPreferredSize(new Dimension(2000, 1000));
        setContentPane(jpanel);

       jpanel.addChartMouseListener(new MyBarChartListener());
 
  
    }

    private static JFreeChart createChart(IntervalXYDataset intervalxydataset)
    {
        JFreeChart jfreechart = ChartFactory.createXYBarChart("XYBarChartDemo7", "Date", true, "Y", intervalxydataset, PlotOrientation.VERTICAL, true, true, false);
        jfreechart.setBackgroundPaint(Color.white);
        XYPlot xyplot = (XYPlot)jfreechart.getPlot();
        xyplot.setDomainAxis(new DateAxis("Date"));
        SymbolAxis symbolaxis = new SymbolAxis("Series", new String[] {
            "S1", "S2", "S3"
        });
        symbolaxis.setGridBandsVisible(false);
        xyplot.setRangeAxis(symbolaxis);
    
        xyplot.setBackgroundPaint(Color.lightGray);
        xyplot.setDomainGridlinePaint(Color.white);
        xyplot.setRangeGridlinePaint(Color.white);
      
        xyplot.setRenderer(new ExtendedXYBarRenderer());      
        XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();
        xybarrenderer.setUseYInterval(true);
        xybarrenderer.setShadowVisible(false);
        xybarrenderer.setBarPainter(new ExtendedXYBarPainter());
        

        return jfreechart;
    }

    private static IntervalXYDataset createDataset()
    {
        Day day = new Day(12, 6, 2007);
        Day day1 = new Day(13, 6, 2007);
        Day day2 = new Day(14, 6, 2007);
        Day day3 = new Day(15, 6, 2007);
        Day day4 = new Day(16, 6, 2007);
        Day day5 = new Day(17, 6, 2007);
        XYIntervalSeriesCollection xyintervalseriescollection = new XYIntervalSeriesCollection();
        ExtendedXYIntervalSeries xyintervalseries = new ExtendedXYIntervalSeries("S1");
        ExtendedXYIntervalSeries xyintervalseries1 = new ExtendedXYIntervalSeries("S2");
        ExtendedXYIntervalSeries xyintervalseries2 = new ExtendedXYIntervalSeries("S3");
        addItem(xyintervalseries, day, day1, 0);
        xyintervalseries.add(day.getFirstMillisecond(), day.getFirstMillisecond(), day3.getLastMillisecond(), 0, -0.45, -0.35,Color.green);
       
        addItem(xyintervalseries, day3, day3, 0);
        addItem(xyintervalseries1, day, day5, 1);
        addItem(xyintervalseries2, day2, day4, 2);
        xyintervalseriescollection.addSeries(xyintervalseries);
        xyintervalseriescollection.addSeries(xyintervalseries1);
        xyintervalseriescollection.addSeries(xyintervalseries2);
        return xyintervalseriescollection;
    }

    public static void addItem(XYIntervalSeries xyintervalseries, RegularTimePeriod regulartimeperiod, RegularTimePeriod regulartimeperiod1, int i)
    {
        xyintervalseries.add(regulartimeperiod.getFirstMillisecond(), regulartimeperiod.getFirstMillisecond(), regulartimeperiod1.getLastMillisecond(), i, (double)i - 0.10000000000000001D, (double)i + 0.45000000000000001D);
    }

    public static JPanel createDemoPanel()
    {
        return new ExtendedChartPanel(createChart(createDataset()));
    }

    public static void main(String args[])
    {
 /*   	
        JFreeChart chart = createChart(createDataset());
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setSize(600, 300);
        shell.setLayout(new FillLayout());
        shell.setText("Test for jfreechart running with SWT");
        ChartComposite frame = new ChartComposite(shell, SWT.NONE, chart,
                true);
//        frame.pack();
        frame.setHorizontalAxisTrace(true);
        frame.setVerticalAxisTrace(true);
        frame.addChartMouseListener(new MyBarChartListener());
       
        
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
*/

        XYBarChartDemo7 xybarchartdemo7 = new XYBarChartDemo7("JFreeChart : XYBarChartDemo7.java");
  
        xybarchartdemo7.pack();
        RefineryUtilities.centerFrameOnScreen(xybarchartdemo7);
        xybarchartdemo7.setVisible(true);
  
    	}
}

 会看到,利用

     xyintervalseries.add(day.getFirstMillisecond(), day.getFirstMillisecond(), day3.getLastMillisecond(), 0, -0.45, -0.35,Color.green);
  

 设置的bar的颜色会按照不同的设置进行变化了。 

 

JFreeChart图表库实践指南 本文还有配套的精品资源,点击获取 简介:JFreeChart是一个开源Java库,用于创建多种图表,如柱状图、饼图等,广泛应用于数据可视化和报告制作。本文深入解析了JFreeChart的安装、创建图表、定制和绘制等核心操作,同时提供了入门到进阶的使用示例,帮助开发者快速掌握图表制作技巧。 1. JFreeChart基础操作指南 1.1 JFreeChart简... 阅读详情

相关推荐

基于继电器与三极管的自动水泵控制器DIY:从电路原理到PCB制作实战

继电器作为一种利用电磁原理实现电路通断控制的电气开关,其核心价值在于通过小电流信号控制大电流负载,实现强弱电之间的安全隔离。在自动化控制领域,继电器常与三极管等半导体器件配合,构成驱动电路,将微弱的传感器信号放大,从而可靠地控制电机、水泵等执行机构。这种组合技术广泛应用于工业控制、智能家居及各类电子DIY项目中,例如实现水箱水位的自动检测与控制。本文将以一个典型的自动水泵控制器项目为例,深入剖析如何利用继电器与三极管搭建水位检测与驱动电路,并详细讲解从电路设计、PCB自制(热转印法)到系统调试的完整工程实践

weixin_31774841的博客 347

JAVA报表开发JasperReport+iReport5.6详解

课程包含从基础的环境搭建,到控件的详细使用和对ireport难点进行重点讲解,一共21个小节。难点包含:条件stylesCrosstab交叉表格报表分组和统计Subreport子报表(参数传递,子报表返回值)chart图表类所有控件jasperreport导出word,excel,pdf多数据源报表JSP中显示jasperreport报表等

东方财富网 数据访问接口及字段说明

东方财富网 数据访问接口和字段说明

雨中山草 2万+

JFreeChart| 图解JFreeChart中的条形图/柱状图(BarChart)

前言 条形图样式展示,其他基于CategoryPlot类型的LineChart等等于该设置类似. 数据集 本文所使用的数据集. private static CategoryDataset createDataset() { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); ...

YvesHe的专栏 7859

分布式推理服务(策略:数据并行、张量并行、流水线并行、专家并行)技术分析

摘要:分布式推理突破单GPU内存和算力限制,支持大模型部署。四种核心策略包括: 数据并行:复制模型拆分数据,提升吞吐但内存效率低; 流水线并行:模型分阶段执行,支持超大模型但存在计算气泡; 张量并行:拆分层内矩阵运算,延迟低但通信开销大; 专家并行:动态激活MoE模型专家,计算高效但路由复杂。实际应用中常组合策略(如3D并行),需权衡模型规模、硬件条件与性能目标。

技术引领业务创新 943

人工智能顶会投稿指南:CCF-A类会议ACL、ICML、NeurIPS、ICLR的投稿周期与影响力解析

本文详细解析了CCF-A类会议ACL、ICML、NeurIPS、ICLR的投稿周期与影响力,涵盖各会议的投稿时间线、评审特点及录用率。ACL注重自然语言处理,ICML强调机器学习理论,NeurIPS覆盖神经信息处理,ICLR聚焦表征学习。文章还提供了实战投稿策略,帮助研究者提升投稿成功率。

weixin_29211309的博客 3343

java barchart_java – JFreeChart – XYBarChart显示每个系列的单独栏

我正在使用JFreeChart创建一个XYBarChart并向其添加多个系列.目前,对于给定的x值和来自该系列的不同Y值,它们全部堆叠在彼此之上.是否可以将每个系列显示为给定x值的不同栏?编辑:我发布了我的代码的相关部分,用于创建图表供您参考.请注意,我无法使用CategoryDataset,因为这不会在域轴上提供缩放功能.这是我实施的基本要求.XYSeriesCollection interva...

weixin_28882149的博客 302

【创作赢红包】Gurobi学术版证书更新与Python环境配置全攻略

本文详细解析了Gurobi学术版证书过期后的完整更新流程与Python环境配置方法。从彻底清理旧版残留、手把手注册获取新许可证,到软件安装、证书激活,最后重点讲解如何将gurobipy接口正确配置到Python的site-packages目录,并提供了常见问题排查方案,帮助用户高效解决证书与配置难题。

efc1234567的博客 612

JFreeChart详解——各类的简单介绍(一)

好多项目中都有JFreeChart 的使用,查阅资料和结合实际使用这里做一个总结,和详解。 简单介绍: JFreeChart是一个免费创建图片的java工具. 目前是最好的 java 图形解决方案,基本能够解决目前的图形方面的需求,主要包括如下几个方面: pie charts (2D and 3D):饼图(平面和立体) bar charts (regular and stacked, wi

敬业小码哥的博客 4189

基于STM32+OneNet设计的物联网智慧路灯(100)

本次设计的智能路灯采用STM32芯片和OneNet物联网平台进行连接,开发出支持太阳能充电锂电池供电、GPS定位上传位置信息、手动/自动控制路灯开关、环境光照调节、红外传感器检测周围人员、空气质量监测等多项功能。同时,当路灯发生异常情况时,系统可以自动发送邮件或短信到指定邮箱或电话。

7725

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

将该路径修改到config/semanticktti.yaml文件中的data_path节点下。下载semanticKITTI数据集的点云数据和标签,解压到一起。系统:Ubuntu18。

zhaoguanhua的博客 2596

java jfreechart bar显示每个柱的数值_Java中你不知道的5个隐藏秘密

随着编程语言的发展,不可避免地会出现隐藏功能,而创始人从未打算使用的构造开始逐渐普及。这些功能中的一些功能成语,成为语言的公认用语,而其他功能则成为反模式,并降级到语言社区的黑暗角落。在本文中,我们将研究五个Java秘密,这些秘密通常被大量Java开发人员忽略(有些理由很充分)。对于每个描述,我们将研究使每个功能都存在的用例和基本原理,并查看一些适合使用这些功能的示例。读者应注意,并非所有这些功能...

weixin_39667509的博客 176

代码解读:使用Stable Diffusion完成相似图像生成任务

作为内容生产重要的一部分,生成相似图像是一项有意义的工作,例如很多内容创作分享平台单纯依赖用户贡献的图片已经不够了,最省力的方法就是利用已有的图片生成相似的图片作为补充。这篇博客详细解读基于Stable Diffusion生成相似图片的原理和代码。

沉迷单车的追风少年 1393

Rome 检查规则 noDuplicateParameters 深度解析:如何杜绝函数重复参数名

`noDuplicateParameters` 是 Rome(本项目即 Rome 统一开发者工具链的源码仓库)内置的一条**推荐启用(recommended)**的 lint 规则,自 v0.9.0 起提供,用于禁止在函数定义中声明重复的参数名。本文以 [website/src/pages/lint/rules/noDuplicateParameters.md](https://link.gitc

gitblog_00866的博客 869

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

告别手工报表:DBeaver图表可视化从零到一高效指南

数据库查完SQL,结果永远是干巴巴的行列网格,汇报前还得手工复制到Excel再插图表,这种日子你过够了没有?作为免费开源的通用数据库客户端,DBeaver内置了开箱即用的数据可视化图表能力——不用装插件、不用导出数据,在查询结果上点几下就能生成柱状图、折线图、饼图等图表。读完本文,你将掌握从"一条SQL"到"一张可交付图表"的完整路径、每种图表类型的选型依据,以及让图表不翻车的配置技巧。 ##

gitblog_00228的博客 866

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

DBeaver自定义图表组件开发实战:三步把第三方可视化库接入数据库工作台

"这个季度的销售数据,能不能在数据库工具里直接画一张桑基图?"面对这样的需求,很多开发者第一反应是导出数据、写脚本、再丢进 BI 工具,一顿操作下来半天就没了。作为号称"免费通用数据库工具与 SQL 客户端"的 DBeaver,其内置图表其实只覆盖了折线图、柱状图等基础形态,热力图、桑基图这类高级图表确实缺席。好消息是,DBeaver 基于 OSGi 插件架构,扩展图表能力就像给乐高积木换一块零件

gitblog_00616的博客 987

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

JfreeChart实现柱状图的每根柱子颜色不同

前段时间项目中遇到过这种情况,在此通过两种方式实现了每根柱子颜色不同。            第一种方式:参照了http://blog.youkuaiyun.com/peterwanghao/article/details/7055967提供的方法。这里就不在献丑了,但是这种方式在使用的时候会遇到一种情况,就是柱状图的label不太好控制,和柱子对不上。如图一。            第二种方式:修改 o

xufan007的专栏 4846

jfreechart 实现单组柱子不同颜色

今天要用jfreechart做一个小东东,郁闷的是单组柱状图的颜色改不了,都是一色的红色, 最终还是让俺找到了高人,csdn就是好。写下来以备后患。 让单组柱子显示不同的颜色的办法: 1. 写个类CustomRenderer继承BarRenderer3D再重写方法 2. 然后修改BarRenderer3D renderer = new BarRenderer3D(); 为下

kebo1006的专栏 830

jFreeChart 详细属性总结

柱图:JFreeChart chart = ChartFactory.createBarChart3D( "XXX统计图", //图表名称 "类型", //目录轴的显示标签(X轴标题) "数据额",...

it_lihongmin的博客 9711

Jfreechart柱形图详细设置

一. 下载与环境配置  此最新版本为 1.0.13  解压jfreechart-1.0.13.zip 将lib目录下的jfreechart-1.0.13.jar 、jcommon-1.0.16.jar 复制到工程 WEB-INF\lib 文件夹中  二. 配置  我是用Struts1.2开发的。  在工程的web.xml 文件中添加                DisplayCha

u013456370的专栏 4160

JFreeChart| 图表高级自定义-图表条目标签(CategoryItemLabelGenerator)

前言 对于大多数的图表类型来说,JFreeChart允许我们在图表的每个条目上、 或者内部、 或者附 近显示条目标签。 本文主要讲述: ● 如何让条目标签可视(仅限于支持条目标签的图表类型) ● 如何改变条目标签的外观(字体和颜色) ● 如何指定条目标签的位置 ● 如何定制条目标签的文本 已知的局限性 ● 一些renderer不支持条目标签 ● 轴范围...

YvesHe的专栏 4100

(4)Jfreechart之IntervalBarChart(显示差值的图表)

(4)Jfreechart之IntervalBarChart(显示差值的图表)IntervalBarChart 是柱状图的一种形式,是显示数据的最高值和最低值以及差值的图表,如下图 具体实现:import java.awt.Color; import java.awt.Font; import java.text.DecimalFormat;import org.jfree.chart.C

Alitownlet的专栏 1960

series.label给每一项单独设置自定义颜色

series.label给每一项单独设置自定义颜色

Koreyoshi123654的博客 1214

JFreeChart 实现各种数据统计图(柱形图,饼状图,折线图)

最近在做数据挖掘相关的工作,需要将数据分析的

Ricky 7766

(3)Jfreechart柱状图自定义柱子颜色以及柱子的方向

**1、(显示效果)** 2、自定义柱子颜色新建CustomRender 继承org.jfree.chart.renderer.category.BarRenderer通过重写getItemPaint(int i,int j)方法实现重绘柱子,以下是具体实现 import java.awt.Color; import java.awt.Paint; import java.util.List

Alitownlet的专栏 8516

JFreeChart柱状图单组柱子的不同颜色显示

JFreeChart柱状图中单组柱子用不同颜色来显示的实现方法是自定义一个Renderer来继承BarRenderer类,然后重载getItemPaint(int i,int j)方法。 实现效果如下: 实现代码如下: [html] view plaincopy public class CustomRenderer exte

qinshang007的专栏 1478
上一篇: jfreechart 对于鼠标事件响应的扩展
下一篇: swt和awt之间的互调
tkxing
博客等级 码龄19年 1粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值