如何绘制简单的GUI直方图

时间:2012-09-21 18:05:47

标签: java project histogram

我需要为我正在处理的项目绘制一个简单的直方图,需要看看这个......

Histogram

我知道在我的H []数组上运行一些简单的for循环,其中包含多少像素属于每个灰度值......所以在H []中我们可以说“10像素in灰度值1“所以在1处,我的图像旁边会有一条长度为10的线...

如果有人能提供帮助,我将非常感激!

感谢。

写了这篇文章,但它太大而且颠倒了,并且出于某种原因而倾斜。

         if (H != null) {
                    int width = getWidth();
                    int height = getHeight();           
                    int HhPos = (width - (width/2));
                    int HvPos = (height - (height));
                  for(int i = 0 ; i <255 ; i++){
                     g.drawRect(i+HhPos, i+HvPos, 1, H[i]);


                   }

2 个答案:

答案 0 :(得分:0)

您正在绘制具有x和y值的点。您正在绘制具有宽度和高度(以像素为单位)的直方图。

例如,假设您的直方图宽度为500像素,高度为300像素。

您浏览数据点一次,查找最小x,最小y,最大x和最大y。

假设我们正在绘制Y点(X轴是宽度),则从最大x中减去最小x。将500像素(宽度)除以差值,得到每x值的像素数。此数字可以大于1,因此每x值有多个像素。此数字可以小于1,因此您拥有的数据值多于像素数。

width pixels per value = width of histogram in pixels / difference in X points

您对Y轴执行相同操作。计算每y值的像素。

height pixels per value = height of histogram in pixels / difference in y points

现在,您再次浏览数据点。对于每个数据点,您可以根据数据点的x和y值计算宽度和高度(以像素为单位)。您可以使用宽度和高度的每个值的像素数进行转换。

width = x value * width pixels per value

height = y value * height pixels per value

您使用Java Graphics drawLinedrawRect方法在直方图中绘制直线或条形图。请记住,Java图形中的Y维度会下降,而不是像组织图中那样向上。在绘画时你必须考虑到这一点。

答案 1 :(得分:0)

正如吉尔伯特所说,你需要对你的值进行标准化,以确定最大范围或上限。

然后,您可以根据可用高度确定给定值与最大值的百分比,然后将其绘制在图表上。

(取自previous answer to this question

// Determine the maximum vertical value...
int maxValue = 0;

for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    maxValue = Math.max(maxValue, value);
}

int xPos = xOffset;

for (Integer key : mapHistory.keySet()) {
    int value = mapHistory.get(key);
    // Calculate the percentage that the given value uses compared to that of the
    // maximum value
    float percentage = (float)value / (float)maxValue;
    // Calculate the line height based on the available vertical space...
    int barHeight = Math.round(percentage * height);
    g2d.setColor(new Color(key, key, key));

    int yPos = height + yOffset - barHeight;
    Rectangle2D bar = new Rectangle2D.Float(xPos, yPos, barWidth, barHeight);

    g2d.fill(bar);
    g2d.setColor(Color.DARK_GRAY);
    g2d.draw(bar);

    xPos += barWidth;
}

现在在上一个示例中,我使用Map来存储值,但它应该相对容易地用数据数组替换它......

for (Integer key : mapHistory.keySet())将成为for (int key : H)

此外,对于Graphics.drawLine,它会从一个点到另一个点绘制一条线,而不是一个点到宽度/高度值(比如说Graphics.drawRectangle