我需要为我正在处理的项目绘制一个简单的直方图,需要看看这个......
我知道在我的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]);
}
答案 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
drawLine
或drawRect
方法在直方图中绘制直线或条形图。请记住,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
)