Java 如何绘制简单的GUI直方图

Java 如何绘制简单的GUI直方图,java,project,histogram,Java,Project,Histogram,我需要为我正在进行的一个项目画一个简单的柱状图,需要看看这个 我知道在我的H[]数组上必须有一些简单的for循环,该数组由属于每个灰度值的多少像素组成。。。所以在H[]中,我们假设“灰度值为1的10个像素”,所以在1处,在我的图像旁边会有一条长度为10的直线垂直移动 如果有人能提供帮助,我将不胜感激 谢谢 写了这个,但它太大了,颠倒了,因为某种原因成了一个角度 if (H != null) { int width = getWidth(

我需要为我正在进行的一个项目画一个简单的柱状图,需要看看这个

我知道在我的H[]数组上必须有一些简单的for循环,该数组由属于每个灰度值的多少像素组成。。。所以在H[]中,我们假设“灰度值为1的10个像素”,所以在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]);


                   }
if(H!=null){
int width=getWidth();
int height=getHeight();
int HhPos=(宽度-(宽度/2));
int HvPos=(高度-(高度));

对于(int i=0;i您正在绘制具有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
drawLine
drawRect
方法在柱状图中绘制直线或条形图。请记住,Java Graphics中的Y维度向下,而不是像历史图中那样向上。在绘制时,您必须考虑到这一点。

正如Gilbert所说,您需要规范化您可以使用这些值来确定最大范围或上限

然后,您可以由此确定给定值相对于最大值的百分比,然后根据可用高度将其绘制在图形上

(摘自)

在上一个示例中,我使用了
映射
来存储值,但是用数据数组替换它应该相对容易一些

for(整型键:mapHistory.keySet())
将成为
for(整型键:H)


另外,使用
Graphics.drawLine
,它是从一个点到另一个点绘制一条线,而不是从一个点到一个宽度/高度值(比如说
Graphics.drawletrick

您应该尝试使用一个库来绘制这种类型的图表。对于Java桌面来说,这是一个很好的方法(这是您的情况吗?)是的。我宁愿使用for循环来遍历我的数组,我不熟悉JFreeChart。我写了这个,但是它太大了,你看不到整个东西……加上它的颠倒。(上面的代码在编辑的OP中)谢谢,这很有帮助…当我加载新图像时,如何清除直方图?nvm我得到了它,但现在图形太宽,无法放入窗口:(是的,最终会发生这种情况。你只能将条设置得很宽。你可以使用与宽度计算高度相同的技术。你知道区域有多宽,你知道你有多少条条。例如宽度/条数,确保允许值小于0
// 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;
}