在java中,如何从x轴开始获取条形图中的条形图?

在java中,如何从x轴开始获取条形图中的条形图?,java,eclipse,swing,awt,bar-chart,Java,Eclipse,Swing,Awt,Bar Chart,如图所示,图表中的条形图从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(",

如图所示,图表中的条形图从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();

}
private int PAD=20;
私有intlpad=35;
私有int-DPAD=25;
图形2d g2=(图形2d)g;
g2.设置颜色(颜色为黑色);
字符串DataString[]=dataset.split(“,”);
double DataArray[]=新的双精度[DataString.length];
双最大值=0;
int w=getWidth();
inth=getHeight();
对于(int i=0;i最大值){
最大值=输出;
}
}捕获(数字格式){
}
}
双xScale=(w-1*(PAD+LPAD))/(DataArray.length)-1;
双Y刻度=(h-3*DPAD)/MaxValue;
//初始x,y(0)。
int x0=LPAD;
试一试{
如果(DataArray.length>1){
//作图
g2.拉线(PAD+LPAD,PAD,PAD+LPAD,h-(PAD+LPAD));
g2.绘制线(PAD+LPAD,h-PAD-LPAD,x0+(int)(DataArray.length*xScale),h-(PAD+LPAD));
颜色cd=新颜色(135、90、185);
g2.setPaint(cd);
g2.抽绳(标题,带4,填充-15);
g2.拉丝(xAxis,w/2-填充,h-(填充-10));
g2.旋转(数学托拉迪安(270));
g2.抽绳(yAxis,-(h/2+衬垫)-LPAD,衬垫-5);
g2.旋转(-Math.toRadians(270));
g2.setPaint(颜色为黑色);
double intin=double.parseDouble(间隔);
double sin=double.parseDouble(开始);
对于(int j=0;j
通常如何在x轴上定位杆

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

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


要了解其他功能是如何实现的,请研究图表库提供的代码,正如本节对您之前关于此主题的问题所建议的那样。

您在过去48小时内没有问过同样的问题吗?我似乎记得我曾经给过这样的建议:为了更快地获得更好的帮助,发布一个or。使用逻辑一致的缩进代码行和代码块的形式。缩进的目的是使代码的流程更易于遵循!我只是想知道酒吧的位置。您通常如何在x轴上定位条形图?
如何将其固定,使其从x轴线开始。
-您使用基本数学。我们不知道你的变量是什么意思,所以你需要自己计算。您需要知道“X轴”线的“y偏移”值。然后你需要知道酒吧的高度。然后,不要在“X轴”线下方绘制矩形,而要在上面绘制矩形,因此“y值”等于“X轴”y偏移量减去条的高度。“这一次……”不要把你的个人经验误认为我通常与人交流的方式。你很特别(通过你自己的行动)。谢谢你,先生。你能分享一下fillRect的代码吗?因为我很难理解没有值的变量;如果您的片段来自
paintComponent()
的实现,请不要递归调用
repaint()
。非常感谢,先生。至少有人在提供有意义的答案:)另请参阅此相关的…………甜蜜!