java中draw3dcolumn_stackedbarrenderer3d.java 源代码在线查看 - JFreeChart它主要是用来制作各种各样的图表 资源下载 虫虫电子下载站...

* in the given dataset, plus the supplied base value. * * @param dataset the dataset (null not permitted). * @param category the category key (null not permitted). * @param base the base value. * @param asPercentages a flag that controls whether the values in the * list are converted to percentages of the total. * * @return The value list. * * @since 1.0.4 */ protected static List createStackedValueList(CategoryDataset dataset, Comparable category, double base, boolean asPercentages) { List result = new ArrayList(); double posBase = base; double negBase = base; double total = 0.0; if (asPercentages) { total = DataUtilities.calculateColumnTotal(dataset, dataset.getColumnIndex(category)); } int baseIndex = -1; int seriesCount = dataset.getRowCount(); for (int s = 0; s < seriesCount; s++) { Number n = dataset.getValue(dataset.getRowKey(s), category); if (n == null) { continue; } double v = n.doubleValue(); if (asPercentages) { v = v / total; } if (v >= 0.0) { if (baseIndex < 0) { result.add(new Object[] {null, new Double(base)}); baseIndex = 0; } posBase = posBase + v; result.add(new Object[] {new Integer(s), new Double(posBase)}); } else if (v < 0.0) { if (baseIndex < 0) { result.add(new Object[] {null, new Double(base)}); baseIndex = 0; } negBase = negBase + v; // '+' because v is negative result.add(0, new Object[] {new Integer(-s - 1), new Double(negBase)}); baseIndex++; } } return result; } /** * Draws the visual representation of one data item from the chart (in * fact, this method does nothing until it reaches the last item for each * category, at which point it draws all the items for that category). * * @param g2 the graphics device. * @param state the renderer state. * @param dataArea the plot area. * @param plot the plot. * @param domainAxis the domain (category) axis. * @param rangeAxis the range (value) axis. * @param dataset the data. * @param row the row index (zero-based). * @param column the column index (zero-based). * @param pass the pass index. */ public void drawItem(Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset, int row, int column, int pass) { // wait till we are at the last item for the row then draw the // whole stack at once if (row < dataset.getRowCount() - 1) { return; } Comparable category = dataset.getColumnKey(column); List values = createStackedValueList(dataset, dataset.getColumnKey(column), getBase(), this.renderAsPercentages); Rectangle2D adjusted = new Rectangle2D.Double(dataArea.getX(), dataArea.getY() + getYOffset(), dataArea.getWidth() - getXOffset(), dataArea.getHeight() - getYOffset()); PlotOrientation orientation = plot.getOrientation(); // handle rendering separately for the two plot orientations... if (orientation == PlotOrientation.HORIZONTAL) { drawStackHorizontal(values, category, g2, state, adjusted, plot, domainAxis, rangeAxis, dataset); } else { drawStackVertical(values, category, g2, state, adjusted, plot, domainAxis, rangeAxis, dataset); } } /** * Draws a stack of bars for one category, with a horizontal orientation. * * @param values the value list. * @param category the category. * @param g2 the graphics device. * @param state the state. * @param dataArea the data area (adjusted for the 3D effect). * @param plot the plot. * @param domainAxis the domain axis. * @param rangeAxis the range axis. * @param dataset the dataset. * * @since 1.0.4 */ protected void drawStackHorizontal(List values, Comparable category, Graphics2D g2, CategoryItemRendererState state, Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis, ValueAxis rangeAxis, CategoryDataset dataset) { int column = dataset.getColumnIndex(category); double barX0 = domainAxis.getCategoryMiddle(column, dataset.getColumnCount(), dataArea, plot.getDomainAxisEdge()) - state.getBarWidth() / 2.0; double barW = state.getBarWidth(); // a list to store the series index and bar region, so we can draw // all the labels at the end... List itemLabelList = new ArrayList(); // draw the blocks boolean inverted = rangeAxis.isInverted(); int blockCount = values.size() - 1; for (int k = 0; k < blockCount; k++) { int index = (inverted ? blockCount - k - 1 : k); Object[] prev = (Object[]) values.get(index); Object[] curr = (Object[]) values.get(index + 1); int series = 0; if (curr[0] == null) { series = -((Integer) prev[0]).intValue() - 1; } else { series = ((Integer) curr[0]).intValue(); if (series < 0) { series = -((Integer) prev[0]).intValue() - 1; } } double v0 = ((Double) prev[1]).doubleValue(); double vv0 = rangeAxis.valueToJava2D(v0, dataArea, plot.getRangeAxisEdge()); double v1 = ((Double) curr[1]).doubleValue(); double vv1 = rangeAxis.valueToJava2D(v1, dataArea, plot.getRangeAxisEdge()); Shape[] faces = createHorizontalBlock(barX0, barW, vv0, vv1, inverted); Paint fillPaint = getItemPaint(series, column); Paint fillPaintDark = fillPaint; if (fillPaintDark instanceof Color) { fillPaintDark = ((Color) fillPaint).darker(); } boolean drawOutlines = isDrawBarOutline(); Paint outlinePaint = fillPaint; if (drawOutlines) { outlinePaint = getItemOutlinePaint(series, column); g2.setStroke(getItemOutlineStroke(series, column)); } for (int f = 0; f < 6; f++) { if (f == 5) { g2.setPaint(fillPaint); } else { g2.setPaint(fillPaintDark); } g2.fill(faces[f]); if (drawOutlines) { g2.setPaint(outlinePaint); g2.draw(faces[f]); } } itemLabelList.add(new Object[] {new Integer(series), faces[5].getBounds2D(), BooleanUtilities.valueOf(v0 < getBase())}); // add an item entity, if this information is being collected EntityCollection entities = state.getEntityCollection(); if (entities != null) { addItemEntity(entities, dataset, series, column, faces[5]); } } for (int i = 0; i < itemLabelList.size(); i++) { Object[] record = (Object[]) itemLabelList.get(i); int series = ((Integer) record[0]).intValue(); Rectangle2D bar = (Rectangle2D) record[1]; boolean neg = ((Boolean) record[2]).booleanValue(); CategoryItemLabelGenerator generator = getItemLabelGenerator(series, column); if (generator != null && isItemLabelVisible(series, column)) { drawItemLabel(g2, dataset, series, column, plot, generator, bar, neg); } } } /** * Creates an array of shapes representing the six sides of a block in a * horizontal stack. * * @param x0 left edge of bar (in Java2D space). * @param width the width of the bar (in Java2D units). * @param y0 the base of the block (in Java2D space). * @param y1 the top of the block (in Java2D space). * @param inverted a flag indicating whether or not the block is inverted * (this changes the order of the faces of the block). * * @return The sides of the block. */ private Shape[] createHorizontalBlock(double x0, double width, double y0, double y1, boolean inverted) { Shape[] result = new Shape[6]; Point2D p00 = new Point2D.Double(y0, x0); Point2D p01 = new Point2D.Double(y0, x0 + width); Point2D p02 = new Point2D.Double(p01.getX() + getXOffset(), p01.getY() - getYOffset()); Point2D p03 = new Point2D.Double(p00.getX() + getXOffset(), p00.getY() - getYOffset()); Point2D p0 = new Point2D.Double(y1, x0); Point2D p1 = new Point2D.Double(y1, x0 + width); Point2D p2 = new Point2D.Double(p1.getX() + getXOffset(), p1.getY() - getYOffset()); Point2D p3 = new Point2D.Double(p0.getX() + getXOffset(), p0.getY() - getYOffset()); GeneralPath bottom = new GeneralPath(); bottom.moveTo((float) p1.getX(), (float) p1.getY()); bottom.lineTo((float) p01.getX(), (float) p01.getY()); bottom.lineTo((float) p02.getX(), (float) p02.getY()); bottom.lineTo((float) p2.getX(), (float) p2.getY()); bottom.closePath(); GeneralPath top = new GeneralPath(); top.moveTo((float) p0.getX(), (float) p0.getY()); top.lineTo((float) p00.getX(), (float) p00.getY()); top.lineTo((float) p03.getX(), (float) p03.getY()); top.lineTo((float) p3.getX(), (float) p3.getY());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值