如何让条形图中的条形从java中的x轴开始?

时间:2016-05-01 00:39:46

标签: java eclipse swing awt bar-chart

enter image description here

如图所示,图表中的条形图从x轴下方开始。如何修复它以便从x轴线开始?请建议我修复,我也会帮助知道我哪里出错了。

    private int PAD = 20;
private int LPAD = 35;
private int DPAD = 25;
Graphics2D g2 = (Graphics2D) g;

        g2.setColor(Color.BLACK);

        String DataString[] = dataset.split(", ");

        double DataArray[] = new double[DataString.length];

        double MaxValue = 0;
        int w = getWidth();
        int h = getHeight();

        for (int i = 0; i < DataString.length; i = i + 1) {

            try {

                double out = Double.parseDouble(DataString[i]);

                DataArray[i] = out;

                if (out > MaxValue) {

                    MaxValue = out;

                }


            } catch (NumberFormatException e) {

            }

        }

        double xScale = (w - 1 * (PAD + LPAD)) / (DataArray.length) - 1;
        double yScale = (h - 3 * DPAD) / MaxValue;
        // The initial x,y (0).
        int x0 = LPAD;

        try {
            if (DataArray.length > 1) {

                // Draw Graph
                g2.drawLine(PAD + LPAD, PAD, PAD + LPAD, h - (PAD + LPAD));
                g2.drawLine(PAD + LPAD, h - PAD - LPAD, x0 + (int) (DataArray.length * xScale), h - (PAD + LPAD));
                Color cd = new Color(135, 90, 185);
                g2.setPaint(cd);
                g2.drawString(title, w / 4, padding - 15);
                g2.drawString(xAxis, w / 2 - padding, h - (padding - 10));
                g2.rotate(Math.toRadians(270));
                g2.drawString(yAxis, -(h / 2 + padding) - LPAD, PAD - 5);
                g2.rotate(-Math.toRadians(270));

                g2.setPaint(Color.BLACK);
                double intin = Double.parseDouble(interval);
                double sin = Double.parseDouble(start);

                for (int j = 0; j < DataArray.length; j++) {

                    int x1 = x0 + (int) (j * xScale) + PAD;
                    double y1 = (int) ((MaxValue - DataArray[j]) * yScale + PAD) - 2;
                    // g2.drawLine(x1-3, (int) y1-3, x1+3, (int) y1+3);
                    // g2.drawLine(x1-3,(int) y1+3,x1+3,(int) y1-3);

                    // g2.drawLine(x1, h - (PAD + LPAD), x1, h - (PAD +
                    // LPAD)+5);

                    double intout = (sin + (intin * j));
                    String interval = String.valueOf(intout);

                    g2.drawString(interval, x1, h - LPAD);
                }

                for (int i = 0; i < 9; i++) {
                    int x3 = PAD + LPAD;
                    int x1 = x3 - 5;
                    int y0 = (h - (PAD)) - (((i + 1) * (h - PAD * 3)) / 10 + DPAD) - 2;
                    int y3 = y0;
                    g2.drawLine(x3, y0, x1, y3);
                }

                // g2.drawLine(PAD + LPAD, h - (PAD + LPAD), PAD + LPAD - 5,
                // h - (PAD + LPAD));
                g2.drawLine(PAD + LPAD, PAD, PAD + LPAD - 5, PAD);
                g2.drawString(start, LPAD - 20, h - (LPAD) - 20);

                Long L = Math.round(MaxValue);
                int MVi = Integer.valueOf(L.intValue());
                String MVstring = String.valueOf(MVi);
                int MVmid = MVi / 2;
                String MVmidstring = String.valueOf(MVmid);

                g2.drawString(MVmidstring, PAD, (h - PAD) / 2);
                g2.drawString(MVstring, PAD, PAD);



                g2.setColor(Color.red);
                for (int j = 0; j < DataArray.length; j++) {

                    int x1 = x0 + (int) (j * xScale) + PAD;
                    double y1 = (int) ((MaxValue - DataArray[j]) * yScale + PAD) - 2;
                    g2.fillRect(x1 + 2, (int) y1 + 1 , w - (PAD * 42), h);

                }

            }
        } catch (Exception e) {

        }
    }
    repaint();

}

1 个答案:

答案 0 :(得分:2)

  

你通常如何在x轴上放置一个条形?

条形码fillRect()参数应为lefttopwidthheight。只关注垂直尺寸和位置,如here所示,您可以使用以下比例将条形高度缩放到绘图区域高度:

barHeightInPixels : plotHeightInPixels :: value : maxDataValue

解决barHeightInPixels

panelHeightInPixels = panel.getHeight();
plotHeightInPixels  = panelHeightInPixels - axisOffset;
barHeightInPixels   = value * plotHeightInPixels / maxDataValue;

现在使用缩放高度:

g2.fillRect(
    barCenter - (barWidth / 2),                           //left
    panelHeightInPixels - barHeightInPixels - axisOffset, //top
    barWidth,                                             //width
    barHeightInPixels);                                   //height

image

要查看其他功能的实施方式,请按照此answer中的建议研究图表库提供的代码,以解决有关此主题的上一个问题。